FreeRTOS 软定时器
软定时器不需要硬件支持,完全由FreeRTOS内核控制。软件定时器不会占用任何处理时间除非调用。
配置
使用软定时器需要进行如下配置:
回调函数 Software Timer Callback Functions
注意,回调函数不能包含可能造成阻塞态的任务,比如说延时函数!
当调用xQueueReceive()队列接收函数时,需要将等待时间设置为0!
属性和状态 Attributes and States of a Software Timer
定时器周期 Period of a Software Timer
单次/周期定时器 One-shot and Auto-reload Timers
- One-shot
开启后,只能执行一次 - Auto-reload
开启后,以周期重新加载计数值
状态 Software Timer States
- Dormant
句柄存在但是回调函数不可用 - Running
句柄存在且回调函数正常执行
上下文 The Context of a Software Timer
The RTOS Daemon (Timer Service) Task
在调度器启动后,系统会自动创建一些任务。比如说,Idle Task;
Daemon Task也是系统自动创建的任务,他负责软定时器功能的实现。
软定时器命令队列 The Timer Command Queue
软定时器API通过定时器命令队列(timer command queue)从调用任务发指令给Daemon Task。这个队列是自动创建的。队列长度通过configTIMER_QUEUE_LENGTH设置。
Daemon 任务调度 Daemon Task Scheduling
Daemon task只处理命令或者时定时器回调函数,他以最高优先级运行。
创建和启用定时器
xTimerCreate()
xTimerStart()
示例
定时器ID The Timer ID
当定时器创建时,会被分配一个初始ID,可以通过API进行修改。
vTimerSetTimerID() 设置定时器ID
pvTimerGetTimerID() 获取ID
示例
改变定时器周期
xTimerChangePeriod()
用来改变已经创建的定时器的周期
比如说,LED运行状态指示灯等
示例
重置定时器 Resetting a Software Timer
重置定时器就是重置其计数值,如图
xTimerReset()
示例