在实际项目中,我们经常会有这样的需求:
需要每隔一段时间,干一件特定的事情,比如每隔30s,将MCU搜集到的传感器数据上传到服务器
这样的需求,我们可以使用FreeRTOS里面的定时器完成
创建定时器
TimerHandle_t xTimerCreate( const char * const pcTimerName,
const TickType_t xTimerPeriodInTicks,
const UBaseType_t uxAutoReload,
void * const pvTimerID,
TimerCallbackFunction_t pxCallbackFunction )该函数用于创建一个定时器,一共有如下几个参数:
pcTimerName:定时器的名称,类型为一个字符串
xTimerPeriodInTicks:定时器每隔多长时间执行一次,单位为tick,要将时间转换成tick,开始将时间除以portTICK_PERIOD_MS得到
uxAutoReload:该定时器是否需要重复触发,为pdTRUE表示重复触发,为pdFALSE表示只触发一次
pvTimerID:定时器的标识符,一般不用,除非在多个定时器绑定相同逻辑函数时,才会使用该参数来区分是哪一个定时器触发了逻辑函数;
pxCallbackFunction:定时器触发后,需要执行的逻辑函数,返回值为void,只有一个参数,类型为void*
函数的返回值为定时器对象,类型为TimerHandle_t
启动定时器
BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );该函数用于启动一个定时器,有两个参数:
xTimer:第一个参数为要启动的定时器的句柄;
xTicksToWait:第二个参数为等待时间,表示如果任务队列已满,该函数需要等待的时间,如果设置为0,表示不需要等待
返回值为pdPASS表示定时器启动成功,返回值为pdFAIL表示定时器启动失败
停止定时器
BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );该函数用于启动一个定时器,有两个参数:
xTimer:第一个参数为要启动的定时器的句柄;
xTicksToWait:第二个参数为等待时间,表示如果任务队列已满,该函数需要等待的时间,如果设置为0,表示不需要等待
返回值为pdPASS表示定时器启动成功,返回值为pdFAIL表示定时器启动失败
实战案例
使用定时器,实现如何功能:
每隔一秒通过串口打印一次hello world,打印10次后,停止定时器
代码如下: