【STM32H7】第21章 ThreadX定时器组

摘要:
Mod=viewthread&tid=99514第21章ThreadX计时器组本章介绍ThreadX、软件计时器或用户计时器支持的计时器组。或者计时器组已创建。程序执行框图:21.6摘要本章主要解释ThreadX的确定

论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99514

第21章 ThreadX定时器组

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

21.1 定时器组介绍

21.2 使用软件定时器组注意事项

21.3 定时器组创建函数tx_timer_create

21.4 定时器组激活函数tx_timer_activate

21.5 实验例程

21.6 总结

21.1 定时器组介绍

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

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

21.1.1 单次模式和周期模式

ThreadX提供的软件定时器支持单次模式和周期性模式,单次模式就是用户创建了定时器并启动了定时器后,定时时间到将不再重新执行,这就是单次模式软件定时器的含义。周期模式就是此定时器会按照设置的时间周期重复去执行,这就是周期模式软件定时器的含义。另外就是单次模式或者周期模式的定时时间到后会调用定时器的回调函数,用户可以回调函数中加入需要执行的工程代码。

21.2 使用软件定时器组注意事项

定时器回调函数是在定时器任务中执行的,实际应用中切不可在定时器回调函数中调用任何将定时

器任务挂起的函数,比如tx_thread_sleep以及非零延迟的消息队列和信号量相关的函数。将定时器任务挂起,会导致定时器任务负责的相关功能都不能正确执行了。

21.3 定时器组创建函数tx_timer_create

函数原型:

UINT tx_timer_create(
    TX_TIMER *timer_ptr, 
    CHAR *name_ptr,
    VOID (*expiration_function)(ULONG),
    ULONG expiration_input, 
    ULONG initial_ticks,
    ULONG reschedule_ticks, 
    UINT auto_activate);

函数描述:

此函数用于创建定时器组。

1、 第1个参数是定时器组控制块。

2、 第2个参数是定时器组名字。

3、 第3个参数是定时器计数溢出后调用的回调函数。

4、 第4个参数是第3个参数所设置函数的形参。

5、 第5个参数设置定时器时间溢出的初始延迟,单位ThreadX系统时间节拍数,范围1 到0xFFFFFFFF。注意不可以是0。

6、 第6个参数设置初始延迟后的定时器运行周期,如果设置为0,表示单次定时器。

7、 第7个参数支持如下两个选项:

  • TX_AUTO_ACTIVATE 表示激活定时器。
  • TX_NO_ACTIVATE 表示未激活定时器

8、 返回值

  • TX_SUCCESS (0x00) 互斥信号量创建成功。
  • TX_TIMER_ERROR (0x15) 无效的定时器组控制块。或者定时器组已经创建。又或者指针为NULL。
  • TX_TICK_ERROR (0x16) 表示函数第5个形参为0。
  • TX_ACTIVATE_ERROR(0x17)表示第7个形参无效。
  • TX_CALLER_ERROR (0x13) 表示无效的调用。

注意事项:

可以在初始化和任务中调用。

使用举例:

TX_TIMER AppTimer;

/*定时器组 */tx_timer_create(&AppTimer,
        "App Timer",
        TimerCallback, 
        0,                  /*传递的参数 */
    100,                /*设置定时器时间溢出的初始延迟,单位ThreadX系统时间节拍数 */
    200,         /*设置初始延迟后的定时器运行周期,如果设置为0,表示单次定时器 */TX_AUTO_ACTIVATE);  /*激活定时器 */

21.4 定时器组激活函数tx_timer_activate

函数原型:

UINT tx_timer_activate(TX_TIMER *timer_ptr);

函数描述:

用于激活定时器组。

函数参数:

1、 第1个参数是定时器组控制块。

2、 返回值

  • TX_SUCCESS(0x00)设置成功。
  • TX_TIMER_ERROR (0x15) 无效的定时器组控制块。
  • TX_ACTIVATE_ERROR(0x17)表示已经激活,或者单次定时器模式。

注意事项:

  • 可以在初始化,任务,定时器组里面调用。

使用举例:

TX_TIMER my_timer;
UINT status;
status = tx_timer_activate(&AppTimer);

21.5 实验例程

配套例子:

V7-3016_ThreadX Timer

实验目的:

  1. 学习ThreadX定时器组

实验内容:

1、共创建了如下几个任务,通过按下按键K1可以通过串口或者RTT打印任务堆栈使用情况

========================================================

CPU利用率 = 0.89%

任务执行时间 = 0.586484645s

空闲执行时间 = 85.504470575s

中断执行时间 = 0.173225395s

