一、定时器理论
1.1 实现原理
定时器是一种允许在特定时间间隔后或在将来的某个时间点触发一个超时事件。定时器分为硬件定时器和软件定时器:
硬件定时器: 由外部晶振提供给芯片输入时钟,我们可以通过配置寄存器来设置定时器的计数方向、定时模式、中断触发等
软件定时器: 是由操作系统提供的一类系统接口,构建在硬件定时器基础之上,软件定时器在 FreeRTOS 的任务调度机制之上运行。 当软件定时器指定时间到达后,FreeRTOS 将调用用户定义的回调函数来处理
软件定时器内部有一个结构体
struct {
函数指针(回调函数)
超时时间
属性(一次性/周期性)
}
所以软件定时器有一个链表,系统新激活的定时器会以超时时间升序的方式插入到链表中,在sysTick中断中处理链表,判断是否超时来处理链表中的定时器任务
其他操作系统是直接在硬件中断里面处理回调函数,而在FreeRTOS中考虑到回调函数效率问题,当发现有超时定时器,他会把定时器写入一个TimerQueue,单独用一个定时器任务来处理定时器
1.2 定时器创建和使用
回调函数
pxCallbackFunction
可以使用pvTimerID
分辨是哪个定时器
返回值: 成功则返回TimerHandle_t
, 否则返回NULL
TimerHandle_t xTimerCreate( const char * const pcTimerName,
const TickType_t xTimerPeriodInTicks,
const UBaseType_t uxAutoReload,
void * const pvTimerID,
TimerCallbackFunction_t pxCallbackFunction );
在RTOS中,每隔一个固定的时间产生中断,中断函数里面可以去判断定时器时间有没有超时,超时后就唤醒守护任务去执行回调函数