|
|
|
|
|
|
软件定时器的AT91微处理器实现 |
|
日期:2009-6-12 9:45:07 |
本文介绍了一种在AT91微处理器上通过单链表实现的软件定时器的设计方法。 软件定时器是一组定时器实体的集合,是一种针对不同定时服务进行统一管理的多任务链表类型数据结构。 软件定时器可使系统在某一确定时刻执行指定操作。资源多,定时时间长,使用灵活,实现起来简单方便,因而在复杂系统或定时器工作方式比较复杂的应用场合更能体现其价值。AT91R40008是的定时器/计数器模块含有三个完全相同的16位定时器/计数器通道。每个通道都能独立编程来完成多种功能。每个通道有三个外部时钟输入、5个内部时钟输入和2个可由用户配置的多功能I/O。此外,每个通道还可驱动一个内部信号,以通过A-IC产生处理器中断。每个模式下通常有三种类型的内部触发和一个外部触发。 一、软件定时器的实现 由于AT91R40008特性限制了定时器/计数器单次最长的定时时间。为此,本文采用改进的单链表方式组织定时器链表,这样,在定时器中断上,硬件定时器不再周期性地产生中断请求,而只在用户预先指定的时刻产生,同时将下一次中断发生时间动态写入硬件定时器。软件定时器的实现可通过各种函数来实现,主要有定时器驱动函数、定时器的初始化函数、定时器任务函数、定时器的启动和关闭函数、定时器的添加和删除函数以及定时器中断处理函数等。 二、定时器初始化 软件定时器可通过一个16位定时器/计数器来提供定时中断,然后关闭定时器/计数器相应的中断并设置相关参数,然后打开相应的中断来完成。定时器初始化函数主要是初始化定时器单链表,给定时器单链表分配一块内存单元;该函数将设置一个头结点,这个头结点包含定有时器链表中定时器单元个数、定时器单元句柄以及指向单链表队列的头指针。然后创建一个定时器任务,以作为定时器到期时的执行函数。 三、定时器的启动和关闭 定时器启动函数可通过设置定时器寄存器TC_RC(TC寄存器)和TC_CCR(TC通道控制寄存器)来实现,而定时器关闭函数则可通过TC_CCR(TC通道控制寄存器)和TC_SR(TC状态寄存器)来执行。 四、定时器的添加和删除 在定时器添加函数中,需要判断新加的定时器所要插入的位置。插入时,如果链表为空,则直接插入第一个节点位置;否则,需要将新加的定时器值与链表中其余元素做一个比较,以找到新加的定时器在链表中的合适位置,同时相应修改自身的定时值。在定时器中断处理函数中,首先要求得逝去的定时器ticks值。然后将这个值与定时器队列的第一个定时器节点做比较,以判断第一个定时器节点是否定时时间到。 五、定时器任务 在定时器任务中设置有一个无限循环等待,可创建一个定时器等待消息队列,以等待定时消息的到来。定时器消息到时,即执行这个定时消息所对应的任务,同时释放该函数定时器所占用的定时器单元节点,然后开始下一轮循环。
|
|
|
|
|
|
|