1、软件定时器简介
定时器
从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可自定义定时器周期,闹钟大家都用过吧。
硬件定时器
芯片本身自带的定时器模块,硬件定时器的精度一般很高,每次在定时时间到达之后就会自动触发一个中断,用户在中断服务函数中处理信息。
软件定时器
是指具有定时功能的软件,可设置定时周期,当指定时间到达后要调用回调函数(也称超时函数),用户在回调函数中处理信息。
软件定时器的优缺点
优点
硬件定时器数量有限,而软件定时器理论上只需有足够内存,就可以创建多个。
使用简单,成本低。
缺点
软件定时器相对硬件定时器来说,精度没有那么高(因为它以系统时钟为基准,系统时钟中断优先级又是最低,容易被打断)。
FreeRTOS软件定时器特点
可裁剪:软件定时器是可裁剪可配置的功能,如果要使用软件定时器,需要将configUSE_TIMERS配置为1。
单次和周期:软件定时器支持设置成:单词定时器或周期定时器。
注意:软件定时器的超时回调函数是由软件定时器服务任务调用的,软件定时器的超时回调函数本身不是任务,因此不能在该回调函数中使用可能会导致任务阻塞的API函数。
软件定时器服务任务
在调用函数vTaskStartScheduler()开启任务调度器的时候,会创建一个用于管理软件定时器的任务,这个任务就叫做软件定时器服务任务。
软件定时器服务任务的作用
(1)负责软件定时器超时的逻辑判断。
(2)调用超时软件定时器的超时回调函数。
(3)处理软件定时器命令队列。
软件定时器的命令队列
FreeRTOS提供了许多软件定时器相关的API函数,这些API函数大多都是往定时器的队列中写入消息(发送命令),这个队列叫做软件定时器命令队列,是提供给FreeRTOS中的软件定时器使用的,用户是不能直接访问的。
软件定时器的相关配置
当FreeRTOS的配置项configUSE_TIMERS设置为1,在启动任务调度器时,会自动创建软件定时器的服务/守护任务prvTimerTask()。
软件定时器服务任务的优先级为configTIMER_TASK_PRIORITY = 31。
定时器的命令队列长度为configTIMER_QUEUE_LENGTH = 5 。
注意:软件定时器的超时回调函数是在软件定时器服务任务中被调用的,服务任务不是专为某个定时器服务的,它还要处理其他定时器。
so,定时器的回调函数不要影响其他定时器:
1.回调函数要尽快实行,不能进入阻塞状态。
2.访问队列或者信号量的非零阻塞时间的API函数也不能调用。
2、软件定时器的状态
软件定时器共有两种状态:
休眠态:软件定时器可以通过其句柄被引用,但因为没有运行,所以其定时超时回调函数不会被执行。
运行态:运行态的定时器,当指定时间到达之后,它的超时回调函数会被调用。
注意:新创建的软件定时器处于休眠状态,也就是未运行的。
3、单次定时器和周期定时器
单次定时器:单次定时器一旦定时超时,只会执行一次其软件定时器超时回调函数,不会自动重新开启定时,不过可以被手动重新开启。
周期定时器:周期定时器一旦启动以后就会在执行完回调函数以后自动的重新启动,从而周期地执行其软件定时器回调函数。