信号量----反转优先级

首先我们聊聊什么是信号量:
信号量只负责加或减,不负责其他信息交流,他的效果类似于票,有票,并且你得到了,你就能进入景区,反之没票,你就得等,等别人把票用完后,放回售票处

回到freertos,任务有信号量,就能执行任务,反之阻塞等待

1.创建信号量

 创建信号量有两种,一种二进制,一种计数,最大的区别就是二进制初始值为零,也就是说·,用二进制创建的信号量一开始是没票的,先要给他

xSemaphoreGive(g_xSemTicks);

而且二进制最多只有一张票,你give他多次,只有第一次give是有效的

2.信号量获取

xSemaphoreTake(g_xSemTicks, portMAX_DELAY);

调用这个函数,第一个参数是你想在哪个信号量那里取票,第二个参数是你如果没有取到票,是掉头就走还是一直等

这里要注意,你创建一个信号量之后,你想拿这个信号量来管理任务的运行,但是有哪些任务是归这个信号量管,哪些是不归这个信号量管呢?

答案就是你想要哪个任务被管,就在哪个任务里面调用xSemaphoreTake这个函数,如果这个任务都不想去获取信号量,为什么会被信号量管呢

3.信号量返回

xSemaphoreGive(g_xSemTicks);

在执行完任务后,将获得的票返回给售票处,给其他正在等待票的任务

4.优先级反转问题

首先要明白,在freertos里面,任务是有优先级的,高优先级任务先运行,那么信号量是如何实现优先级反转的呢?

没票的话,你再高优先级也得在那等票。

低优先级任务获得票之后,并且还没运行完,票务那边也没有票的话,高优先级就只能等了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值