一.软件定时器简介
裸机上也有学习过定时器,但是裸机上属于硬件定时器
1.什么是软件定时器?
答:具有定时功能的软件,可设置定时周期,当指定时间到达后调用回调函数,用户在回调函数中处理信息。
2.软件定时器的优缺点
优点:(1)硬件定时器数量有限,软件定时器理论上内存足够,就可以创建多个 (2)使用简单、成本低
缺点:(3)软件定时器精度不高(因为它一系统时钟为基准,系统时钟中断优先级低,容易被打断),对于精度要求高的场合,不建议使用软件定时器。
3.软件定时器特点
(1)可裁剪:使用软件定时器时,需要将configUSE_TIMERS配置为1
(2)单次和周期:软件定时器支持:单次定时器(运行一次)和周期定时器
注意:软件定时器的超时回调函数是由软件定时器服务任务调用的,软件定时器的超时回调函数本身是函数,因此不能再回调函数中调用可能导致任务阻塞的API函数。
软件定时器服务任务:在调用vTaskStartScheduler()开启任务调度器时自动创建,用于管理软件定时器的任务。
软件定时器服务任务作用:(1)负责软件定时器超时的逻辑判断 (2)调用超时软件定时器的回调函数
(3)处理软件定时器命令队列
4.什么是软件定时器命令队列?
答:FreeRTOS中有许多软件定时器相关的API函数,通过这些API函数往定时器队列中写入消息(发送命令),该队列是提供给软件定时器使用的,用户不能直接访问。
5.软件定时器的相关配置
(1)将配置项configUSE_TIMERS设置为1,在启动任务调度器时,会自动创建软件定时器的服务/守护任务prvTimerTask()
(2)软件定时器服务任务的优先级为configTIMER_TASK_PRIORITY=31,设置为最高
(3)定时器的命令队列长度为config_QUEUE_LENGYH=5
注意:软件定时器的任务回调函数在软件定时器服务任务中调用,服务任务不单单为一个软件定时器服务,还处理其他定时器。 a.回调函数要尽快执行,不能进入阻塞态。 b.访问队列或信号量的非零阻塞时间的API函数不能调用(阻塞时间只能设置为0)。
6.软件定时器的状态
(1)休息态:软件定时器可以通过其句柄被引用,但因为没有运行,所以不执行超时回调函数
(2)运行态:当到达指定时间后,调用超时回调函数
注意:新创建的软件定时器处于休眠状态,也就是未运行,通过发送命令队列,启动定时器。
二.软件定时器相关API函数
1.软件定时器结构体成员介绍
2.创建软件定时器 xTimerCreate()
3.开启软件定时器 xTimerStart()
4.复位软件定时器 xTimerReset()
5.更改软件定时器超时时间 xTimerChangePeriod()
综合实验(CubMX自动生成):
1.创建两个定时器,创建任务TaskKEY
定时器1:周期定时器,每1s打印提示语句
定时器2:单次定时器,启动后2s打印提示语句
TaskKEY:按键控制软件定时器的开启与关闭
2.CubeMX配置
(1)使能软件定时器功能
开启软件定时器的功能,设置软件定时器服务任务的优先级为最高,定时器命令队列长度为5,任务堆栈大小为256字节
(2)创建两个定时器
软件自动生成代码,创建两个定时器,注意:没有为定时器赋予定时的时间(此时默认1ms),需要在开启定时器时调用封装函数osTimerStatr(定时器句柄,定时时间)
(3)定时器的回调函数
(4)按键控制开启和关闭软件定时器
现象1(CubeMX自动生成):
综合实验:
1.创建第三个定时器,模式为单次定时器,定时500ms
TaskKEY:按键控制软件定时器的开启与关闭
2.CubeMX配置
(1)使能软件定时器功能
......省略.....
3.代码部分
(1)创建软件定时器3,定时500ms,单次定时器
(2)定时器3的回调函数
(3)按键控制函数
现象2:增加Timer定时器3