目录
一、软件定时器简介
1、软件定时器概述
2、编写回调函数的注意事项
二、软件定时器实现机制
1、软件定时器实现机制
2、软件定时器相关配置
三、单次定时器
四、周期定时器
五、软件定时器的基本操作
1、创建软件定时器
2、复位软件定时器
3、开启软件定时器
4、停止软件定时器
六、软件定时器实验
1、在初始化处创建软件定时器
2、实现对应的回调函数
3、在控制任务里面控制软件定时器
一、软件定时器简介
1、软件定时器概述
软件定时器允许设置一段时间,当设置的时间到达之后就执行定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期。简而言之,当定时器的定时周期到了以后就会执行回调函数。
2、编写回调函数的注意事项
软件定时器的回调函数是在定时器服务任务中执行的,所以一定不能在回调函数中调用任何会阻塞任务的API函数!比如,定时器回调函数中千万不能调用vTaskDelay、vTaskDelayUnti(),还有一些访问队列或者信号量的非零阻塞时间的API函数也不能调用。
二、软件定时器实现机制
1、软件定时器实现机制
FreeRTOS提供了很多定时器有关的API函数,这些API函数大多都使用FreeRTOS的队列发送命令给定时器服务任务。这个队列叫做定时器命令队列。定时器命令队列是提供给FreeRTOS 的软件定时器使用的,用户不能直接访问!
在这个例子中,应用程序调用了函数xTimerReset(),结果就是复位命令会被发送到定时器命令队列中,定时器服务任务会处理这个命令。应用程序是通过函数 xTimerReset间接的向定时器命令队列发送了复位命令,并不是直接调用类似xQueueSend()这样的队列操作函数发送的。
2、软件定时器相关配置
相关的配置放到文件 FreeRTOSConfig.h 中的,涉及到的配置如下:
(1)configUSE_TIMERS
如果要使用软件定时器的话宏configUSE_TIMERS一定要设置为1,当设置为1的话定时器服务任务就会在启动FreeRTOS调度器的时候自动创建。
(2)configTIMER_TASK_PRIORITY
设置软件定时器服务任务的任务优先级,可以为 0-( configMAX_PRIORITIES-1)。 优先级一定要根据实际的应用要求来设置。 如果定时器服务任务的优先级设置的高的话,定时器命令队列中的命令和定时器回调函数就会及时的得到处理。
(3)configTIMER_QUEUE_LENGTH
此宏用来设置定时器命令队列的队列长度。
(4)configTIMER_TASK_STACK_DEPTH
此宏用来设置定时器服务任务的任务堆栈大小,单位为字,不是字节!,对于STM32来说一个字是4字节。 由于定时器服务任务中会执行定时器的回调函数,因此任务堆栈的大小一定要根据定时器的回调函数来设置。
三、单次定时器
单次定时器的定时器回调函数就执行一次,比如定时1s,当定时时间到了以后就会执行一次回调函数,然后定时器就会停止运行。 对于单次定时器我们可以再次手动重新启动(调用相应的API函数即可),但是单次定时器不能自动重启。
四、周期定时器
周期定时器一旦启动以后就会在执行完回调函数以后自动的重新启动,这样回调函数就会周期性的执行。
五、软件定时器的基本操作
1、创建软件定时器
使用软件定时器之前要先创建软件定时器,软件定时器创建函数如下表所示:
2、复位软件定时器
有时候我们可能会在定时器正在运行的时候需要复位软件定时器,复位软件定时器的话会重新计算定时周期到达的时间点,FreeRTOS 提供了两个 API 函数来完成软件定时器的复位,如下表所示:
3、开启软件定时器
如果软件定时器停止运行的话可以使用FreeRTOS提供的两个开启函数来重新启动软件定时器,这两个函数如下表所示:
4、停止软件定时器
既然有开启软件定时器的API函数,那么肯定也有停止软件定时器的函数, FreeRTOS也提供了两个用于停止软件定时器的API函数,如下表所示: