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时间。

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。