FreeRtos互斥量复习

前提

为什么有互斥量的存在?

  • 在使用二值信号量的时候会存在优先级翻转的问题,本实验通过模拟的方式实现优先级翻转,观察优先级翻转对抢占式内核的影响。

优先级翻转实验:
正点的:复习,当任务while中出现OS延时即系统systick会自动调度切换任务。因为操作系统是抢占式内核每个时刻都需要运行任务,抢占任务进行
创建二值信号量
FreeRtos互斥量复习_第1张图片
高优先级:请求信号量,然后释放
FreeRtos互斥量复习_第2张图片
中优先级:输出打印观察作用没有啥特殊
FreeRtos互斥量复习_第3张图片

低优先级:
当低优先级一直占用的时候,任务调度切换以后在高与中切换,由于低优先级没有释放二值信号量,所以高优先级阻塞状态,会执行中等优先级,当低优先级运行完释放了信号量才会再让高优先级执行。这种现象就是优先级翻转。
FreeRtos互斥量复习_第4张图片

一、基础概念

作用:互斥量又称互斥信号量(本质是信号量),是一种特殊的二值信号量,它和信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性,用于实现对临界资源的独占式处理。

二、运行机制

互斥量具有优先级继承机制,而信号量没有。也就是说,某个临界资源受到一个互斥量保护,如果这个资源正在被一个低优先级任务使用,那么此时的互斥量是闭锁状态,也代表了没有任务能申请到这个互斥量,如果此时一个高优先级任务想要对这个资源进行访问,去申请这个互斥量,那么高优先级任务会因为申请不到互斥量而进入阻塞态,那么系统会将现在持有该互斥量的任务的优先级临时提升到与高优先级任务的优先级相同,这个优先级提升的过程叫做优先级继承。这个优先级继承机制确保高优先级任务进入阻塞状态的时间尽可能短,以及将已经出现的“优先级翻转”危害降低到最小。
应用场景举例:

比如有两个任务需要对串口进行发送数据,其硬件资源只有一个,那么两个任务肯定不能同时发送啦,不然导致数据错误,那么,就可以用互斥量对串口资源进行保护,当一
个任务正在使用串口的时候,另一个任务则无法使用串口,等到任务使用串口完毕之后,另外一个任务才能获得串口的使用权。

总结流程:

  • 创建自动开锁,允许访问。
  • 占用信号量闭锁。
  • 直到任务完成开锁允许访问。

不会出现优先级翻转误差的原因就是互斥量是完成了持有接收信号量的任务完成了再释放信号量资源让其他任务获取信号量。而二值信号量不好保护信号量资源,当任务切换就会存在信号量的释放与接收。

三、 API函数

跟二值信号量一样创建不一样

四、实验代码分析

正点的
与前面翻转实验不同的就是这里创建的是互斥信号量。其特性就不一样了
FreeRtos互斥量复习_第5张图片

你可能感兴趣的:(嵌入式操作系统,嵌入式,stm32)