-
单纯的使用串口中断,成功接收一个数,触发中断,在中断函数中将数据读出,这种方法如果在串口接收数据没有处理完后,串口又来了新的数据,新的数据就会覆盖尚未处理完的数据,就会丢包,因为数据没有缓存;如果使用数字来接收数据,每收到一个数据,数组下标偏移,虽然一定程度上起到了缓存的效果,但是数组的空间会一直占用,即使已经处理的数据仍然会占用数据空间。因此使用作者的环形队列可以比较好的解决这两个问题。
-
任务1,按键扫描,时间片定时去检测按键,识别到的按键值放到按键FIFO消息队列
任务2,任务处理,从按键队列中获取消息,如果按键消息队列中数据变化就进行处理,否则等待
任务3,显示任务,定时刷新显示内容
-
vTaskDelay是相对延时函数,当函数调用vTaskDelay函数后就会进入阻塞状态。当进入阻塞状态后,其他任务就会被执行。
1、在阻塞的情况时,优先级高的出现等待信号量或者消息队列,必须到达指定的timeout后才能被抢占
2、在任务执行时,发生了中断或者被高优先级任打断,那么任务的执行时间就会边长,而等执行vTaskDelay()时,相对时间不会改变,所以总时间变长
-
任务的切换主要是对栈的开销,保存任务时将此任务的寄存器压入这个任务的独立栈中,切换到下一个任务,将此任务从栈中弹出,将任务的寄存器弹入到CPU中
-
自动售卖机
1、人机交互任务:按键扫描,LCD显示,声音反馈,优先级较低
2、无线数据传输任务:wifi模块GPS模块,检测服务器是否离线,切换运营商网络等,优先级最高
3、串口数据传输任务:需要发送一帧数据时,该任务被创建,并且监听返回的数据,若超时未收到数据回复,重发,大于重发次数及接收数据完成后任务删除,优先级较高。
4、串口数据接收任务:时间片轮询串口接收缓存区,解析数据,并创建动作执行任务,优先级较高。
5、动作执行任务:此任务被创建后,根据指令执行相应的动作,比如电机运动,电磁阀。
有点是以后项目更改或扩充功能,只需要增加新的任务,便于维护
-
主要看触点容量