stm32cubeMX+FreeRTOS(2)——任务挂起和恢复
·
1. 相关函数
osThreadSuspend()
osThreadResume()
注意函数参数传递的是RunLEDHandle,而不是RunLED,传入RunLED会终结所有任务,包括本任务自身也会自杀。(后来仔细看原子的视屏有强调这一点,说是传入任务句柄)

2. 使用
在非LED任务中挂起、恢复LED任务。如果在LED任务中直接挂起,接下来就没法恢复自己,需要通过别的任务来恢复LED任务。
if(a==5)
{
a++;
b=osThreadSuspend(RunLEDHandle);
}
else if(a==10)
{
a=0;
b=osThreadResume(RunLEDHandle);
}
// HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
osDelay(500);
3. 全局数据丢失
使用osThreadSuspend挂起任务,会清除任务中的数据,比如我上面2中的代码,我在LED任务中定义了一个全局变量b,发现b在挂起时候就会把所有数据清零,貌似没有保存现场。
但是在原子的freeRTOS参考手册中是这么说的,挂起不会删除任务中的变量。

我跳到cubeMX封装的函数里面去看到,说明确实调用的是本函数,但是使用全局变量确实会丢失数据

4. 局部变量未丢失
如上节所示问题,使用全局变量在任务挂起时候会丢失数据。
思考一会儿想到,任务挂起是把任务和数据都保存在该任务的栈里面,而全局变量在这个时候没有被保存,因此在任务挂起时候,全局变量失效。
5. 任务阻塞
每个任务至少应该有1ms的延时,否则任程序会一直死在该代码块中,没法执行别的任务。

6. osDelay时间
如下如所示,他的tick为1000hz,也就是1ms,我们可以通过这个来调节osDelay时间。

所有评论(0)