目录
1 软件定时器
定时器是MCU常用的外设,我们在学习各种单片机时必然会学习它的硬件定时器。但是,MCU自带的硬件定时器资源是有限的,而且一般会用在实时性要求很强的地方。 在freeRTOS中提供了软件定时器的功能,来实现更多的定时器资源。
1. 软件定时器的特性
使用定时器跟使用手机闹钟是类似的:
- 指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期(period)。
- 指定类型,定时器有两种类型:
- 一次性(One-shot timers): 这类定时器启动后,它的回调函数只会被调用一次; 可以手工再次启动它,但是不会自动启动它。
- 自动加载定时器(Auto-reload timers ): 这类定时器启动后,时间到之后它会自动启动它; 这使得回调函数被周期性地调用。
- 指定要做什么事,就是指定回调函数
实际的闹钟分为:有效、无效两类。软件定时器也是类似的,它由两种状态:
- 运行(Running、Active):运行态的定时器,当指定时间到达之后,它的回调函数会被调用
- 冬眠(Dormant):冬眠态的定时器还可以通过句柄来访问它,但是它不再运行,它的回调函数不会 被调用
2.回调函数
定时器的回调函数的原型如下:
void ATimerCallback( TimerHandle_t xTimer );
定时器的回调函数是在守护任务中被调用的,守护任务不是专为某个定时器服务的,它还要处理其他定时器。 所以,定时器的回调函数不要影响其他人:
- 回调函数要尽快实行,不能进入阻塞状态
- 不要调用会导致阻塞的API函数,比如 vTaskDelay()
- 可以调用 xQueueReceive()

文章介绍了FreeRTOS提供的软件定时器功能,用于扩展MCU的定时器资源。软件定时器分为一次性定时器和自动加载定时器,回调函数在守护任务中非阻塞方式执行。示例程序创建了一个周期定时器,每1秒打印当前计数值,展示了osTimerStart和osKernelSysTick等函数的使用。
最低0.47元/天 解锁文章
6758

被折叠的 条评论
为什么被折叠?



