首先我们聊聊什么是信号量:
信号量只负责加或减,不负责其他信息交流,他的效果类似于票,有票,并且你得到了,你就能进入景区,反之没票,你就得等,等别人把票用完后,放回售票处
回到freertos,任务有信号量,就能执行任务,反之阻塞等待
1.创建信号量
创建信号量有两种,一种二进制,一种计数,最大的区别就是二进制初始值为零,也就是说·,用二进制创建的信号量一开始是没票的,先要给他
xSemaphoreGive(g_xSemTicks);
而且二进制最多只有一张票,你give他多次,只有第一次give是有效的
2.信号量获取
xSemaphoreTake(g_xSemTicks, portMAX_DELAY);
调用这个函数,第一个参数是你想在哪个信号量那里取票,第二个参数是你如果没有取到票,是掉头就走还是一直等
这里要注意,你创建一个信号量之后,你想拿这个信号量来管理任务的运行,但是有哪些任务是归这个信号量管,哪些是不归这个信号量管呢?
答案就是你想要哪个任务被管,就在哪个任务里面调用xSemaphoreTake这个函数,如果这个任务都不想去获取信号量,为什么会被信号量管呢
3.信号量返回
xSemaphoreGive(g_xSemTicks);
在执行完任务后,将获得的票返回给售票处,给其他正在等待票的任务
4.优先级反转问题
首先要明白,在freertos里面,任务是有优先级的,高优先级任务先运行,那么信号量是如何实现优先级反转的呢?
没票的话,你再高优先级也得在那等票。
低优先级任务获得票之后,并且还没运行完,票务那边也没有票的话,高优先级就只能等了