freeRtos学习笔记
freeRtos软件定时器
软件定时器需要注意事项
- 软件定时器的精度基于时钟节拍,例如系统时钟节拍为10ms, 软件定时器定时时间必须是10ms的整数倍,因此软件定时器一般用于对时间精度要求不高的地方。
- 软件定时器底层也是一个任务,只不过这个任务是freertos自己创建的,和空闲任务类似,因此软件定时器回调函数会被打断,在使用时注意配置好软件定时器任务的优先级,最好优先级高一点。并且千万不要在定时器回调函数中使用延时等导致任务挂起或者杜塞的API,这样会影响定时器任务,从而影响所有定时器回调函数
- 软件定时器可以创建多个,但是会消耗RAM资源,需要配置好对应的堆栈空间。
软件定时器创建
TimerHandle_t xTimerCreate(const char * const pcTimerName, /* 定时器名称 方便调试*/
const TickType_t xTimerPeriod, /* 定时器周期 单位系统节拍*/
const UBaseType_t uxAutoReload, /* 定时器模式 是否周期性*/
void * const pvTImerID, /* 定时器ID 方便多个定时器使用相同回调函数时,进行区分*/
TImerCallbackFunction_t pxCallbackFunction); /* 回调函数*/
定时器创建函数
- 第一个参数时定时器名称,方便调试时识别不同定时器
- 第二个参数为定时器周期,单位为系统节拍
- 第三个参数为定时器模式,如果为pdTRUE 则该定时器为周期模式 如果为pdFALSE 则为单次模式
- 第四个参数为定时器ID,当多个定时器公用同一个回调函数时,回调函数中可以根据ID进行区分当前为那个定时器
- 第五个参数为定时器回调函数。
- 返回值:创建成功会返回定时器句柄,否则如果heap内存不够返回NULL
软件定时器开始
BaseType_t xTimerStart(TimerHandle_t xTimer, /* 定时器句柄 */
TickType_t xBlockTime); /* 成功启动定时器前的最大等待时间 单位系统节拍 */
BaseType_t xTimerStartFromISR(TimerHandle_t xTimer,
BaseType_t *pxHigherPriorityTaskWoken
);
软件定时器启动函数
- 第一个参数是定时器句柄
- 第二个参数是成功启动定时器前的最大等待时间 单位系统节拍,软件定时器底层也是一个任务,定时器启动其实最终是给定时器任务发送一个消息,消息队列长度通过 configTIMER_QUEUE_LENGTH配置,当消息队列已满,则会进行等待。定时器任务实际执行消息队列发来的命令依赖于定时器任务的优先级,如果定时器任务是高优先级会及时得到执行, 如果是低优先级,就要等待其余高优先级任务释放 CPU 权才可以得到执行,此参数就是设置最大等待时间的。
- 第二个参数在中断中的定时器启动函数其实就是给定时器任务发送一条消息,发送该任务后,定时器任务从堵塞态进入就绪态,如果定时器任务优先级比当前运行的任务优先级高,则pxHigherPriorityTaskWoken为pdTRUE,在中断结束时可以进行任务切换。
- 返回值 返回 pdFAIL 表示此函数向消息队列发送消息失败,返回 pdPASS 表示此函数向消息队列发
送消息成功。
软件定时器停止
BaseType_t xTimerStop( TimerHandle_t xTimer,
TickType_t xBlockTime );
BaseType_t xTimerStopFromISR
(
TimerHandle_t xTimer,
BaseType_t *pxHigherPriorityTaskWoken
);
软件定时器停止函数
- 第一个参数是定时器句柄
- 第二个参数是成功启动定时器前的最大等待时间 单位系统节拍,软件定时器底层也是一个任务,定时器启动其实最终是给定时器任务发送一个消息,消息队列长度通过 configTIMER_QUEUE_LENGTH配置,当消息队列已满,则会进行等待。定时器任务实际执行消息队列发来的命令依赖于定时器任务的优先级,如果定时器任务是高优先级会及时得到执行, 如果是低优先级,就要等待其余高优先级任务释放 CPU 权才可以得到执行,此参数就是设置最大等待时间的。
- 第二个参数在中断中的定时器启动函数其实就是给定时器任务发送一条消息,发送该任务后,定时器任务从堵塞态进入就绪态,如果定时器任务优先级比当前运行的任务优先级高,则pxHigherPriorityTaskWoken为pdTRUE,在中断结束时可以进行任务切换。
- 返回值 返回 pdFAIL 表示此函数向消息队列发送消息失败,返回 pdPASS 表示此函数向消息队列发
送消息成功。
软件定时器复位
BaseType_t xTimerReset( TimerHandle_t xTimer,
TickType_t xBlockTime );
BaseType_t xTimerResetFromISR
(
TimerHandle_t xTimer,
BaseType_t *pxHigherPriorityTaskWoken
);
软件定时器复位函数
- 第一个参数是定时器句柄
- 第二个参数是成功启动定时器前的最大等待时间 单位系统节拍,软件定时器底层也是一个任务,定时器启动其实最终是给定时器任务发送一个消息,消息队列长度通过 configTIMER_QUEUE_LENGTH配置,当消息队列已满,则会进行等待。定时器任务实际执行消息队列发来的命令依赖于定时器任务的优先级,如果定时器任务是高优先级会及时得到执行, 如果是低优先级,就要等待其余高优先级任务释放 CPU 权才可以得到执行,此参数就是设置最大等待时间的。
- 第二个参数在中断中的定时器启动函数其实就是给定时器任务发送一条消息,发送该任务后,定时器任务从堵塞态进入就绪态,如果定时器任务优先级比当前运行的任务优先级高,则pxHigherPriorityTaskWoken为pdTRUE,在中断结束时可以进行任务切换。
- 返回值 返回 pdFAIL 表示此函数向消息队列发送消息失败,返回 pdPASS 表示此函数向消息队列发
送消息成功。
本文参考 freertos官方文档 https://freertos.org/a00110.html
《安富莱 STM32-V6 开发板 FreeRTOS 教程》