摘要
??单片机的裸机编程中,如果有多个执行频率不同或需要有一定间隔时间执行的任务,一般使用中断或延时的方式安排任务的执行顺序。但中断函数中不能放置执行时间比较长的任务,会影响其他中断的响应,而在大循环中以软件延时的方式,是一种阻塞式程序,对其他功能的影响非常大,很不推荐。这里我推荐一种多任务的执行方式。 ??这种方式是使用定时器产生一个1ms的时基,为每一个任务创建一个任务时间戳,在定时器中断中,对每一个任务时间戳进行累加。在主循环中,对每一个任务的任务时间戳进行判断是否大于等于任务间隔时间,如果是则清空此任务时间戳,并执行此任务。
优点:每次执行任务的间隔基本是相同的。不会出现任务间隔时间变化。并且每个周期任务必定会被执行一次。 缺点:需要为每一个任务创建一个任务时间戳,
??也可以只创建一个时间戳作为系统时间,定时器中断中每隔1ms对这个时间戳进行一次自增,在主循环中对时间戳进行取余运算,如果时间戳与任务间隔时间取余为0,则执行该任务。
优点:只需要创建一个时间戳。 缺点:
- 容易出现当上一个任务执行时间过长时,错过下一个任务的时间点。出现某个周期任务不执行,执行周期延长等问题。
- 当时间戳出现数据溢出清零0,溢出前执行过的任务与溢出后再次执行之间的间隔过长或过短。
应用举例
??这里我以三个任务为例。分别间隔500ms,1000ms,1500ms通过串口发送数据为例。
- 首先创建三个任务时间戳。并做外部声明。
![在这里插入图片描述](https://img-blog.csdnimg.cn/bda8f764a67840f09b1d895ea471a13a.png) - 在配置好的1ms定时器中断中,对这三个时间戳自增。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f34ff4dfb96c44c8a03872ccd6ce2a02.png) - 在主循环中对三个时间戳进行判断
![在这里插入图片描述](https://img-blog.csdnimg.cn/5acc5876f8a04e178d05dd8cf21e506a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5qyn6Ziz552_,size_19,color_FFFFFF,t_70,g_se,x_16) - 下载执行后可见,任务1没执行两次,执行一次任务2,每执行3次任务1,执行一次任务3。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d05bf73351314d2c8a5b973771ba5788.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5qyn6Ziz552_,size_20,color_FFFFFF,t_70,g_se,x_16)
|