互斥量就是二元信号量,因此在一章里面介绍。
这一章比较简单,废话不多说,直接进入正题
信号量可以控制任务的执行顺序,在任务同步中作用很大。
信号量只有三个函数,实现方式是利用了挂起列表pendList
![](https://img.haomeiwen.com/i15070799/9446d125f0769eac.png)
信号量SemCB结构体中的num代表信号量的值,互斥量中的num是一个bool量,因为stm32中不支持bool关键字,因此bool要我们自己定义,typedef enum{false=0,true=1} bool;
首先进行信号量的创建,初始化信号量,同时进行pendList的初始化。
![](https://img.haomeiwen.com/i15070799/15718ee956b8fdee.png)
针对信号量主要有两种操作,分别是p(减少num)和v(增加num)两种操作,对应的分别是WaitSem()和PostSem()
WaitSen减少num值,如果num为负值,就意味着有几个线程还在等待信号量。当信号量小于等于0是,要把当前线程从就绪表中删除,并且加入到等待列表中。然后执行任务的切换
![](https://img.haomeiwen.com/i15070799/09fa1669ec5832e8.png)
一旦执行PostSem函数,如果num值小于0,就意味着应该把一个处于挂起态的函数从挂起态释放出来加入到就绪态中。
![](https://img.haomeiwen.com/i15070799/37ecdd5a6c72e427.png)
为了验证程序是否正确,设计了两个小程序。
第一个是在两个LED实验中分别加入semwait和sempost,观察程序是否能够持续运行
![](https://img.haomeiwen.com/i15070799/fe99dcb451330744.png)
第二个实验加入了两个按键中断进行测试,一个按键中断发出waitsem,另一个发出postsem,观察当按键时led任务是否会阻塞。发现会阻塞
![](https://img.haomeiwen.com/i15070799/b7fead83e87984f2.png)
程序链接如下,实验用的是STM32F407的开发板
链接:https://pan.baidu.com/s/1my2HPG6shXB7QiwbR47Dnw
提取码:j5hw
网友评论