在这里先补一下

其中还有一个重要的点就是空闲任务,他最重要的作用就是处理前面讲到的自删除产生的内存碎片,我个人是初学者,对于他的底层逻辑也了解的不多。但是空心任务是由MX自己生成自动运行的,但是我们要注意的是为了保证任务的正常运行,我们要多使用软阻塞比如vTaskDelay少用像HAL_Delay这样的硬阻塞

还有两个FreeRTOS自己带的Delay的区别,(这个在第一篇文章讲过知识当时讲的有问题)

vTaskDelay其实本质是一个计数器,去计数最小时间片中断的个数

拿vTaskDelay(3)举例子

图中的两种情况都是vTaskDelay(3)第一个箭头是开始点,第二个事结束点

但是由于开始的时间段不同就导致虽然都是计数了3个最小时间片中断的个数但是时间不一样,所以vTaskDelay(3)的时间是大于等于>=3个最小时间片

vTaskDelayUntil

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement )

第一个参数是起始点,第二个参数是计时时长

就不一样了,他是以本函数使用的点为0点开始计时

所以我很可以在使用前获取一些时间戳,然后开始计时

uint32_t ulBegTime1;



ulBegTime1 = HAL_GetTick();



vTaskDelayUntil(&ulBegTime1,500);

接下来进入新知识

关于任务同步与互斥还有通信的学习

在一个FreeRTOS多任务中如果完成一个任务的时间小于最小时间片,是原地等待完成一个最小时间片还是直接进入下一个任务?

不会原地等待!如果任务主动让出或时间片用完,会立即切换到下一个任务。

所以进入下一个任务有两种可能

1. 当前任务彻底完了(while(1)死循环不算完成)

2.时间片用完了

理解了这两句话就明白了同步与互斥

再简单一点讲

互斥:保护共享资源,防止同时访问(比如IIC,UART等通信不能被抢占)

同步:协调任务执行顺序,等待事件发生

总结:互斥和同步是我们需要使用外设时的要求,而接下来要学习的互斥锁,信号量,队列,任务通知,事件组,就是我们满足这些要求的工具,这下工具下面会一一讲解

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