freertos 信号量总结

FreeRTOS - 如何根据FreeRTOS提供的功能(信号量、任务通知、队列等)设计程序
https://www.cnblogs.com/god-of-death/p/6917837.html
什么是同步?什么是互斥?
https://blog.csdn.net/liming0931/article/details/82902084
同步和互斥 :freertos 如何实现互斥跟同步的 可以从上面两篇博客得到答案

互斥:是指散步在不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,
只能等到该任务运行完这个程序片段后才可以运行。最基本的场景就是:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。

同步:是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。
最基本的场景就是:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务的运行依赖于 B 任务产生的数据。
a 执行后,b才可以执行

互斥信号量
1 同步的应用中,二值信号量最合适
2 互斥信号用于需要互斥的应用上
3 注意使用互斥信号的任务,不要处于不同等级
4 中断不要使用互斥信号量 (1 互斥信号量优先级有继承的机制,只能在任务中 2 中断不能老阻塞,因为等互斥信号锁阻塞呀)
5
//创建互斥信号量
MutexSemaphore=xSemaphoreCreateMutex();

6 //获取互斥信号量
xSemaphoreTake(MutexSemaphore,portMAX_DELAY);

7 //释放信号量

8 特殊的互斥信号量:递归互斥信号量
1 已经获取的互斥信号量的任务 就不能再次获取这个互斥信号量
2 但是递归互斥信号量,已经获取递归信号量的任务可以再次获得这个递归信号量

二进制信号量
1 //创建二值信号量
BinarySemaphore=xSemaphoreCreateBinary();
2 //二值信号量创建成功以后要先释放一下 (必须要释放信号量)
if(BinarySemaphore!=NULL)xSemaphoreGive(BinarySemaphore);
3 //获取二值信号量
xSemaphoreTake(BinarySemaphore,portMAX_DELAY); //获取二值信号量 此处注意一直阻塞的的话,根本不会进行下一步
4 //释放信号量
xSemaphoreGive(BinarySemaphore); //释放信号量

计数信号量

1 #define xSemaphoreCreateCounting(uxMaxCount, uxInitialCount )
xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ), (NULL ) )

uxMaxCount:最大计数值,当信号到达这个值后,就不再增长了。

uxInitialCount:创建信号量时的初始值

xSemaphoreTake(CountSemaphore,portMAX_DELAY); //获取数值信号量就会减一
xSemaphoreGive(CountSemaphore);//释放计数型信号量 释放就会加一
semavalue=uxSemaphoreGetCount(CountSemaphore); //获取计数型信号量值

mv1nPlXAywBDCdhxFc9QOVv6TBcQHLAXBQUAKTh3ie4fqSEOnWrPsnVkF
yt0wAkJHweoExRJWWVwwCniKNROSdJzJXE6YVapYW7f+tRRXRFI4yn4Nj
jZ0RiiqGRCTVzwComUcXB-eiFWRBY6JpSsCNkmIxL5KsRCo442djHhTZE

你可能感兴趣的:(freertos)