系统总执行时间 = 86.264180615s

=======================================================

任务优先级 任务栈大小 当前使用栈 最大栈使用 任务名

Prio StackSize CurStack MaxStack Taskname

2 4092 303 459 App Task Start

5 4092 167 167 App Msp Pro

4 4092 167 167 App Task UserIF

5 4092 167 167 App Task COM

0 1020 191 191 System Timer Thread

串口软件可以使用SecureCRT或者H7-TOOL RTT查看打印信息。

App Task Start任务 :启动任务,这里用作BSP驱动包处理。

App Task MspPro任务 :消息处理。

App Task UserIF任务 :按键消息处理。

App Task COM任务 :这里用作LED闪烁。

System Timer Thread任务:系统定时器任务

2、(1) 凡是用到printf函数的全部通过函数App_Printf实现。

(2) App_Printf函数做了信号量的互斥操作,解决资源共享问题。

3、默认上电是通过串口打印信息,如果使用RTT打印信息

(1) MDK AC5,MDK AC6或IAR通过使能bsp.h文件中的宏定义为1即可

#define Enable_RTTViewer 1

(2) Embedded Studio继续使用此宏定义为0, 因为Embedded Studio仅制作了调试状态RTT方式查看。

串口打印信息方式(AC5,AC6和IAR):

波特率 115200,数据位 8,奇偶校验位无,停止位 1

【STM32H7】第21章 ThreadX定时器组第1张

RTT打印信息方式(AC5,AC6和IAR):

【STM32H7】第21章 ThreadX定时器组第2张

Embedded Studio仅支持调试状态RTT打印:

【STM32H7】第21章 ThreadX定时器组第3张

由于Embedded Studio不支持中文,所以中文部分显示乱码,不用管。

程序执行框图:

【STM32H7】第21章 ThreadX定时器组第4张

21.6 总结

本章节主要为大家讲解了ThreadX的定时器组,使用中注意满足本章第2小结使用说明。

免责声明:文章转载自《【STM32H7】第21章 ThreadX定时器组》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇X86架构与ARM架构比较(摘录自网络)Scala入门系列(十二):隐式转换下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

stm32之PWM学习

下图是一个STM32普通PWM形成的图形原理说明 自动重装载寄存器(ARR)用于确定波形的频率(即周期)、捕获比较寄存器(CCRx)(用于确定占空比的) PWM的工作过程如下:首先ARR寄存器里面的值确定了一个PWM周期,就是我们上面举的那两个例子中的“1秒”(注意这个周期是在PWM系统初始化的时候写入ARR寄存器的,写入以后一般就不再改动了)。然后...

OpenCV学习系列教程第一篇:处理鼠标事件

来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解 本文由作者翻译并进行代码验证,转载请注明出处~ 官方文档请参阅:https://docs.opencv.org/4.0.1/db/d5b/tutorial_py_mouse_handling.html 运行环境: windows 10+pycharm professiona...

单片机用定时器分配任务的程序结构总结

转载请注明本文地址:http://blog.sina.cn/dpool/blog/s/blog_6f2b6ba80101bwka.html?vt=4 http://blog.sina.cn/dpool/blog/s/blog_6f2b6ba80101bwka.html?vt=4本文是2013年写的,后来整理成了系统文章,请访问 http://nicekwe...

WKWebView 白屏问题

1、WKWebView 自诩拥有更快的加载速度,更低的内存占用,但实际上 WKWebView 是一个多进程组件,Network Loading 以及 UI Rendering 在其它进程中执行。初次适配 WKWebView 的时候,我们也惊讶于打开 WKWebView 后,App 进程内存消耗反而大幅下降,但是仔细观察会发现,Other Process 的...

8052定时器2的用法

学了51单片机之后,开发板上的CPU是STC89S52RC的,就是说52单片机,里面比51的多了一个定时器2看了很多书,就是没怎么理解,于是乎决定看AT89S52的数据手册,翻译一遍,可能会加深自己的理解,以后对C8051F的单片机也好好预热一下。 定时计数器2是一个16位定时/计数器,通过T2CON寄存器的C/T2位可以选择定时还是计数功能。定时器2 有...

网页定时器setTimeout( )

不斷重複執行的 setTimeout( ) setTimeout( ) 預設只是執行一次, 但我們可以使用一個循環方式, 使到一個setTimeout( ) 再啟動自己一次, 就會使到第二個 setTimeout( ) 執行, 第二個又啟動第三個, 這樣循環下去, 這setTimeout( ) 就會不斷執行。 練習-71 自動每秒加 1 的 functio...