UCOS-II任务切换问题,望大家给指点

楼主
UCOS-II任务切换问题,望大家给指点
[CODE]
#include "includes.h"
#define  TASK_STK_SIZE                  64  /* 定义任务堆栈大小     */
OS_STK   TaskStartStkA[TASK_STK_SIZE];
OS_STK   TaskStartStkB[TASK_STK_SIZE];
void   TaskStartA(void *data);             /* 前导声明任务(函数) */
void   TaskStartB(void *data);             /* 前导声明任务(函数) */

OS_EVENT *COMMBOX;
 INT8U TaskA,TaskB;
INT8U myErr;
void  main (void)
{
    WDTCTL = WDTPW + WDTHOLD;                  /* 禁止看门狗  */
    P2DIR|=BIT0+BIT1;
    P2OUT=0xff;
    OSInit();                                        /* 初始化uCOS-II */
    OSTaskCreate(TaskStartA, (void *)0, &TaskStartStkA[TASK_STK_SIZE - 1], 0);
    OSTaskCreate(TaskStartB, (void *)0, &TaskStartStkB[TASK_STK_SIZE - 1], 1);  
   COMMBOX=OSMboxCreate((void*)TaskA);
    OSStart();                                        /* 开始任务调度  */
}

//************************************************************************
void  TaskStartA (void *pdata)
{
    pdata  = pdata;                            /* 无任何意义,防止编译器报警 */

    WDTCTL = WDT_MDLY_32;                      /* 设置时钟节拍间隔为32ms */
    IE1   |= BIT0;                             /* 开看门狗定时器中断 */
 while (1)
{
  if(OSMboxPend(COMMBOX,0,&myErr)== (void *)& TaskA)
   {
    P2OUT^=BIT0;
    OSMboxPost(COMMBOX,(void *)& TaskB);
    OSTimeDly(100);  
    }
}

//************************************************************************
void  TaskStartB (void *pdata)
{
    pdata  = pdata;                             /* 无任何意义,防止编译器报警 */

    WDTCTL = WDT_MDLY_32;                       /* 设置时钟节拍间隔为32ms     */
    IE1   |= BIT0;                              /* 开看门狗定时器中断         */
 while (1)
{
    if(OSMboxPend(COMMBOX,0,&myErr)== (void *)& TaskB)
        {
          P2OUT^=BIT1;
          OSMboxPost(COMMBOX,(void *)& TaskA);
         OSTimeDly(100);  
        }
}
[/CODE]
ucos移植调试已经通过,我就用邮箱编两个任务试试,让两个led闪。可是程序运行起来,灯不亮,进不到if(OSMboxPend(COMMBOX,0,&myErr)== (void *)& TaskA) 这句里面。不知道是不是任务切换编的有问题,这是根据网上的例程编的。还请高手给指点指点。
     
 
1楼
请教一下楼主,我看不太懂你的程序;因为之前没弄过这UCOS,不要见怪。
[1]“用邮箱编两个任务试试”这是怎么理解?
[2]在“TaskStartA TaskStartB”各进程中,怎样用了while (1)语句,请问进程中是如何跳或切换的。
烦劳请指点指点...
还有上面的例子中,实现的目的是什么,什么样的应用才会使用到这种程序(UCOS)架构。
谢谢!
2楼
[1]ucos里面任务间的同步于通信可以用邮箱或者信号量实现。我是想在这个程序里用邮箱进行两个简单任务之间的通信。
[2]每个任务相当于一个无限循环。if(OSMboxPend(COMMBOX,0,&myErr)== (void *)& TaskA) 判断邮箱中的地址是不是&taska,由于初始化时邮箱中有值,为taska,所以进入if里的语句,led1闪一下,邮箱发送taskb,执行到ostimedly(100),任务A被挂起,系统调度taskb,满足if条件,邮箱发送taskA,执行到ostimedly(100),任务b被挂起。任务a延时结束后,进入就绪队列,系统调用任务a。如此循环。
[3]这个例子只是让两个led闪烁。简单的测试一下邮箱通信。

电脑版 Page created in 0.0625 seconds width 2 queries.