阅读背景:

旧文备份:利用一个定时器实现多个虚拟定时器的两种方法

来源:互联网 
  1. 固定周期法

    使用一个硬件定时器进行固定周期(比如1ms)定时,用一个结构体数组作为软定时器描述表,数组的结构体数就是最大虚拟定时器的数量,每个结构体的成员都包括虚拟定时器状态(空闲、激活、运行、超时触发、周期触发)、定时值(换算成定时周期数,例如1ms的硬件定时周期,现进行125ms的定时,定时值就是125)、标识ID和回调函数等;用一个变量作为定时周期计数器,每次进入定时中断,重置定时器,扫描结构体数组中的每个成员结构体,对定时值做减一操作,然后判断该定时值是否为0,是则判定该值对应的虚拟定时器定时时间到,调用相应的回调函数进行相应的处理。如此往复。比如有三个定时需求,分别是30ms、80ms、62ms,硬件定时周期1ms且随系统初始化后一直运行,在每次定时中断后去扫描那个结构体数组,在某次定时中断退出后不久,30ms定时任务来了,找一个结构体初始化激活其状态置定时值30,又一次硬件定时中断到,置该结构体状态为运行,开始定时,又经过14个硬件定时周期,该定时值变为15,此时第二个定时任务来了,新开虚拟定时器结构体置定时值80并将其状态置位激活,又经过10个定时周期,这两个结构体定时值分别为5和71,这时第三个定时任务来了,同上再激活一个成员结构体并置定时值62,然后又5个硬件定时周期中断后30ms定时到期,置对应结构体状态空闲释放该虚拟定时器并通过设置的回调函数指针调用回调函数,此时还剩2个定时任务在运行,一个值为66,另一个值为58,再经过58和66个硬件定时周期后定时任务都执行完毕,至此描述了一个利用固定硬件定时周期来执行多个定时任务的典型过程,在这里有两个问题,一是虚拟定时器激活后在下一个硬件定时中断后才会开始运行,也就是说有可能有接近一个硬件定时周期的定时误差(延迟),如果没有激活态直接运行则也有可能是一个硬件定时周期的定时误差(提前),总之这种方法一定会有一个硬件周期的定时误差;第二个问题是在定时中断中进行结构体数组扫描、运算以及有可能的回调函数的执行会消耗CPU指令周期的,势必会使定时中断函数执行时间变长有可能影响其他中断响应,因此要注意在该硬件中断中开全局中断,允许其他中断响应,并且硬件定时器值重置要一进中断就重置以免影响硬件定时周期的精度,还有必须保证在硬件定时周期内执行完这个中断程序,以避免中断重入。 使用一个硬件定时器进行固定周期(比如1m




你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: