软件定时器
软件定时器是一种基于硬件定时器的资源利用手段,相当于扩展了定时器数量。
- 允许开启关闭软件定时
- 创建软件定时
- 启动软件定时
- 停止软件定时
- 复位软件定时
- 删除软件定时
软件定时运行机制
1 2 3
| #define configUSE_TIMERS 1 #define configTIMER_QUEUE_LENGTH 10
|
- 单次模式,定时完毕只执行一次回调
- 周期模式,定时完毕周期性执行回调
软件定时精度不如硬件定时,且容易被打断,用于一些辅助性任务
软件定时通信采用队列消息
- 软件回调应该快进快出,不能有阻塞行为,不允许死循环
定时器常见函数
xTimerCreate()
创建一个定时器,返回句柄
xTimerStart()
启动定时器
xTimerStartFromISR()
中断启动定时器
xTimerStop()
停止定时器
xTimerStopFromISR()
中断停止定时器
xTimerDelete()
删除定时器
创建定时器
创建2个定时器回调任务,其中一个周期1s定时任务,另一个5s单次任务
开启宏定义
1 2 3 4 5 6 7
| #define configUSE_TIMERS 1 #define INCLUDE_xTimerPendFunctionCall 0
#define configTIMER_QUEUE_LENGTH 10
#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1)
|
定时器句柄,创建一个引用,并不是创建一个真实的定时器
1 2 3 4 5 6
| static TimerHandle_t Swtmr1_Handle=NULL; static TimerHandle_t Swtmr2_Handle=NULL;
static uint32_t TmrCb_Count1=0; static uint32_t TmrCb_Count2=0;
|
创建真实的定时器1
1 2 3 4 5 6 7
| Swtmr1_Handle = xTimerCreate( (const char*)"AutoReloadTimer", 1000, pdTRUE, (void *)1, Swtmr1_Callback);
|
创建真实的定时器2
1 2 3 4 5 6 7
| Swtmr2_Handle = xTimerCreate( (const char*)"OneShotTimer", 5000, pdFALSE, (void *)2, Swtmr2_Callback);
|
定时器1回调函数
1 2 3 4 5 6 7 8 9 10 11 12
| static void Swtmr1_Callback(void *paramter) { TickType_t tick_num1; TmrCb_Count1++;
tick_num1=xTaskGetTickCount();
LED0_Turn(); printf("swtmr1_callback回调函数执行次数%d\r\n",TmrCb_Count1); printf("滴答计时器计数值%d\r\n",tick_num1);
}
|
定时器2回调函数
1 2 3 4 5 6 7 8 9 10 11 12
| static void Swtmr2_Callback(void *paramter) { TickType_t tick_num2; TmrCb_Count2++;
tick_num2=xTaskGetTickCount();
printf("swtmr2_callback回调函数执行次数%d\r\n",TmrCb_Count2); printf("滴答计时器计数值%d\r\n",tick_num2);
}
|
每过1s,定时器1运行一次,第5s,定时器2运行一次