绪论
软件定时器用于以后的固定时间,或以一个固定频率周期运行的函数。通过软件定时器执行的函数称为软件定时器的回调函数。软件定时器通过FREERTOS内核实施与控制,它并不需要硬件支持,与底层硬件定时器无关。
软件定时器函数是可选的,使用软件定时器需要以下操作:
1,编译源文件中的FreeRTOS/Source/timers.c 。
2,将FreeRTOSConfig.h中的 configUSE_TIMERS设置为1。
软件定时器回调函数
函数原型如下:
void ATimerCallback( TimerHandle_t xTimer );
软件定时器回调函数从头执行到尾,属于正常执行模式,执行时间应尽可能短,并不可以进入阻塞模式。
软件定时器的属性特征
1,软件定时器的周期
在两个软件定时器回调函数开始执行的之间的时间。
2,一次性与重装载软件定时器
一次性定时器:只会执行一次软件定时器回调函数,不能自己重新启动,只能用户再启动。
自动重载定时器:一旦启动,自动重载定时器将会周期性自动重新启动。从而周期性执行软件定时器回调函数。
3,软件定时器状态
休眠
执行
其图示如下:
RTOS定时器服务任务
所有的定时器回调函数均在同一个软件定时器服务任务中调用。定时器服务任务在进程调度器开始执行时自动创建而成,它的优先级以及堆栈大小通过FreeRTOSConfig.h中的configTIMER_TASK_PRIORITY和configTIMER_TASK_STACK_DEPTH来定义。
软件定时器指令队列
定时器指令队列是一个标准FREERTOS队列,并在任务调度器开始时自动创建,该队列的长度通过FreeRTOSConfig.h中的configTIMER_QUEUE_LENGTH来定义。
运行的大致原理如下所示:
定时器服务任务类似于一般任务受任务调度器调度。当他的优先级足够高时,它仅运行进程指令与执行定时器回调函数。
实例
当定时器服务函数优先级低于一般任务时,其过程如下:
在t1时,任务一优先级最高,定时器任务处于阻塞状态。
t2时刻,任务一调用xTimerStart(),xTimerStart()发送指令给定时器队列,使得定时器服务函数退出阻塞状态,由于定时器服务函数优先级低于任务一,故定时器服务函数处于ready状态。
t3时刻任务一执行完xTimerStart()函数。依旧处于运行态。
t4任务一进入阻塞状态,此时开始执行定时器服务函数。然后定时器服务函数开始处理队列中命令。
注意:软件定时器开始的时间是从任务发送开启一个定时器到队列的指令时间,而不是定时器服务函数收到开启定时器指令的时间。
t5时刻定时器服务函数处理完指令进入阻塞状态。
当定时器服务任务优先级高于一般任务时,其过程如下所示:
t2时刻任务一调用xTimerStart(),从而将指令发送到定时器队列(注意是刚将指令放入到队列,但xTimerStart()还没执行完),此时由于定时器服务任务优先级较高,故会抢占CPU,从而开始指令定时器任务直到执行完进入阻塞状态。
创建与启动软件定时器
xTimerCreate()
该函数用于创建一个软件定时器,可以在任务调度器前执行,也可以在某一任务中执行。其函数原型如下:
TimerHandle_t xTimerCreate( const char * const pcTimerName,
TickType_t xTimerPeriodInTicks,
UBaseType_t uxAutoReload,
void * pvTimerID,
TimerCallbackFunction_t pxCallbackFunction );
参数:
pcTimerName:定时器名字,方便与调试,内核不需要。
xTimerPeriodInTicks:定时器周期。
uxAutoReload:是否重装载,pdTRUE表重装载,pdFALSE表一次性。
pvTimerID:定时器ID,当一个回调函数被多个定时器使用时,可以用于提供不同存储空间。
pxCallbackFunction :定时器回调函数
返回值:返回NULL表示空间不足以创建,从而创建失败。非空表示创建成功,返回值为创建成的定时器的句柄。
xTimerStart()
该函数用于启动一个处于休眠状态的定时器,或复位一个处于运行状态的定时器。xTimerStop() 被用于停止一个处于运行状态的定时器。
其函数原型如下:
BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );
相关参数&