14.2.5 互斥信号量应用:共享资源串口互斥访问设计

更新于 2026年10月10日 版权声明
14.2.5 互斥信号量应用:共享资源串口互斥访问设计

1.任务要求

串口是嵌入式应用系统常用的接口,在应用中,经常需要输出不同任务的不同消息。现有高、中、低优先级的3个任务,同时需要应用串口向计算机发送消息。请用STM32F1和FreeRTOS结合二值信号量和互斥信号量设计程序,实现对共享资源串口的访问,保障数据的正常输出。

2.硬件设计

共享资源串口互斥访问硬件电路如图14.15所示,任务中要求对串口进行互斥访问,硬件设计将串口2作为共享资源,串口2的PA2和PA3通过CH340与上位机相连,上位机通过超级终端或串口助手软件等观察任务运行。

3.软件设计

设计3个任务,分别向串口打印执行次数,3个任务优先级分别为高、中、低。先创建二值信号量,使用二值信号量对共享资源进行访问,再用互斥信号量对共享资源进行访问。

图示

图14.15 共享资源串口互斥访问硬件电路

TaskH为高优先级任务,用于获取二值信号量,成功后向串口打印执行次数,处理完将二值信号量释放。

TaskM为中优先级任务,用于执行一个加计数器,并通过串口打印执行次数。

TaskL为低优先级任务,用于获取二值信号量,成功后向串口打印执行次数,然后不执行释放二值信号量操作,而执行多次任务调度。

在STM32CubeMX中创建任务,设置参数,并创建工程文件。在“main.c”程序中添加如下参考程序。(https://www.daowen.com)

图示

图示

4.仿真与调试

(1)二值信号量访问调试。

二值信号量执行过程如图14.16所示。在信号量创建成功后,TaskH、TaskM、TaskL依次执行。当执行到TaskL时,由于获取二值信号量后未进行释放,所以高优先级任务TaskH长时间得不到执行,而中优先级任务TaskM执行了17次,这时就出现了二值信号量带来的问题。

(2)互斥信号量访问调试。

将代码中的二值信号量创建语句Sem_Handle=xSemaphoreCreateBinary()改成互斥信号量创建语句Sem_Handle=xSemaphoreCreateMutex(),其他不变,则互斥信号量执行过程如图14.17所示。当低优先级任务获得信号量后,优先级翻转,成为高优先级任务,直到执行信号量释放操作后才被抢占,这样保证了高、中、低优先级任务的执行。

图示

图14.16 二值信号量执行过程

图示

图14.17 互斥信号量执行过程

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)