FreeRTOS信号量

信号量

有点像队列,但是它不是用来传递数据,只是用来修改计数值
在这里插入图片描述
信号量里面用来表示资源的个数。
1.获取信号量:take
a.关中断
b.判断资源大于0,然后让资源减一个,然后返回OK
c.判断资源小于0,返回err或者休眠,休眠后把自己放在休眠链表(semaphore.list)里,并且改变状态(挂起)。
d.有资源了,资源减一,返回ok

2释放信号量:give
跟队列那个差不多,关中断,资源加1,唤醒等待着获取信号量的那个任务。

代码分析

在这里插入图片描述
第二个参数xQueueSizeInBytes是0;第一个参数是1;
size是0,所以buffer是没有的。只用头部表示信号量。
在这里插入图片描述
queue.c中1490行左右,是take。800行左右是give(释放)。

互斥信号量

优先级继承
xSemaphoreCreateMutex
这下面是优先级翻转,因为没有优先级继承

1·低优先级任务L要访问共享资源,在获取到信号量使用CPU的过程中,如果此时高优先级任务H到达,会剥夺L的CPU使用权从而运行任务H
2·当H想要访问共享资源时,由于此时该资源的信号量仍被L占用着,H只能挂起等待L释放该信号量
3·L继续运行,此时中优先级任务M到达,再次剥夺L的CPU使用权从而运行任务M
4·M执行完后,将CPU使用权归还给任务L,L继续运行
5·L运行完毕并释放出了信号量,至此高优先级的任务H才能获取到该信号量访问共享资源并运行

在这里插入图片描述

当使用互斥量后,可以把低优先级的那个任务的级别提升到跟我一样的高度,那他就不会被中优先级的任务抢占了,然后它就可以尽快结束任务,把信号量的资源释放出来,让我可以获取到。

代码

在这里插入图片描述
就是一个特殊的队列,特殊的信号量

在这里插入图片描述
优先级继承,将低优先级的任务任务放到高优先级任务的链表,用完再放回去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值