hutool的定时任务不支持依赖注入怎么办_小白收好!这篇FreeRTOS 软件定时器总结的都是你该关注的…

 FreeRTOS 支持的定时器组,或者叫软件定时器,又或者叫用户定时器均可。软件定时器的功能比较简单,也容易掌握。被称为定时器组是因为用户可以创建多个定时器,创建的个数是可配置的。

定时器组介绍
    FreeRTOS 软件定时器组的时基是基于系统时钟节拍实现的,之所以叫软件定时器是因为它的实现不需要使用任何硬件定时器,而且可以创建很多个,综合这些因素,这个功能就被称之为软件定时器组。

    既然是定时器,那么它实现的功能与硬件定时器也是类似的。在硬件定时器中,我们是在定时器中断中实现需要的功能,而使用软件定时器时,我们是在创建软件定时器时指定软件定时器的回调函数,在回调函数中实现相应的功能。

4f3ab2da009285a42b7b5358afccc043.png

    左侧图是用户应用程序,右侧是定时器任务。在用户应用程序里面调用了定时器组API函xTimerReset,
这个函数会通过消息队列给定时器任务发消息,在定时器任务里面执行实际操作。消息队列在此处的作用有一个专门的名字:Timer command queue,即专门发送定时器组命令的队列。

使用软件定时器组注意事项    定时器回调函数是在定时器任务中执行的,实际应用中切不可在定时器回调函数中调用任何将定时器任务挂起的函数,比如vTaskDelay(),vTaskDelayUntil()以及非零延迟的消息队列和信号量相关的函数。将定时器任务挂起,会导致定时器任务负责的相关功能都不能正确执行了。

定时器组 API 函数使用如下 20 个函数可以实现 FreeRTOS 的定时器组:? xTimerCreate()? xTimerCreateStatic()? xTimerIsTimerActive()? xTimerStart()? xTimerStop()? xTimerChangePeriod()? xTimerDelete()? xTimerReset()? xTimerStartFromISR()? xTimerStopFromISR()? xTimerChangePeriodFromISR()? xTimerResetFromISR()? pvTimerGetTimerID()? vTimerSetTimerID()? xTimerGetTimerDaemonTaskHandle()? xTimerPendFunctionCall()? xTimerPendFunctionCallFromISR()? pcTimerGetName()? xTimerGetPeriod()? xTimerGetExpiryTime()
关于这 20 个函数的讲解及其使用方法可以FreeRTOS 在线版手册 。

这里我们重点的说以下 3 个函数:? xTimerCreate()? xTimerStart ()? pvTimerGetTimerID ()
因为本章节配套的例子使用的是这 3 个函数。

函数 xTimerCreate函数原型:

054d1f4d28b8f57ed5c8d03c7ae9eb20.png

函数 xTimerStart 用于启动软件定时器。
? 第 1 个参数是定时器句柄。
? 第 2 个参数是成功启动定时器前的最大等待时间设置,单位系统时钟节拍,定时器组的大部分 API函数不是直接运行的(见 上图),而是通过消息队列给定时器任务发消息来实现的,此参数设置的等待时间就是当消息队列已经满的情况下,等待消息队列有空间时的最大等待时间。
? 返回值,返回 pdFAIL 表示此函数向消息队列发送消息失败,返回 pdPASS 表示此函数向消息队列发送消息成功。定时器任务实际执行消息队列发来的命令依赖于定时器任务的优先级,如果定时器任务是高优先级会及时得到执行,如果是低优先级,就要等待其余高优先级任务释放 CPU 权才可以得到执行。

使用这个函数要注意以下问题:1. 使用前一定要保证定时器组已经通过函数 xTimerCreate 创建了。
2. 在 FreeRTOSConfig.h 文件中使能宏定义:
#define configUSE_TIMERS 13. 对于已经被激活的定时器,即调用过函数 xTimerStart 进行启动,再次调用此函数相当于调用了函数xTimerReset 对定时器时间进行了复位。
4. 如果在启动 FreeRTOS 调度器前调用了此函数, 定时器是不会立即执行的,需要等到启动了 FreeRTOS调度器才会得到执行,即从此刻开始计时,达到 xTimerCreate 中设置的单次或者周期性延迟时间才会执行相应的回调函数。

函数 pvTimerGetTimerID函数原型:void *pvTimerGetTimerID( TimerHandle_t xTimer ); /* 定时器句柄 */函数描述:函数 pvTimerGetTimerID 用于返回使用函数 xTimerCreate 创建的软件定时器 ID。? 第 1 个参数是定时器句柄。? 返回值,返回定时器 ID。

使用这个函数要注意以下问题:1. 使用前一定要保证定时器组已经通过函数 xTimerCreate 创建了。2. 在 FreeRTOSConfig.h 文件中使能宏定义:#define configUSE_TIMERS 13. 创建不同的定时器时,可以对定时器使用相同的回调函数,在回调函数中通过此函数获取是哪个定时器的时间到了,这个功能就是此函数的主要作用。

代码操练场:

配置项:

374fc7c0c97cb9859dc0a30095b9abe8.png

74a66c8fc5bbb998163db325ccd29a59.png

实验验证:

使用软件定时器,100ms一次实现led反转,1000ms一次Beep翻转。

主要展示定时器任务和回调函数:

定时器任务:

回调函数:

    通过ID不同,判断是哪个定时器时间到,然后做相应的动作。

相关资源:地摊叫卖广告软件 商场促销 文字转换声音 卖场叫卖语音广告制作

来源:weixin_39874589

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年9月26日
下一篇 2020年9月26日

相关推荐