在线情况
楼主
  • 头像
  • 级别
    • 积分3
    • 经验374
    • 文章3
    • 注册2010-03-12
    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) 这句里面。不知道是不是任务切换编的有问题,这是根据网上的例程编的。还请高手给指点指点。
         
     
    [ 此贴最后由DC在2010-11-6 18:13:55编辑过 ]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    请教一下楼主,我看不太懂你的程序;因为之前没弄过这UCOS,不要见怪。
    [1]“用邮箱编两个任务试试”这是怎么理解?
    [2]在“TaskStartA TaskStartB”各进程中,怎样用了while (1)语句,请问进程中是如何跳或切换的。
    烦劳请指点指点...
    还有上面的例子中,实现的目的是什么,什么样的应用才会使用到这种程序(UCOS)架构。
    谢谢!
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分3
      • 经验374
      • 文章3
      • 注册2010-03-12
      [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闪烁。简单的测试一下邮箱通信。
      微控网感谢您的参与
      Powered by LeadBBS 9.2 .
      Page created in 0.1710 seconds with 5 queries.