软件定时器
一、什么是软件定时器?
自带的定时器是硬件定时器。
硬件定时器是芯片自身提供的一个功能。一般是通过外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置的寄存器,通过对寄存器的设置,能够实现定时的功能,当到达指定的时候后,芯片中断控制器会产生一个时钟中断。然后在中断函数中触发。
定时器,是指从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义定时器的周期与频率。
软件定时器相当于是一个任务,但这个任务触发然后去调用一个函数(回调函数),在回调函数中不能设置任何阻塞的API函数。
FreeRTOS 操作系统提供软件定时器功能,软件定时器的使用相当于扩展了定时器的数量,允许创建更多的定时业务。FreeRTOS 软件定时器功能上支持:
●裁剪:能通过宏关闭软件定时器功能。
●软件定时器创建。
●软件定时器启动。
●软件定时器停止。
●软件定时器复位。
●软件定时器删除。
软件定时器有单次执行和周期执行的两种模式(相当于定闹钟的只响一次和每天都响)
-
- 软件定时器应用场景
硬件定时器不够用,定时精度不高的场合
1.2 软件定时器的精度
在软件定时器中,通常以系统节拍周期为计数单位(SysTick),系统节拍相当于人的心跳,在FreeRTOS.config中可以配置。默认设置为1000,相当于1秒可以跳1000次。跳一次1ms
二、使用软件定时器时候要注意以下几点:
●软件定时器的回调函数中应快进快出,绝对不允许使用任何可能引软件定时器起任务挂起或者阻塞的 API 接口,在回调函数中也绝对不允许出现死循环。
●软件定时器使用了系统的一个队列和一个任务资源,软件定时器任务的优先级默认为 configTIMER_TASK_PRIORITY,为了更好响应,该优先级应设置为所有任务中最高的优先级。
●创建单次软件定时器,该定时器超时执行完回调函数后,系统会自动删除该软件定时器,并回收资源。
●定时器任务的堆栈大小默认为 configTIMER_TASK_STACK_DEPTH 个字节。
三、软件定时器控制块
- 软件定时器的名称,一般调试的时候才用
- 软件定时器的列表项,用于插入定时器的列表
- 软件定时器的周期,单位是系统节拍周期,系统节拍设置为1000,相当于1ms,这个周期设置为多少,就是多少ms
- 软件定时器是否重置。如果设置为FALSE,则相当于单次模式,如果设置为TRUE,则相当于周期模式
- 软件定时器的ID,在回调函数中用来寻找是那个软件定时器。一般用于多个软件定时器调用一个回调函数。
- 软件定时器的回调函数
- 标记定时器使用的内存,删除时判断是否需要释放内存
四、API函数
软件定时器创建函数 xTimerCreate()
软件定时器启动函数xTimerStart()
软件定时器停止函数xTimerStop()
软件定时器删除函数 xTimerDelete()
软件定时器创建函数 xTimerCreate()
- 软件定时器的名称,一般只有调试的时候用
- 软件定时器的系统周期
- 用来设置软件定时器是单次还是周期
- 设置软件定时器的ID,在回调函数中进行匹配
(一个回调函数分配给多个软件定时器的时候,根据这个ID的值来处理不同的软件定时器)
- 回调函数
软件定时器启动函数xTimerStart()
软件定时器创建完成后,处于休眠状态,需要启动函数,才能开启。
由于xTicksToWait这个参数在启用调度器前不起作用,所以软件定时器启动函数需要放在启用调度器之后
可以看到有两个参数 xTimer 软件定时器的任务句柄 xTicksToWait 软件定时器启动函数把启动命令执行前的阻塞时间
由于xTicksToWait这个参数在启用调度器前不起作用,所以软件定时器启动函数需要放在启用调度器之后
- 软件定时器的句柄
- 软件定时器启动命令
- 获取当前系统的节拍
- 用户自定义阻塞的时间
xTimerStartFromISR()
软件定时器停止函数xTimerStop()
xTimerStopFromISR()
软件定时器删除函数 xTimerDelete()