【STM32F429】第15章 ThreadX GUIX定时器更新功能

2023-12-17 01:32

本文主要是介绍【STM32F429】第15章 ThreadX GUIX定时器更新功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429

第15章       ThreadX GUIX定时器更新功能

本章节为大家讲解GUIX定时器更新功能。这个功能用的到地方很多,比如更新文本控件显示RTC时钟,采集数据的动态更新等场合都要用到。

目录

第15章       ThreadX GUIX定时器更新功能

15.1 初学者重要提示

15.2 GUIX Studio设置窗口事件回调

15.2.1        窗口事件回调设置

15.2.2        文本控件prompt动态更新

15.3 GUIX定时器更新功能

15.3.1        了解GUIX定时器相关宏定义

15.3.2        了解GUIX定时器API

15.3.3        窗口(控件)里事件回调的定时器实现框架

15.3.4        窗口里面定时器更新功能实例(重要)

15.4 实验例程设计框架

15.5 实验例程

15.6 总结


 

15.1 初学者重要提示

  1.   务必看第11章学习GUIX Studio的使用方法和第12章学习GUIX Studio生成的代码移植到硬件平台的方法。
  2.   使用文本控件prompt做动态更新,要勾选GUIX Studio中的Private Text Copy,详解本章2.2.2小节。
  3.   本章节教程的3.3.4小节是重点,对定时器更新的使用方法进行了说明。

15.2 GUIX Studio设置窗口事件回调

GUIX Studio的设置方法与第11章一样,我们这里把控件的位置和大小做了调整,并为window窗口创建一个定时器。

新调整的界面效果如下:

 

15.2.1        窗口事件回调设置

下面我们为窗口控件设置一个Event Function,此功能是窗口的事件回调函数。在这个回调函数里面,大家可以处理各种事件。

 

这里为Event Function设置的回调函数名为_cbEventWindow0,然后就可以使用GUIX Studio生成新的代码。生成的代码移植到硬件平台的方法看第12章即可。

15.2.2        文本控件prompt动态更新

使用控件prompt做更新,一定要在GUIX Studio上勾选Private Text Copy,否则prompt的内容是无法更新的:

 

15.3 GUIX定时器更新功能

在GUIX Studio上设置好事件回调函数名后,剩下就是在程序里面实现定时器事件回调的处理,这里把实现方法为大家做个说明。

15.3.1        了解GUIX定时器相关宏定义

GUIX定时器相关的几个宏定义如下:

#ifndef GX_TICKS_SECOND
#define GX_TICKS_SECOND                     20
#endif/* Set default ThreadX timer tick frequency 100Hz (10ms timer). */#ifndef TX_TIMER_TICKS_PER_SECOND
#define TX_TIMER_TICKS_PER_SECOND ((ULONG)100)
#endif/* Default 20ms GUIX system timer.  */
#ifndef GX_SYSTEM_TIMER_MS
#define GX_SYSTEM_TIMER_MS        20
#endif/* Derive GX_SYSTEM_TIMER_TICKS based on GX_SYSTEM_TIMER_MS value. */
#ifndef GX_SYSTEM_TIMER_TICKS
#define GX_SYSTEM_TIMER_TICKS     ((GX_SYSTEM_TIMER_MS * TX_TIMER_TICKS_PER_SECOND) / 1000)
#endif

以本教程配置的例子为例,仅用到定义GX_SYSTEM_TIMER_TICKS,其它基本都没用到。这个宏定义被ThreadX内核定时器组件的创建函数所调用,以此来供GUIX的定时器组件使用:

tx_timer_create(&_gx_system_timer, "guix timer", _gx_system_timer_expiration, 0,GX_SYSTEM_TIMER_TICKS, GX_SYSTEM_TIMER_TICKS, TX_NO_ACTIVATE);

一般我们都设置ThreadX内核系统时钟节拍为1000Hz,即1ms。因此这里设置GX_SYSTEM_TIMER_TICKS表示GUIX定时器的周期单位是GX_SYSTEM_TIMER_TICKS毫秒。比如GX_SYSTEM_TIMER_TICKS定义为2,表示GUIX的定时器单位是2ms。

15.3.2        了解GUIX定时器API

我们主要用到函数gx_system_timer_start,用于启动定时器。函数原型如下:

#define gx_system_timer_start(a, b, c, d)    _gx_system_timer_start((GX_WIDGET *)a, b, c, d)
UINT  _gx_system_timer_start(GX_WIDGET *owner, UINT timer_id, UINT initial_ticks, UINT reschedule_ticks)

函数形参含义如下:

  •   owner

控件指针变量,指向控件控制块,表示为那个控件创建定时器。

  •   timer_id

定时器ID。

  •   initial_ticks

初始溢出时间,单位由宏定义GX_SYSTEM_TIMER_TICKS决定。

参数范围1到0xFFFFFFFF。

  •   reschedule_ticks

周期性执行时间,单位由宏定义GX_SYSTEM_TIMER_TICKS决定。

参数范围1到0xFFFFFFFF。

 

