14.2.6 递归互斥信号量应用:递归锁设计
更新于 2026年10月10日
版权声明
14.2.6 递归互斥信号量应用:递归锁设计
1.任务要求
有两个求解1~5累加和的任务,分别保护各自的计算过程不被另外的任务打断,将计算结果通过串口输送到计算机。请用STM32F1系列MCU和FreeRTOS递归互斥信号量设计程序并进行仿真和调试。
2.硬件设计
本任务的硬件电路参照4.2.5节的硬件电路图。该任务只需要用到串口2将运行过程中的数据输出到上位机,上位机接收到数据后打印出来,以验证递归锁的功能。
3.软件设计
设计两个任务,分别执行算术累加和计算,设计一个递归互斥信号量来实现计算过程的保护。
Mutex1用于创建一个递归互斥信号量。
TaskA用于设计两层递归操作,保护计算过程。
TaskB用于设计一层递归操作,演示递归锁的应用。
在STM32CubeMX中创建工程,开启递归互斥信号量,生成MDK工程文件,在“main.c”文件中添加如下参考程序。
(https://www.daowen.com)

4.仿真与调试
通过Keil-MDK和串口调试助手软件调试程序,仿真与调试效果如图14.18所示。程序运行后,通过串口监测输出信息。
任务TaskA由于优先级最高,先执行,获得递归锁。
TaskA遇到vTaskDelay(10),任务TaskB执行。TaskB由于不能获得递归锁,所以不能运行,由vTaskDelay(10)又回到TaskA执行。
TaskA获得第二次递归锁,执行求差运算,然后释放第二次递归锁。继续执行求差运算,然后释放第一次递归锁。

图14.18 仿真与调试效果
TaskA执行到最后vTaskDelay(500),调度任务TaskB执行,TaskB获得递归锁,执行求和运算,运算结束后释放递归锁。
