抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

软件定时器

软件定时器是一种基于硬件定时器的资源利用手段,相当于扩展了定时器数量。

  1. 允许开启关闭软件定时
  2. 创建软件定时
  3. 启动软件定时
  4. 停止软件定时
  5. 复位软件定时
  6. 删除软件定时

软件定时运行机制

1
2
3
//开启宏定义
#define configUSE_TIMERS 1
#define configTIMER_QUEUE_LENGTH 10
  1. 单次模式,定时完毕只执行一次回调
  2. 周期模式,定时完毕周期性执行回调

  1. 软件定时精度不如硬件定时,且容易被打断,用于一些辅助性任务

  2. 软件定时通信采用队列消息

  1. 软件回调应该快进快出,不能有阻塞行为,不允许死循环

定时器常见函数

  1. xTimerCreate()​创建一个定时器,返回句柄
  2. xTimerStart()​启动定时器
  3. xTimerStartFromISR()​中断启动定时器
  4. xTimerStop()​停止定时器
  5. xTimerStopFromISR()​中断停止定时器
  6. 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; //记录定时器1回调函数执行次数
static uint32_t TmrCb_Count2=0; //记录定时器2回调函数执行次数

创建真实的定时器1

1
2
3
4
5
6
7
//定时器句柄
Swtmr1_Handle = xTimerCreate(
(const char*)"AutoReloadTimer", //定时器名称
1000, //定时器周期
pdTRUE, //周期模式
(void *)1, //为每个计时器分配索引唯一ID
Swtmr1_Callback); //回调函数

创建真实的定时器2

1
2
3
4
5
6
7
//定时器句柄
Swtmr2_Handle = xTimerCreate(
(const char*)"OneShotTimer", //定时器名称
5000, //定时器周期
pdFALSE, //周期模式
(void *)2, //为每个计时器分配索引唯一ID
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++; //每次回调自加1

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++; //每次回调自加1

tick_num2=xTaskGetTickCount(); //获取滴答计时器计数值

// LED0_Turn();
printf("swtmr2_callback回调函数执行次数%d\r\n",TmrCb_Count2);
printf("滴答计时器计数值%d\r\n",tick_num2);

}

每过1s,定时器1运行一次,第5s,定时器2运行一次