社区导航

 
查看: 1187|回复: 0

[资料分享] UCOS移植到MSP430过程与心得体会《5》

[复制链接]

3360

TA的帖子

421

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2013-11-29 19:33:04 | 显示全部楼层 |阅读模式



上面的: WDTCTL = WDT_MDLY_32;                 //设置时钟节拍间隔为32ms
         IE1    |= 0x01;
         作用: 廷时32ms

     OSTimeDly(1);     取1 LED显示很快.只看见每个都是亮的.
     OSTimeDly(10);    取10 LED显示可看见每个执行的过程.

(1)请问 OSTimeDly(10);    WDTCTL = WDT_MDLY_32;     //设置时钟节拍间隔为32ms
      IE1    |= 0x01;      一起的作用及执行过程.


(2)STimeDly(10);    的 #define OS_TICKS_PER_SEC     对于8M 及16M主频 如何取值. 有不有什么规则?


(3)请问 OSTimeDly(10);    WDTCTL = WDT_MDLY_32; //设置时钟节拍间隔为32ms
         IE1    |= 0x01;      要廷时1秒.    对于8M主频 #define OS_TICKS_PER_SEC    如何取值.

答(1): WDTCTL = WDT_MDLY_32;    IE1    |= 0x01;    32ms的廷时产生标志位MSP430在判断标志位后 OSTimeDly()产生切换条件. 在满足OSTimeDly()内值的条件后.任务从挂起状态转化为就绪状态..
以上两个图是配制UCOS操作系统的基本情况.添加文件一个个来.看显示项的错误说明.

以上是STACK区配制太小. 出再的问题.但能正常运行. 将STACK改成512 或300 却不能正常显示...

                                       /* --------------------- TASK STACK SIZE ---------------------- */
#define OS_TASK_TMR_STK_SIZE     180     /* Timer       task stack size (# of OS_STK wide entries)         */
#define OS_TASK_STAT_STK_SIZE    180     /* Statistics task stack size (# of OS_STK wide entries)         */
#define OS_TASK_IDLE_STK_SIZE    180     /* Idle        task stack size (# of OS_STK wide entries)         */


其中OS_TASK_TMR_STK_SIZE     OS_TASK_STAT_STK_SIZE       OS_TASK_IDLE_STK_SIZE    不能大于STACK 大于则出现隐匿错误.. 里面一定存在比例关系...


2.52及以上版本 分别如下:
/* ----------------------- EVENT FLAGS ------------------------ */    2.52
#define OS_FLAG_EN                   1     /* Enable (1) or Disable (0) code generation fo
#define OS_FLAG_WAIT_CLR_EN        1     /* Include code for Wait on Clear EVENT
#define OS_FLAG_ACCEPT_EN          1     /*      Include code for OSFlagAccept()                           
#define OS_FLAG_DEL_EN              1     /*      Include code for OSFlagDel()                              
#define OS_FLAG_QUERY_EN           1     /*      Include code for OSFlagQuery()                           

<UC/OS-II嵌入式操作系统> 信号与控制量的作用:
任务之间的通讯与同步
1> 事件控制块: 任务或中断服务子程序可以通过可以通过事件控制块ECB向另外的任务发信号.将信号看成是事件.一个任务还可以等待另一个任务或中断服务子程序给它发送信号[F6.1B]。这里要注意的是,只有任务可以等待事件发生,中断服务子程序是不能这样做的。对于处于等待状态的任务,还可以给它指定一个最长等待时间,以此来防止因为等待的事件没有发生而无限期地等下去。
    多个任务可以同时等待同一个事件的发生[F6.1B]。在这种情况下,当该事件发生后,所有等待该事件的任务中,优先级最高的任务得到了该事件并进入就绪状态,准备执行。上面讲到的事件,可以是信号量、邮箱或者消息队列等。当事件控制块是一个信号量时,任务可以等待它,也可以给它发送消息.
2> μC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样μC/OS-II才能支持信号量。
3>邮箱:邮箱是μC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”。
     使用邮箱的目的是用来通知一个事件的发生(发送一条消息),那么就要初始化该邮箱为NULL,因为在开始时,事件还没有发生。如果用户用邮箱来共享某些资源,那么就要初始化该邮箱为一个非NULL的指针。在这种情况下,邮箱被当成一个二值信号量使用。
4>消息队列 :消息队列是μC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量.

5>互斥型信号:实现对共享资源的独占式处理,同时在应用程序代码中降解优先级反转问题,将优先级底的任务提高到优先级高的任务。

void Task0_Usart (void *pdata)
{
     pdata = pdata;                                         /* Prevent compiler warning                  */
     INT8U err;
     BSP_CLK_Init();
     BSP_UART_Init();
     while (1) {
        OSMutexPend(ResourceMutex,0,&err);         
         TXBUF1 = 0x30;         
        OSMutexPost(ResourceMutex);
         OSTimeDly(20);   
     }
}


void Task1_Usart(void *pdata)
{
     pdata = pdata;
     INT8U err;
timer interrupts          */
        while (1)
        {
           OSMutexPend(ResourceMutex,0,&err);
           TXBUF1 = 0x31;     
           OSMutexPost(ResourceMutex);
           OSTimeDly(50);
        }
}

void Task2_Usart(void *pdata)            //只要 Task3_Time<=Task2_Time+Task1_Time
{                                        //就能 按 顺序输出
     pdata=pdata;
     INT8U err;
timer interrupts          */

        while (1)
        {
          OSMutexPend(ResourceMutex,0,&err);              
          TXBUF1 = 0x32;                 
          OSMutexPost(ResourceMutex);
          OSTimeDly(70);
        }      
}                    
Task2优先级最底OSMutexPend()优先级反转 OSMutexCreate(1,&err); 调至优先级1.中间延时70做任务切换,到任务Task0 OSMutexCreate(1,&err);调至优先级1.延时20做任务切换,任务Task1 是50 所以连续调2次Task0 。2*Task0<Task1 , 3*Task0>Task1,在调第三次Task0时,任务反转到Task1.所以总的输出是:20010201021001.。。
OSMutexPend()使用前先OSMutexCreate(),如果mutex被别的任务占用,OSMutexPend()函数就将该函数的任务放入等待mutex的任务列表,这个任务进入了等待状态,直到占用mutex的任务释放了mutex以及共享资源。处理完毕OSMutexPost()释放资源,不是OSMutexDel().
OSMutexAccept()查询互斥信号量,确定资源可用,只是查询状态。
void Task1_Usart(void *pdata)              //接Sem
{
     pdata = pdata;
     INT16U Value;
     WDTCTL = WDT_MDLY_32;                                   /* Set time tick 32 mS                       */
     IE1    |= 0x01;                                          /* Enable Watchdog timer interrupts          */

        while (1)
        {
           Value = OSSemAccept(DispSem);
           if(Value>0)
           {
           P4DIR=0XFF;
           P4OUT=0X50;
           TXBUF1 = 0x31;     
           }
           OSTimeDly(40);
        }
}
以上输出:10101010......
此帖出自MSP430论坛


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-10-23 04:26 , Processed in 0.068084 second(s), 16 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表