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