mokongking

FreeRtos关于队列,信号量,互斥量。

个人理解,有问题须指正:

队列的作用:任务之间的通信,好处是,在使用全局变量的时候防止全局变量被更改其他任务更改就可以使用队列,如果一个全局变量只应用于一个任务中不存在其他任务中调用也可以不用队列来传递这个全局变量。如果想要传递一个数组或者结构体,可以向队列发送指针值。获取队列中的值是阻塞获取,如果把队列的等待值设置成最大,如果运行到当前任务就会一直等待队列的值到来就会造成任务阻塞,导致无法切换任务,因为任务调度器的调度原理按照任务优先级1ms切换一次任务,先高优先级先执行,经过1ms中优先级执行,最后低优先级执行,如果都是同意优先级就按照任务的顺序依次执行,一个任务中的队列一直等待值这个任务就会一直阻塞其他任务。除非必须等待这个值才能运行接下来的所有逻辑,不然不建议把队列的等待值设置成最大。

信号量就是特殊的队列,而且信号量的类型有多种,例如,二值信号量,计数值信号量等,这个任务主要是作用于任务之间的互斥,保证只有当前一个任务执行不回被其他任务打断。但是中断会打断有二值信号量的线程,所以保证中断的任务一定要短。二值信号量,与计数信号量是有在中断的获取函数的,互斥量没有

在keil的编译器中自己移植freertos代码中的二值信号量在创建的过程中是不会在这个特殊的队列里放值,使用的时候要先放值,然后在需要互斥的任务中取值,在任务结束时候放值完成整个使用,这个作用可以防止优先级反转,不会让高优先级任务打断低优先级任务。

在stm32cubeMx或者stm32cubeide中生成的二值信号量在创建的时候也会如同互斥量一样往里放值。

互斥信号量是与二值信号量类似,不同的是互斥量在创建的时候互斥信号量的队列中是有值的可以不需要放值,直接在任务中取值,完成后放值直接用。

互斥量的任务调用顺序如下:有三个优先级的任务,高优先级 ,中优先级,低优先级。

高优先级 使用互斥量,中优先级不使用互斥量,低优先级使用互斥量,任务在调度的顺序为先高优先级,等高优先级执行完然后中优先级经过1ms,低优先级执行完,这个循环一直往复。

如果高优先级不使用互斥量,就如果下,先高优先级经过1ms,到中优先级,经过1ms,到低优先级,然后低优先级有互斥量等待执行完成,循环往复。

如果是同一个优先级就按照创建任务的顺序按照顺序执行,只要遇到互斥量就等互斥量执行完成然后再继续切换

posted on 2025-05-15 14:26  虎啸岳林  阅读(32)  评论(0)    收藏  举报

导航