uC/OS-II中,被挂起的任务居然没恢复就可以运行?

问题:

uC/OS-II创建多个任务后,除了第一个外,其他任务都被挂起,可是最后运行的却是一个被挂起的任务?

具体的程序代码


OS_STK    KEYTaskStk[TASK_STK_SIZE];  //定义栈
OS_STK    LCDTaskStk[TASK_STK_SIZE];

/*******************************************************************************
*@FunctionName   : StartTask()
*@Priority       : STARTUP_TASK_PRIO=0
*@Description    : 起始函数,创建KEYTask这个主要任务
*                  每秒闪烁一次LED之RUN,表示正常运行
*****************************************************************************/
void StartTask(void *p_arg)
{
	(void)p_arg;
	
	OSStatInit();                        //初始化统计任务
	
	OSTaskCreate(KEYTask,(void *)0,&KEYTaskStk[TASK_STK_SIZE-1], KEY_TASK_PRIO);//2
	
	OSTaskCreate(NRFConfTask,(void *)0,&KEYTaskStk[TASK_STK_SIZE-1], NRF_CONF_PRIO);//11
	OSTaskSuspend(NRF_CONF_PRIO);

	OSTaskCreate(SIConfTask,(void *)0,&KEYTaskStk[TASK_STK_SIZE-1], SI_CONF_PRIO);//12
	OSTaskSuspend(SI_CONF_PRIO);

	OSTaskCreate(LcdAdjustTask  ,(void *)0 ,&LCDTaskStk[TASK_STK_SIZE-1]    , LCD_ADJUST_PRIO);//40
	OSTaskSuspend(LCD_ADJUST_PRIO);
	
	while(1)
	{
		RUN( ON );
		OSTimeDlyHMSM(0, 0, 0,500);
		RUN( OFF);
		OSTimeDlyHMSM(0, 0,1,500);
	}
} 

所有任务创建之后 ,运行的除了StartTask任务之外,不是想要的KEYTask,而是SIConfTask,注意为什么不是NRFConfTask,也不是LcdAdjustTask,偏偏是SIConfTask呢?而它明明是被挂起了呀!

难道OSTaskSuspend(SI_CONF_PRIO);语句是假的,还是SI_CONF_PRIO定义错了,不然uC/OS-II为什么没有按照我们设计的运行呢?

错误所在:

仔细观察就会发现错误在于,KEYTask、NRFConfTask、SIConfTask的堆栈,用的都是同一个KEYTaskStk,而LcdAdjustTask使用的是LCDTaskStk。

至于,为什么当运行完OSTimeDlyHMSM(0, 0, 0,500);语句后,CPU竟然是回到了明明被挂起了的SIConfTask的手里?

现象原因:

研究创建SIConfTask的时候

OSTaskCreate(SIConfTask,(void *)0,&KEYTaskStk[TASK_STK_SIZE-1], SI_CONF_PRIO);//12

注意到OSTaskCreate函数里面有这么一句

OSTaskStkInit(task, p_arg, ptos, 0u);             /* Initialize the task's stack         */

再计入到OSTaskStkInit里面看看,就知道原来任务的首地址是保存在堆栈里的,当创建完SIConfTask任务之后,任务KEYTask的堆栈已经被SIConfTask覆盖了——鸠占鹊巢。

所以此时运行还是按照预期的,被运行的仍然是优先级为2 的任务,只不过环境变成SIConfTask的环境。

OSTaskCreate 函数的形参OS_STK  *ptos竟然如此神奇,是不是对运行环境一次有了新的认识!

猜你喜欢

转载自blog.csdn.net/qq_35629563/article/details/82897231