文章目录
- 14. FreeRTOS软件定时器
- 1. 软件定时器的简介
- 2. 软件定时器的状态
- 3. 单次定时器和周期定时器
- 4. 软件定时器结构体成员
- 5. 软件定时器相关API函数
- 6. 软件定时器实验
14. FreeRTOS软件定时器
1. 软件定时器的简介
-
硬件定时器与软件定时器:
-
软件定时器的优缺点:
- 优点:
- 硬件定时器数量有限,而软件定时器理论上只需有足够内存,就可以创建多个;
- 使用简单、成本低。
- 缺点:
- 软件定时器相对硬件定时器来说,精度没有那么高(因为它以系统时钟为基准,系统时钟中断优先级又是最低,容易被打断)。 对于需要高精度要求的场合,不建议使用软件定时器。
- 优点:
-
FreeRTOS软件定时器的特点:
- 可裁剪:软件定时器是可裁剪可配置的功能, 如果要使能软件定时器,需将
configUSE_TIMERS
配置项配置成 1 - 单次和周期:软件定时器支持设置成,单次定时器或周期定时器
- 可裁剪:软件定时器是可裁剪可配置的功能, 如果要使能软件定时器,需将
-
软件定时器服务任务:
-
软件定时器命令队列:
-
软件定时器的相关配置:
注意: 软件定时器的超时回调函数是在软件定时器服务任务中被调用的,服务任务不是专为某个定时器服务的,它还要处理其他定时器。
所以,回调函数要尽快实行,不能进入阻塞状态,即不能调用那些会阻塞任务的 API 函数,如:vTaskDelay() ;访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。
2. 软件定时器的状态
软件定时器共有两种状态:
- 休眠态:软件定时器可以通过其句柄被引用,但因为没有运行,所以其定时超时回调函数不会被执行;
- 运行态:运行态的定时器,当指定时间到达之后,它的超时回调函数会被调用。
新创建的软件定时器处于休眠状态 ,也就是未运行的!
3. 单次定时器和周期定时器
- FreeRTOS 提供了两种软件定时器:
-
单次定时器:单次定时器一旦定时超时,只会执行一次其软件定时器超时回调函数,不会自动重新开启定时,不过可以被手动重新开启。
-
周期定时器:周期定时器一旦启动以后就会在执行完回调函数以后自动的重新启动 ,从而周期地执行其软件定时器回调函数。
-
软件定时器的状态转换图:
4. 软件定时器结构体成员
5. 软件定时器相关API函数
-
相关API函数
函数 描述 xTimerCreate() 动态方式创建软件定时器 xTimerCreateStatic() 静态方式创建软件定时器 xTimerStart() 开启软件定时器定时 xTimerStartFromISR() 在中断中开启软件定时器定时 xTimerStop() 停止软件定时器定时 xTimerStopFromISR() 在中断中停止软件定时器定时 xTimerReset() 复位软件定时器定时 xTimerResetFromISR() 在中断中复位软件定时器定时 xTimerChangePeriod() 更改软件定时器的定时超时时间 xTimerChangePeriodFromISR() 在中断中更改定时超时时间 -
创建软件定时器API函数
-
开启软件定时器API函数
-
停止软件定时器API函数
-
复位软件定时器API函数
-
更改软件定时器超时时间API函数
6. 软件定时器实验
-
创建任务:
-
软件定时器句柄和定义:
//软件定时器句柄 TimerHandle_t timer1_hanle = 0; TimerHandle_t timer2_hanle = 0;//软件定时器创建 timer1_hanle = xTimerCreate("timer1", 1000, pdFALSE, (void *)1, timer1_callback); timer2_hanle = xTimerCreate("timer2", 1000, pdTRUE, (void *)2, timer2_callback);
-
任务一:按键扫描并控制软件定时器:
void task1(void* pvParamter) {uint8_t key = 0;while(1){key = key_scan(0);if(key == KEY0_PRES){xTimerStart(timer1_hanle, portMAX_DELAY);xTimerStart(timer2_hanle, portMAX_DELAY);}if(key == KEY1_PRES){xTimerStop(timer1_hanle, portMAX_DELAY);xTimerStop(timer2_hanle, portMAX_DELAY);}vTaskDelay(10);![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/167e1f8ebbd74175b5b91af08fb3407a.png#pic_center)} }
-
软件定时器回调函数:
void timer1_callback(TimerHandle_t pxTimer) {static uint32_t timer = 0;printf("timer1的运行次数:%d\r\n",++timer); }void timer2_callback(TimerHandle_t pxTimer) {static uint32_t timer = 0;printf("timer2的运行次数:%d\r\n",++timer); }
-
实验结果: