本帖最后由 霸王猫 于 2020-8-7 21:55 编辑
FreeRTOS要求使用消息队列时必须满足如下条件:生产者生产速度小于消息者消息速度。
现今有以下要求:
1、单片机和手机APP进行MODBUS通信,手机APP为MODBUS主站,单片机为MODBUS从站。
2、单片机采集传感器信息上传给手机APP。
3、单片机规划2个任务。任务1为传感器任务,任务2为MODBUS任务(MODBUS任务负责将数据上传给手机APP软件)。
4、传感器任务(任务1)每隔1秒采集1次传感器数据,然后发送到消息队列
5、MODBUS任务(任务2)收到手机APP的请求信号量后,从消息队列中取出传感器数据,通过MODBUS-TCP传输手机APP软件。
6、单片机一直上电运行
7、工人随机巡查设备时,打开手机APP软件读取单片机设备的运行数据,可以观察设备的运行状态,巡查完毕,关闭手机APP软件。
调试时发现刚刚打开手机APP软件时,观察到的传感器数据是很久之前采集的数据,需要等一会才会显示最近采集的数据。
分析原因可能是因为由于传感器任务每隔1秒钟往消息队列发送消息,而由于消费者(MODBUS任务)在这期间一直都不取走消息(因为这段时间没有人来巡查设备),导致消息队列早就已经装满了,
因此某个时间段内当巡查员打开手机APP软件巡查时,观察到的数据就是消息队列早期采集到的传感器数据。
当MODBUS任务将消息队列中存储的很久之前采集的传感器数据消费完毕后,这时候消息队列里才会装最近采集的数据,手机APP主页画面上才会显示最近采集的传感器数据。
请问:对于生产者周而复始不停的生产,而无法确定消费者何时消费的场景,该如何解决呢?
|