在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试过,还是这个问题,大家帮忙解决一下。 兄弟,你的问题我是解决不了。你能不能把UCOS移植到MEGA128上的代码给我们看看,我移植了好长时间都没搞定。 多任务初始化是需要步骤的.............
第一步必须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]