注意事项:

  •   宏定义GX_MAX_ACTIVE_TIMERS决定可以创建的最多定时器个数,默认值是32。
  •   此函数最后两个时间参数不可以设置为0。

15.3.3        窗口(控件)里事件回调的定时器实现框架

GUIX的定时器调用是在窗口(控件)的事件回调函数里面调用的。以窗口为例,窗口的Event Function事件回调函数实现框架如下:

UINT _cbEventWindow(GX_WINDOW *widget, GX_EVENT *event_ptr)
{switch (event_ptr->gx_event_type){/* 控件显示事件 */case GX_EVENT_SHOW:break;/* 定时器时间溢出事件*/case GX_EVENT_TIMER:break;default:return gx_window_event_process(widget, event_ptr);}return 0;
}

事件回调函数还有很多其它事件供用户使用,这里仅列出了定时器用到的两个。这个框架基本是固定的,大家直接调用即可,下面举一个实例来说明定时器的使用。

15.3.4        窗口里面定时器更新功能实例(重要)

实例代码如下,本章教程配套例子也是用的这个代码:

/*
*********************************************************************************************************
*    函 数 名: _cbEventWindow
*    功能说明: 窗口window的事件回调函数
*    形    参: widget     窗口句柄
*             event_ptr  事件指针
*    返 回 值: 返回0表示成功
*********************************************************************************************************
*/
UINT _cbEventWindow(GX_WINDOW *widget, GX_EVENT *event_ptr)
{static uint32_t count = 0;char buf[20] = {0};switch (event_ptr->gx_event_type){/* 控件显示事件 */case GX_EVENT_SHOW:/* 启动一个GUIX定时器 */gx_system_timer_start((GX_WIDGET *)widget, GUI_ID_Timer0, 1, 50);/* 默认事件处理 */gx_window_event_process(widget, event_ptr);break;/* 定时器时间溢出事件*/case GX_EVENT_TIMER:if (event_ptr->gx_event_payload.gx_event_timer_id == GUI_ID_Timer0){sprintf(buf, "%d", count++);gx_prompt_text_set((GX_PROMPT *)&(window.window_prompt), buf);                }break;default:return gx_window_event_process(widget, event_ptr);}return 0;
}
  •   GX_EVENT_SHOW

窗口(控件)显示事件。当窗口(控件)显示时,会产生此消息,既可以附加到一个可见窗口(控件),也可以通过函数gx_widget_show()。窗口(控件)绘制前会产生此消息。

  •   gx_system_timer_start

启动定时器。

    •   第1个参数是事件回调函数传递进来的形参。
    •   第2个参数是定时器ID,通过此参数可以区分多个定时器。
    •   第3个参数是初始溢出时间,默认本教程配套例子设置的时间单位是2ms。这里配置为1,表示2ms后周期性执行。
    •   第4个参数是周期执行时间,这里配置为50,表示定时器周期是100ms。特别注意参数这个参数设置为1-5延迟时间都是10ms左右,设置到6以上就正常了。有待后续研究原因。
  •   gx_window_event_process

用于窗口(控件)的默认事件处理。

  •   GX_EVENT_TIMER

定时器周期性溢出事件

  •   gx_prompt_text_set

设置文本控件prompt的内容。

 

针对这个实例,推荐大家设置不同的参数看效果,熟练掌握这些函数的用法,这样用起GUIX也得心应手。

15.4 实验例程设计框架

本章例程的重点是GUIX定时器更新的实现,任务中专门为窗口设置了一个Event Function事件回调函数。

 

15.5 实验例程

(注,如果是电阻屏,需要做触摸校准,校准方法看本教程附件章节A)

配套例子:

本章节配套了如下两个例子供大家移植参考:

  •   V6-2015_GUIX Timer Update

GUIX Studio生成的代码在硬件平台实际运行的工程,含有GCC,IAR,MDK AC5和AC6四个版本工程。

  •   V6-2016_GUIX Studio Timer Update

GUIX Studio工程模板,设计界面后,生成的文件可直接添加到MDK,IAR和GCC软件平台使用。

实验目的:

  1. 本章主要学习GUIX的定时器更新功能。

实验内容:

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

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

App Task MspPro任务 :消息处理,这里用作LED闪烁。

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

App Task GUI任务    :GUI应用任务。

App Task STAT任务   :统计任务。

App Task IDLE任务   :空闲任务。

GUIX System Thread  :GUI系统任务。

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

实验效果:

GUIX Studio的界面设计如下:

串口打印任务执行情况:

IAR,MDK AC5和AC6工程可以串口打印任务执行情况:按开发板的按键K1可以打印,波特率 115200,数据位 8,奇偶校验位无,停止位 1:

Embedded Studio(GCC)平台的串口打印是通过其调试组件SEGGER RTT做的串口打印,速度也非常快,打印效果如下:

 

展示里面有乱码是因为Embedded Studio不支持中文。

15.6 总结

本章节主要为大家讲解了GUIX定时器更新功能,推荐大家设置不同的参数看效果,熟练掌握这些函数的用法。

 

这篇关于【STM32F429】第15章 ThreadX GUIX定时器更新功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/502638

相关文章

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件