FreeRTOS(6)(任务的状态+两种时间阻塞)
其中还有一个重要的点就是空闲任务,他最重要的作用就是处理前面讲到的自删除产生的内存碎片,我个人是初学者,对于他的底层逻辑也了解的不多。但是空心任务是由MX自己生成自动运行的,但是我们要注意的是为了保证任务的正常运行,我们要多使用软阻塞比如vTaskDelay少用像HAL_Delay这样的硬阻塞。总结:互斥和同步是我们需要使用外设时的要求,而接下来要学习的互斥锁,信号量,队列,任务通知,事件组,就是
在这里先补一下
其中还有一个重要的点就是空闲任务,他最重要的作用就是处理前面讲到的自删除产生的内存碎片,我个人是初学者,对于他的底层逻辑也了解的不多。但是空心任务是由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等通信不能被抢占)
同步:协调任务执行顺序,等待事件发生
总结:互斥和同步是我们需要使用外设时的要求,而接下来要学习的互斥锁,信号量,队列,任务通知,事件组,就是我们满足这些要求的工具,这下工具下面会一一讲解
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)