jinleize 发表于 2007-9-28 15:40:52

在Atmega128上移植ucOS-ii后的任务切换问题

点击此处下载ourdev_174726.txt(文件大小:2K)
点击此处下载ourdev_174727.txt(文件大小:11K)

在Atmega128上移植过ucOS-ii之后,我通过定时器溢出中断发送消息邮箱给任务,现在能进入任务,
但是进入任务后,在任务的最后一条语句OSTimeDly(10)中单步执行到任务切换函数OSCtxSw(在os_cpu_a.s文件中)
的最后一条指令RET后,任务就直接跳到main函数处重新运行了。
问题应该出现在任务切换函数中,不过我用从Micrium网上下载的os_cpu_a.s试过,还是这个问题,大家帮忙解决一下。

cao_zhihong_0 发表于 2007-9-30 10:52:44

兄弟,你的问题我是解决不了。你能不能把UCOS移植到MEGA128上的代码给我们看看,我移植了好长时间都没搞定。

laoma 发表于 2007-9-30 11:10:14

多任务初始化是需要步骤的.............

第一步必须OSInit(),你不是,这是我写的主函数:
void main(void)
{
    #if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
    INT8Uerr;
    #endif
   
    OSTaskStkSize   = OS_TASK_IDLE_STK_SIZE;
    OSTaskStkSizeHard = OS_TASK_IDLE_STK_SIZE_HARD;
    OSInit();<---------------------------------------------------------------------这是先要干的伙,位置很关键
    //调整空闲任务堆栈尺寸
    OSTCBPrioTbl->OSTCBStkSize   = OSTaskStkSize - OSTaskStkSizeHard;
    OSTCBPrioTbl->OSTCBStkBottom = &OSTaskIdleStk;
    //调整统计任务堆栈尺寸
    #if OS_TASK_STAT_EN > 0
    OSTCBPrioTbl->OSTCBStkSize   = OSTaskStkSize - OSTaskStkSizeHard;
    OSTCBPrioTbl->OSTCBStkBottom = &OSTaskStatStk;
    #endif
    //设置空闲任务名称
    #if OS_TASK_NAME_SIZE > 14
    OSTaskNameSet(OS_IDLE_PRIO, "uC/OS-II Idle", &err);
    #endif
    //设置统计任务名称
    #if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
    OSTaskNameSet(OS_STAT_PRIO, "uC/OS-II Stat", &err);
    #endif
   
    //用任务建立任务,<-----------------------------------------------------一般都这样用,用一个任务建立多任务开始多任务系统
    OSTaskStkSize   = OS_TASK_START_STK_SIZE;
    OSTaskStkSizeHard = OS_TASK_START_STK_SIZE_HARD;
    OSTaskCreateExt(OSTaskStart,                                          //void (*task)(void *pd) 任务首地址
                  (void *)0,                                          //void *pdata            数据指针
                  &OSTaskStartStk,          //OS_STK *ptos         指向任务堆栈栈顶的指针
                  OS_TASK_START_PRIO,                                 //INT8U prio             任务优先级
                  OS_TASK_START_ID,                                     //INT16U id            任务的ID号
                  &OSTaskStartStk,         //OS_STK *pbos         指向任务堆栈栈底的指针
                  OS_TASK_START_STK_SIZE - OS_TASK_START_STK_SIZE_HARD, //INT32U stk_size      堆栈容量
                  (void *)0,                                          //void *pnext            数据指针
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);         //INT16U opt             设定OSTaskCreateExt的选项

    OSTaskNameSet(OS_TASK_START_PRIO, "Task-Start", &err);

    OSStart();
}


static void OSTaskStart(void *pdata)
{
    pdata = pdata;
   
    //目标板初始化,启动系统Tick
    Target_Init();<--------------------------------------这个位置又很关键

    //统计任务初始化
    #if OS_TASK_STAT_EN > 0
    OSStatInit();
    #endif

    //系统事件的建立
    #if OS_EVENT_EN > 0
    CreateEvents();
    #endif

    //系统多任务的建立
    CreateMultiTask();<---------------------------------------这正建立多任务
   
    //开始任务自动挂起
    OSTaskSuspend(OS_PRIO_SELF);
    while(1)
    {
      OSTimeDly(OS_TICKS_PER_SEC);
      OSTaskSuspend(OS_PRIO_SELF);
    }
}

