FREERTOS指令测试的思考
采用freertos编程后,有必要增加指令测试的功能:
1、便于对于软件各个子模块或功能点进行测试。
2、便于对硬件各个功能点是否正常进行测试。
在裸机编程中,我们一般使用串口进行运行数据的打印,同时使用串口接收上位机的控制命令,这样做当然是有局限性的,一方面,如果功能复杂,资源有限,所以的串口都被占用,则无法使用串口进行测试命令的收发,另一方面,测试命令并不一定通过串口传输,也可以通过CAN USB等接口。由于在freertos中,各个功能是模块化的,常见的思路是通过消息队列或者信号量由测试入口发送测试命令给各个测试单元,例如:
1、使用xQueueSend从中断消息中发送到的FIFO中读出发送的控制命令
2、TASK1使用xQueueReceive读取消息队列
3、TASK2使用xQueueReceive读取消息队列
问题在于,使用xQueueReceive读取消息队列对于消息来说是一次性的,如果TASK1读取了,TASK2就无法读取,可能的结果是消息队列内的消息对TASK1没有用处但是被TASK1读取了;TASK2需要消息队列内的控制命令,但是读取到的消息队列内容却是空的。在FREERTOS中,还有另外一个消息队列读取方法xQueuePeek,该方法读取消息队列后,消息仍在队列中,不影响其他任务对消息队列中数据的订阅。
综上,一发多收应用场景下,消息队列的使用方法如下:
1、发送任务中,使用xQueueSend发送控制命令;为了防止消息队列的写满溢出或堵塞,在每次填充消息队列前,使用xQueueReset方法将消息队列清空。
2、TASK1使用xQueuePeek读取消息队列,如果读取到的控制命令是针对自身任务测试的,则执行。否则,只获取消息,不执行消息,也不影响当前的消息队列。
3、TASK2使用xQueuePeek读取消息队列,如果读取到的控制命令是针对自身任务测试的,则执行。否则,只获取消息,不执行消息,也不影响当前的消息队列。
当然,在使用消息队列前,不要忘记先要创建消息队列。

浙公网安备 33010602011771号