独望枫

人在尘世间,有缘自相见,变化千千万,未开窍,已迷恋
posts - 45, comments - 0, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

FreeRTOS 线程间通信之信号量

Posted on 2021-07-14 02:12 小菜枫 阅读(990) 评论(0)  编辑 收藏 引用 所属分类: 学习笔记
1、定义信号量句柄


2、xSemaphoreHandle找不到定义,所以报红X,加入头文件,不再报错



3、创建二值信号量


4、创建释放信号量的线程


5、创建接收信号量的线程


6、那么应该会有两次获取不到信号量,超时返回pdFALSH,烧写验证


7、中断版本也是这两个函数,后缀多了FromISR
xSemaphoreGiveFromISR(semaphHandle, &pxHigherPriorityTaskWoken);
xSemaphoreTakeFromISR(semaphHandle, &pxHigherPriorityTaskWoken);
// 第二个参数是表明接收线程是否需要优先执行(线程优先级反转)

如果在二值信号量正在处理中,又有中断触发了二值信号量,然后又有一次中断触发,那么可能会导致这俩次中断触发的信号量被丢失,不能正确进入处理,因为二值信号量只能keep住空非空的状态
模拟试试:

接收信号量的地方跟上面一样,不变,烧写验证下:

跟之前一样,只能一次信号量。那么可以适用计数信号量来处理这种情况

-----------------------计数信号量----------------------------------

8、创建计数信号量


9、创建计数信号量释放线程,每隔11S连续释放6个计数信号量


10、创建计数信号量获取线程,每0.8S获取一次


11、那么理论上获取应该可以将所有的信号量都成功获取并处理,编译烧写验证之
编译出错,未定义的函数

configSUPPORT_DYNAMIC_ALLOCATION宏默认开启,那么就是configUSE_COUNTING_SEMAPHORES这个宏需要开启一下

在FreeRTOSConfig.h头文件中启用之


12、编译通过,烧写验证:连续的信号量被成功获取

由上面计数信号量及二值信号量的创建、释放、获取来看,只有创建是不一样的,获取及释放的用法完全一致。

其中断服务程序版本也是完全一致,根据需要选择合适的信号量进行使用即可。



PS:不可以在线程中创建二值信号量,会导致前后不一

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理