FreeRTOS 快速入门(九)之软件定时器


一、软件定时器的特性

使用定时器跟使用手机闹钟是类似的:

  • 指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期(period)。
  • 指定类型,定时器有两种类型:
    • 一次性(One-shot timers):
      这类定时器启动后,它的回调函数只会被调用一次;
      可以手工再次启动它,但是不会自动启动它。
    • 自动加载定时器(Auto-reload timers):
      这类定时器启动后,时间到之后它会自动启动它;
      这使得回调函数被周期性地调用。
  • 指定要做什么事,就是指定回调函数

实际的闹钟分为:有效、无效两类。软件定时器也是类似的,它由两种状态:

  • 运行(RunningActive):运行态的定时器,当指定时间到达之后,它的回调函数会被调用
  • 冬眠(Dormant):冬眠态的定时器还可以通过句柄来访问它,但是它不再运行,它的回调函数不会被调用

定时器运行情况示例如下:

  • Timer1:它是一次性的定时器,在 t1 启动,周期是 6 个Tick。经过 6 个 tick 后,在 t7 执行回调函数。它的回调函数只会被执行一次,然后该定时器进入冬眠状态。
  • Timer2:它是自动加载的定时器,在 t1 启动,周期是 5 个 Tick。每经过 5 个 tick 它的回调函数都被执行,比如在 t6、t11、t16 都会执行。

FreeRTOS 的配置上,如果要是用定时器就需要配置下面几个宏定义:

//打开定时器
#define configUSE_TIMERS                1

//定时器的优先级
#define configTIMER_TASK_PRIORITY       50

//定时器栈大小
#define configTIMER_TASK_STACK_DEPTH    50

//定时器队列大小
#define configTIMER_QUEUE_LENGTH        50

二、软件定时器的上下文

1、守护任务

FreeRTOS 中有一个 Tick 中断,软件定时器基于 Tick 来运行。但是,在哪里执行定时器函数呢?FreeRTOSRTOS,它不允许在内核、在中断中执行不确定的代码:如果定时器函数很耗时,会影响整个系统。

所以,在 FreeRTOS 中,不在 Tick 中断中执行定时器函数,而在某个任务里执行,这个任务就是:RTOS Damemon TaskRTOS 守护任务。以前被称为"Timer server",但是这个任务要做并不仅仅是定时器相关,所以改名为:RTOS Damemon Task

FreeRTOS 的配置项 configUSE_TIMERS 被设置为 1 时,在启动调度器时,会自动创建 RTOS Damemon Task

我们自己编写的任务函数要使用定时器时,是通过"定时器命令队列"(timer command queue)和守护任务交互,如下图所示:

守护任务的优先级为:configTIMER_TASK_PRIORITY;定时器命令队列的长度为 configTIMER_QUEUE_LENGTH

2、守护任务的调度

守护任务的调度,跟普通的任务并无差别。当守护任务是当前优先级最高的就绪态任务时,它就可以运行。它的工作有两类:

  • 处理命令:从命令队列里取出命令、处理
  • 执行定时器的回调函数

能否及时处理定时器的命令、能否及时执行定时器的回调函数,严重依赖于守护任务的优先级。

3、回调函数

定时器的回调函数的原型如下:

void ATimerCallback( TimerHandle_t xTimer )
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值