voidCreateMultiTask (void)
{

    #if (OS_TASK_NAME_SIZE > 31)
    INT8Uerr;
    #endif
   
    //*********************************************************************************************************
    //************************************射频感应通讯*****************************************************
    //*********************************************************************************************************
    //传递堆栈尺寸
    OSTaskStkSize   = APP_TASK_RF_STK_SIZE;
    OSTaskStkSizeHard = APP_TASK_RF_STK_SIZE_HARD;
    //建立任务
    OSTaskCreateExt(AppTask_RF,
                  (void *)0,
                  &AppTaskRF_Stk,
                  APP_TASK_RF_PRIO,
                  APP_TASK_RF_ID,
                  &AppTaskRF_Stk,
                  OSTaskStkSize - OSTaskStkSizeHard,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    //设置任务名称
    OSTaskNameSet(APP_TASK_RF_PRIO, "AppTask-RF", &err);

    //*********************************************************************************************************
    //************************************** USB 任务 *********************************************************
    //*********************************************************************************************************
    //传递堆栈尺寸
    OSTaskStkSize   = APP_TASK_USB_STK_SIZE;
    OSTaskStkSizeHard = APP_TASK_USB_STK_SIZE_HARD;
    //建立任务
    OSTaskCreateExt(AppTask_USB,
                  (void *)0,
                  &AppTaskUSB_Stk,
                  APP_TASK_USB_PRIO,
                  APP_TASK_USB_ID,
                  &AppTaskUSB_Stk,
                  OSTaskStkSize - OSTaskStkSizeHard,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    //设置任务名称
    OSTaskNameSet(APP_TASK_USB_PRIO, "AppTask-USB", &err);
    //*********************************************************************************************************
    //********************************    主界面显示时间的任务    *********************************************
    //*********************************************************************************************************
    //传递堆栈尺寸
    OSTaskStkSize   = APP_TASK_UpdateTime_STK_SIZE;
    OSTaskStkSizeHard = APP_TASK_UpdateTime_STK_SIZE_HARD;
    //建立任务
    OSTaskCreateExt(AppTask_UpdateTime,
                  (void *)0,
                  &AppTaskUpdateTime_Stk,
                  APP_TASK_UpdateTime_PRIO,
                  APP_TASK_UpdateTime_ID,
                  &AppTaskUpdateTime_Stk,
                  OSTaskStkSize - OSTaskStkSizeHard,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    //设置任务名称
    OSTaskNameSet(APP_TASK_UpdateTime_PRIO, "AppTask-UpdateTime", &err);
    //*********************************************************************************************************
    //***********************************键盘扫描任务******************************************************
    //*********************************************************************************************************
    //传递堆栈尺寸
    OSTaskStkSize   = APP_TASK_ScanKey_STK_SIZE;
    OSTaskStkSizeHard = APP_TASK_ScanKey_STK_SIZE_HARD;
    //建立任务
    OSTaskCreateExt(AppTask_ScanKey,
                  (void *)0,
                  &AppTaskScanKey_Stk,
                  APP_TASK_ScanKey_PRIO,
                  APP_TASK_ScanKey_ID,
                  &AppTaskScanKey_Stk,
                  OSTaskStkSize - OSTaskStkSizeHard,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    //设置任务名称
    OSTaskNameSet(APP_TASK_ScanKey_PRIO, "AppTask-ScanKey", &err);
    //*********************************************************************************************************
    //**********************************系统菜单管理任务***************************************************
    //*********************************************************************************************************
    //传递堆栈尺寸
    OSTaskStkSize   = APP_TASK_MENU_STK_SIZE;
    OSTaskStkSizeHard = APP_TASK_MENU_STK_SIZE_HARD;
    //建立任务
    OSTaskCreateExt(AppTask_MENU,
                  (void *)0,
                  &AppTaskMENU_Stk,
                  APP_TASK_MENU_PRIO,
                  APP_TASK_MENU_ID,
                  &AppTaskMENU_Stk,
                  OSTaskStkSize - OSTaskStkSizeHard,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    //设置任务名称
    OSTaskNameSet(APP_TASK_MENU_PRIO, "AppTask-MENU", &err);
}
页: [1]
查看完整版本: 在Atmega128上移植ucOS-ii后的任务切换问题