14.2.4 计数信号量应用:停车场车辆流量统计
1.任务要求
利用STM32F1和FreeRTOS设计一个停车场车辆流量统计应用,要求能够实时统计停车场车辆信息,用LED灯模拟车辆进出,用按键模拟道闸检测,并将信息通过串口发送到计算机。要求用计数信号量进行设计。
2.硬件设计
硬件电路图参考图14.12。LED灯表示车辆进出指示,如灯亮表示车进入停车场,反之表示停车场已满。KEY表示停车场道闸,KEY=0,表示车辆可进入。
3.软件设计
设一个停车场最多能停10辆车,设计一个任务Task1_Take模拟车辆出场,另一个任务Task2_Give模拟车辆进场;用计数信号量来实现两任务之间的通信,实时统计当前停车场信息,若计数信号量的值满(即10辆车已停满)则不能进入,否则可以进入。
CountSem_Handle=xSemaphoreCreateCounting(10,10),创建一个最多能容纳10辆车的停车场,第一个10为最大容量,第二个10为初始状态。
Task1_Take为获得一个信号量的任务,即信号量减1表示空出一个车位。(https://www.daowen.com)
Task2_Give为释放一个信号量的任务,即信号量加1表示可以进入一辆车。
在STM32CubeMX中创建工程文件,设置“SYS”的“Timbase Source”为TIM2;配置GPIO引脚PB0、PB10、PA2、PA3;配置Middleware,设置FreeRTOS,使能计数信号量,其他内核参数、存储器管理等采用默认设置即可。在“main.c”文件中添加如下参考程序。


4.仿真与调试
程序设计好后进行编译,可通过Keil-MDK模拟仿真,也可下载到开发板观察程序运行情况,仿真与调试效果如图14.14所示。创建任务,信号量值满,表示有10辆车(第二行);高优先级任务Task1_Take先执行,获取一个信号量,即空出一个车位,当前车位为9(第四行),执行完成后,由于延时阻塞,任务Task2_Give执行;当前信号量计数值为9,未满,因此释放一个信号量,即增加一辆车,当前车位为10(第六行)。如此循环,实现任务的同步。

图14.14 仿真与调试效果