单片机学习小组
登录
直播中
无人岛
10年用户
929经验值
擅长:嵌入式技术 制造/封装 控制/MCU
私信
关注
怎样通过串口来显示FreeRTOS计数型信号量的数值呢
开启该帖子的消息推送
FreeRTOS
串口
信号量
计数型信号量是指什么?
怎样通过串口来显示FreeRTOS计数型信号量的数值呢?
回帖
(1)
刘建伟
2022-2-28 16:32:04
2.FreeRTOS计数型信号量
2.1.计数型信号量简介
计数型信号量也叫做数值信号量,相当于数值大于1的队列,用户不需要关心其中存储了什么数据,只需要关心是否为空即可,其主要用于事件计数和资源管理。
2.1.1事件计数
在这个场合中,每次事件发生的时候就在事件处理函数中释放信号量(增加信号量的计数
值),其他任务会获取信号量(信号量计数值减一,信号量值就是队列结构体成员变量
uxMessagesWaiting)来处理事件。在这种场合中创建的计数型信号量初始计数值为 0。
2.1.2资源管理
在这个场合中,信号量值代表当前资源的可用数量,比如房间内当前剩余的座位数量。
一个任务要想获得资源的使用权,首先必须获取信号量,信号量获取成功以后信号量值就会减一。当信号量值为 0 的时候说明没有资源了。当一个任务使用完资源以后一定要释放信号量,释放信号量以后信号量值会加一。在这个场合中创建的计数型信号量初始值应该是资源的数量,比如房间内一共有 50 个座位,那么创建信号量的时候信号量值就应该初始化为 50。
2.2.计数型信号量函数
2.2.1 创建信号量
同二值信号量一样,若想使用,必须先要创建信号量,在新版FreeRTOS中,一般使用xSemaphoreCreateCounting()函数动态创建计数型信号量。此函数是个宏,其函数原型如下:
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount,
UBaseType_t uxInitialCount)
参数:
uxMaxCount:信号量最大计数值,当信号量值等于此值时释放信号量就会失败
uxInitialCount:计数信号量初始值
返回值:
NULL:计数型信号量创建失败
其他值:创建成功的计数型信号量的句柄
2.2.2 释放信号量
释放信号量的函数与二值信号量相同,具体请参考FreeRTOS二值信号量章节。
2.2.3获取信号量
获取信号量的函数与二值信号量相同,具体请参考FreeRTOS二值信号量章节。
2.3.操作实验
2.3.1实验设计
计数型信号量一般用于事件计数与资源管理,在本节实验中,通过扫描按键,当按键按下时实现信号量的释放与获取,可以通过串口来显示信号量的数值。
任务及其功能如下:
StartTask02():扫描KEY1键,当按键按下时,进行信号量释放,顺便获取信号量数值,通过串口输出显示。
StartDefaultTask():扫描KEY2键,当按键按下时,进行获取信号量,顺便获取信号量数值,同样通过串口输出显示。
正常情况下,每释放一次信号量,信号量数值加1,当获取到以后,数值减1。
2.3.2实验过程与分析
首先,根据之前几章内容配置好KEY、UART4,其中将KEY设置为GPIO_input,按照上一节配置“FREERTOS”,完成后生成代码。 在StartDefaultTask() 与StartTask02()中添加代码如下。
可参考12.3.2章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料 2-程序源码ARM体系结构与接口技术FreeRTOS2_MP1A-FreeRTOS-COUNT】
实验结果如图所示
当按下KEY1键时,信号量释放,信号量会加1,此时按下KEY2键时,获取到信号量以后,信号量的数量减1。
2.FreeRTOS计数型信号量
2.1.计数型信号量简介
计数型信号量也叫做数值信号量,相当于数值大于1的队列,用户不需要关心其中存储了什么数据,只需要关心是否为空即可,其主要用于事件计数和资源管理。
2.1.1事件计数
在这个场合中,每次事件发生的时候就在事件处理函数中释放信号量(增加信号量的计数
值),其他任务会获取信号量(信号量计数值减一,信号量值就是队列结构体成员变量
uxMessagesWaiting)来处理事件。在这种场合中创建的计数型信号量初始计数值为 0。
2.1.2资源管理
在这个场合中,信号量值代表当前资源的可用数量,比如房间内当前剩余的座位数量。
一个任务要想获得资源的使用权,首先必须获取信号量,信号量获取成功以后信号量值就会减一。当信号量值为 0 的时候说明没有资源了。当一个任务使用完资源以后一定要释放信号量,释放信号量以后信号量值会加一。在这个场合中创建的计数型信号量初始值应该是资源的数量,比如房间内一共有 50 个座位,那么创建信号量的时候信号量值就应该初始化为 50。
2.2.计数型信号量函数
2.2.1 创建信号量
同二值信号量一样,若想使用,必须先要创建信号量,在新版FreeRTOS中,一般使用xSemaphoreCreateCounting()函数动态创建计数型信号量。此函数是个宏,其函数原型如下:
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount,
UBaseType_t uxInitialCount)
参数:
uxMaxCount:信号量最大计数值,当信号量值等于此值时释放信号量就会失败
uxInitialCount:计数信号量初始值
返回值:
NULL:计数型信号量创建失败
其他值:创建成功的计数型信号量的句柄
2.2.2 释放信号量
释放信号量的函数与二值信号量相同,具体请参考FreeRTOS二值信号量章节。
2.2.3获取信号量
获取信号量的函数与二值信号量相同,具体请参考FreeRTOS二值信号量章节。
2.3.操作实验
2.3.1实验设计
计数型信号量一般用于事件计数与资源管理,在本节实验中,通过扫描按键,当按键按下时实现信号量的释放与获取,可以通过串口来显示信号量的数值。
任务及其功能如下:
StartTask02():扫描KEY1键,当按键按下时,进行信号量释放,顺便获取信号量数值,通过串口输出显示。
StartDefaultTask():扫描KEY2键,当按键按下时,进行获取信号量,顺便获取信号量数值,同样通过串口输出显示。
正常情况下,每释放一次信号量,信号量数值加1,当获取到以后,数值减1。
2.3.2实验过程与分析
首先,根据之前几章内容配置好KEY、UART4,其中将KEY设置为GPIO_input,按照上一节配置“FREERTOS”,完成后生成代码。 在StartDefaultTask() 与StartTask02()中添加代码如下。
可参考12.3.2章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料 2-程序源码ARM体系结构与接口技术FreeRTOS2_MP1A-FreeRTOS-COUNT】
实验结果如图所示
当按下KEY1键时,信号量释放,信号量会加1,此时按下KEY2键时,获取到信号量以后,信号量的数量减1。
举报
更多回帖
rotate(-90deg);
回复
相关问答
FreeRTOS
串口
信号量
怎样
去使用
FreeRTOS
二值
信号量
呢
2022-02-28
1195
FreeRTOS
互斥
信号量
是
怎样
去控制LED亮灭的
2022-02-28
1075
关于RTOS中的
信号量
问题
2023-10-31
655
怎么使用ucos的
信号量
?
2023-10-07
626
二值
信号量
和
计数
信号量
的区别是什么?系统怎么区分是二值还是
计数
呢
2022-10-09
1629
如何创建
FreeRTOS
任务/
信号量
/
串口
底层?
2021-12-16
950
什么是POSIX无名
信号量
呢
2022-03-02
6145
用
Freertos
在
串口
中断中释放
信号量
,线程捕捉不到是为什么?
2023-10-15
563
二值
信号量
和
计数
信号量
的区别是什么?
2022-11-11
982
请求
信号量
是什么意思?
2019-09-27
2805
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分