当前位置: 代码迷 >> 综合 >> 从0到1学习FreeRTOS:FreeRTOS 内核应用开发:(二十)软件定时器 NO.1 基本概念
  详细解决方案

从0到1学习FreeRTOS:FreeRTOS 内核应用开发:(二十)软件定时器 NO.1 基本概念

热度:79   发布时间:2023-12-16 14:09:39.0

从0到1学习FreeRTOS:FreeRTOS 内核应用开发:(二十)软件定时器 NO.1 基本概念

目录

一、软件定时器的基本概念:

二、软件定时器应用场景:

三、软件定时器的精度:

四、软件定时器的运作机制:

五、软件定时器控制块:


一、软件定时器的基本概念:

① 硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断

② 软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受硬件定时器资源限制的定时器服务

③ 使用硬件定时器时,每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息;而使用软件定时器时,需要我们在创建软件定时器时指定时间到达后要调用的函数(即调函数)在回调函数中处理信息两次触发回调函数的时间间隔xTimerPeriodInTicks叫定时器的定时周期

④ FreeRTOS操作系统提供软件定时器功能,软件定时器的使用相当于扩展了定时器的数量,允许创建更多的定时业务。FreeRTOS软件定时器功能上支持:

  • 裁剪:能通过宏关闭软件定时器功能。
  • 软件定时器创建。
  • 软件定时器启动。
  • 软件定时器停止。
  • 软件定时器复位。
  • 软件定时器删除
  • 支持单次模式
  • 支持周期模式

单次模式:当用户创建了定时器并启动了定时器后,定时时间到了,只执行一次回调函数之后就将该定时器删除,不再重新执行。
周期模式:这个定时器会按照设置的定时时间循环执行回调函数,直到用户将定时器删除,具体见下图:
 

二、软件定时器应用场景:

硬件定时器受硬件的限制,数量上不足以满足用户的实际需求,无法提供更多的定时器,那么可以采用软件定时器来完成

软件定时器更适用于对时间精度要求不高的任务

三、软件定时器的精度:

在操作系统中,通常软件定时器系统节拍周期为计时单位

由于节拍定义了系统中定时器能够分辨的精确度,系统可以根据实际系统CPU的处理能力和实时性需求设置合适的数值,系统节拍周期的值越小,精度越高,但是系统开销也将越

四、软件定时器的运作机制:

① 软件定时器的运作:

       软件定时器是可选的系统资源,在创建定时器的时候会分配一块内存空间。当用户创建并启动一个软件定时器时, FreeRTOS会根据当前系统时间及用户设置的定时确定该定时器唤醒时间,并将该定时器控制块挂入软件定时器列表FreeRTOS中采用两个定时器列表维护软件定时器,pxCurrentTimerListpxOverflowTimerList是列表指针,在初始化的时候分别指向xActiveTimerList1xActiveTimerList2

  1. PRIVILEGED_DATA static List_t xActiveTimerList1;
  2. PRIVILEGED_DATA static List_t xActiveTimerList2;
  3. PRIVILEGED_DATA static List_t *pxCurrentTimerList;
  4. PRIVILEGED_DATA static List_t *pxOverflowTimerList;

② 定时器的通信

       FreeRTOS的软件定时器还有采用消息队列进行通信,利用“定时器命令队列”向软件定时器任务发送一些命令,任务在接收到命令就会去处理命令对应的程序,比如启动定时器,停止定时器

xTimerQueue:定时器命令队列。

③ 软件定时器列表:

 软件定时器注意事项:

  1. 软件定时器的回调函数中应快进快出,绝对不允许使用任何可能引软件定时器起任务挂起或者阻塞的 API 接口,在回调函数中也绝对不允许出现死循环。
  2. 软件定时器使用了系统的一个队列和一个任务资源,软件定时器任务的优先级默认为 configTIMER_TASK_PRIORITY,为了更好响应,该优先级应设置为所有任务中最高的优先级
  3. 创建单次软件定时器,该定时器超时执行完回调函数后,系统会自动删除该软件定时器,并回收资源。
  4. 定时器任务的堆栈大小默认为 configTIMER_TASK_STACK_DEPTH 个字节。

五、软件定时器控制块:

软件定时器创建函数:xTimerCreate() 与  xTimerCreateStatic()

创建成功后是处于休眠状态

TimerHandle_t xTimerCreateconst char * const pcTimerName,     软件定时器名

                                       const TickType_t xTimerPeriodInTicks,      软件定时器的周期

                                       const UBaseType_t uxAutoReload,            软件定时器是否自动重置

                                       void * const pvTimerID,                               软件定时器 ID

                                       TimerCallbackFunction_t pxCallbackFunction );软件定时器的回调函数

回调函数的类型:typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer );