0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MM32F3270基于Azure RTOS定时器组的应用

灵动MM32MCU 来源:灵动MM32MCU 作者:灵动MM32MCU 2022-12-29 17:26 次阅读

简 介

Azure RTOS ThreadX 是 Microsoft 提供的高级工业级实时操作系统 (RTOS)。它是专门为深度嵌入式实时 IoT 应用程序设计的。Azure RTOS ThreadX 提供高级计划、通信、同步、计时器、内存管理和中断管理功能。此外,Azure RTOS ThreadX 具有许多高级功能,包括 picokernel 体系结构、preemption-threshold 计划、event-chaining、执行分析、性能指标和系统事件跟踪。Azure RTOS ThreadX 非常易于使用,适用于要求极其苛刻的嵌入式应用程序。Azure RTOS ThreadX 在各种产品(包括消费者设备、医疗电子设备和工业控制设备)上的部署次数已达数十亿次。

在前文描述移植基本内核的基础上,该应用手册描述了MM32F3270系列MCU结合Azure RTOS ThreadX定时器组的使用,引导用户理解Azure RTOS ThreadX应用程序计时器功能。

表 1 适用系列型号

系列 芯片型号 开发板
MM32F3270 MM32F3273G9P EVB-F3270

1移植应用的准备

1.1 硬件开发板的准备

该移植过程中应用的开发板为MM32的EVB-F3270,板载MM32F3273G9P。

5ec20360-875a-11ed-bfe3-dac502259ad0.png

EVB-F3270 (MM32F3273G9P) 的简要参数

Arm Cortex-M3 内核

板载 MM32F3273G9P(LQFP144)

USB Host / Device、SPI、I2C

4 x Key、4 x LED

I2S Speaker

TF-Card

Ethernet PHY

1.2 软件的准备

库函数和例程(Lib Samples)

该移植过程中应用的 Firmware 分别为 MM32F3270 库函数和例程。

5ef57970-875a-11ed-bfe3-dac502259ad0.png    

Azure RTOS ThreadX(源码)

ThreadX 的源代码已经开放,我们可以从 ThreadX 公共源代码存储库获取 Azure RTOS ThreadX,网址为:

https://github.com/azure-rtos/threadx/

Azure RTOS 何时需要许可证?

Microsoft 将 Azure RTOS 源代码发布到 GitHub。安装和使用该软件进行内部开发、测试和评估无需许可证。分发或销售组件和设备需要许可证,除非使用 Azure RTOS 许可的硬件。

ThreadX 安装

可以通过将 GitHub 存储库克隆到本地计算机来安装 ThreadX。下面是用于在 PC 上创建 ThreadX 存储库的克隆的典型语法。

shell复制

git clone https://github.com/azure-rtos/threadx

或者,也可以使用 GitHub 主页上的“下载”按钮来下载存储库的副本。

下载后的仓库代码目录列表如下:

5f0848ac-875a-11ed-bfe3-dac502259ad0.png    

Azure RTOS ThreadX(源码)支持的开发环境

ThreadX 内核提供好了各种主流硬件平台和软件平台的移植文件,以Cortex_M3为例,可以支持以下六种开发环境:

5f273f3c-875a-11ed-bfe3-dac502259ad0.png

本次移植过程使用Azure RTOS原有的sample_threadx.c文件为例,稍作修改,演示定时器组功能。

2ThreadX定时器组的应用

该章节介绍动态内存管理相关知识,演示程序可在MM32F3273G9P的EVB-F3270上运行。此示例在文件 main_timer_demo.c 中实现,旨在说明如何在嵌入式多线程环境中使用定时器组功能。

2.1 定时器组

2.1.1 应用程序计时器

快速响应异步外部事件是嵌入式实时应用程序中最重要的功能。但是,其中的许多应用程序还必须按预定的时间间隔执行某些活动。

借助 ThreadX 应用程序计时器,应用程序能够按特定的时间间隔执行应用程序 C 函数。应用程序计时器也可能只过期一次。这种类型的计时器称为“单次计时器”,而重复间隔计时器称为“定期计时器”。

每个应用程序计时器都是一个公用资源。ThreadX 对如何使用应用程序计时器没有任何限制。

2.1.2 计时器间隔

在 ThreadX 中,时间间隔通过定期计时器中断来测量。每个计时器中断称为计时器时钟周期。计时器时钟周期之间的实际时间由应用程序指定,但 10 毫秒是大多数实现的标准时间。定期计时器设置通常位于 tx_initialize_low_level 程序集文件中。

值得一提的是,基础硬件必须能够生成定期中断,应用程序计时器才会正常运行。在某些情况下,处理器具有内置的定期中断功能。如果处理器没有此功能,用户的主板必须包含可生成定期中断的外围设备。

即使没有定期中断源,ThreadX 仍可正常工作。但随后会禁用所有与计时器相关的处理。这包括时间切片、挂起超时和计时器服务。

2.1.3 计时器准确性

计时器过期时间根据时钟周期指定。达到每个计时器时钟周期时,指定到期值将减一。由于应用程序计时器可在计时器中断(或计时器时钟周期)之前启用,因此,实际过期时间可能会提前一个时钟周期。

如果计时器时钟周期速率为 10 毫秒,应用程序计时器可能会提前 10 毫秒过期。与 1 秒计时器相比,这对 10 毫秒计时器更重要。当然,增加计时器中断频率会减少此误差范围。

2.1.4 计时器执行

应用程序计时器按照其激活的顺序执行。例如,如果创建了三个具有相同过期值的计时器并已激活,这些计时器对应的过期函数将保证按它们激活的顺序执行。

2.1.5 创建应用程序计时器

应用程序计时器由应用程序线程在初始化期间或运行时创建。应用程序中应用程序计时器的数量没有限制。

2.1.6 运行时应用程序计时器性能信息

ThreadX 提供可选的运行时应用程序计时器性能信息。如果 ThreadX 库和应用程序是在定义 TX_TIMER_ENABLE_PERFORMANCE_INFO 的情况下生成的,ThreadX 会累积以下信息。

整个系统的总数:

激活数

停用数

重新激活(定期计时器)

expirations

过期调整数

每个应用程序计时器的总数:

激活数

停用数

重新激活(定期计时器)

expirations

过期调整数

此信息在运行时通过 tx_timer_performance_info_get 和 tx_timer_performance_system_info_get 服务提供。应用程序计时器性能信息在确定应用程序是否正常运行时非常有用。此信息对于优化应用程序也很有用。

2.1.7 应用程序计时器控制块 TX_TIMER

每个应用程序计时器的特征都可在其控制块中找到。该控制块包含诸如 32 位过期标识值等有用信息。此结构在 tx_api.h 文件中定义。

应用程序计时器控制块可以位于内存中的任意位置,但最常见的是通过在任何函数的作用域外部定义该控件块来使其成为全局结构。

2.1.8 计时器过多

默认情况下,应用程序计时器在优先级为 0 时运行的隐藏系统线程中执行,该线程的优先级通常比任何应用程序线程都高。因此,在应用程序计时器内进行处理应保持最小值。

如果可能,还应尽可能避免使用在每个时钟周期过期的计时器。这种情况可能导致应用程序的开销过大。

如前所述,应用程序计时器在隐藏的系统线程中执行。因此,请不要在应用程序计时器的过期函数内执行任何 ThreadX 服务调用时选择挂起。

2.1.9 相对时间

除了前面所述的应用程序计时器,ThreadX 还提供单个连续递增的 32 位时钟周期计数器。每次发生计时器中断时,时钟周期计数器或时间就会加一。

应用程序可以通过分别调用 tx_time_get 和 tx_time_set 来读取或设置此 32 位计数器。此时钟周期计数器的使用完全由应用程序确定。ThreadX 不在内部使用此计时器。

2.2 Azure ThreadX 定时器组的相关函数

tx_timer_create 创建应用程序计时器

UINTtx_timer_create(
TX_TIMER*timer_ptr,
CHAR*name_ptr,
VOID(*expiration_function)(ULONG),
ULONGexpiration_input,
ULONGinitial_ticks,
ULONGreschedule_ticks,
UINTauto_activate);

说明

此服务创建具有指定过期函数和定期的应用程序计时器。

参数

timer_ptr:

指向计时器控制块的指针。

name_ptr:

指向计时器名称的指针。

expiration_function:

在计时器过期时要调用的应用程序函数。

expiration_input:

在计时器过期时要传递到过期函数的输入。

initial_ticks:

指定计时器过期的初始时钟周期数。合法值的范围为 1 至 0xFFFFFFFF。

reschedule_ticks:

指定第一个计时器过期后所有计时器过期的时钟周期数。如果此参数为 0,则计时器是一次性的。否则,对于周期性计时器,合法值的范围为 1 至 0xFFFFFFFF。

备注

一次性计时器过期后,必须通过 tx_timer_change 将其重置,然后才能再次激活。

auto_activate:

确定创建期间是否自动激活计时器。如果此值为 TX_AUTO_ACTIVATE (0x01),则激活计时器。否则,如果选择了值 TX_NO_ACTIVATE (0x00),则所创建的计时器处于非活动状态。在这种情况下,随后需要调用 tx_timer_activate 服务来实际启动计时器。

返回值

TX_SUCCESS:

(0X00) 成功创建应用程序计时器。

TX_TIMER_ERROR:

(0X15) 应用程序计时器指针无效。指针为 NULL 或已创建计时器。

TX_TICK_ERROR:

(0x16) 为初始时钟周期提供的值无效(零)。

TX_ACTIVATE_ERROR:

(0x17) 选择的激活无效。

NX_CALLER_ERROR:

(0x13) 此服务的调用方无效。

示例

TX_TIMERmy_timer;
UINTstatus;

/*Createanapplicationtimerthatexecutes
"my_timer_function"after100ticksinitiallyandthen
afterevery25ticks.Thistimerisspecifiedtostart
immediately!*/
status=tx_timer_create(&my_timer,"my_timer_name",
my_timer_function,0x1234,100,25,
TX_AUTO_ACTIVATE);

/*IfstatusequalsTX_SUCCESS,my_timer_functionwill
becalled100timertickslaterandthencalledevery
25timerticks.Notethatthevalue0x1234ispassedto
my_timer_functioneverytimeitiscalled.*/

另请参阅

tx_timer_activate

tx_timer_change

tx_timer_deactivate

tx_timer_delete

tx_timer_info_get

tx_timer_performance_info_get

tx_timer_performance_system_info_get

2.3 定时器组的应用演示

2.3.1 工程目录的建立

打开目标工程文件夹“MM32F3270Project”:

5f35ea8c-875a-11ed-bfe3-dac502259ad0.png

移除原有样例.c 文件sample_threadx.c:

5f4a7916-875a-11ed-bfe3-dac502259ad0.png

参考sample_threadx.c建立main_timer_demo.c文件,并添加hardware目录中的led.c、key.c到工程项目中。

3ThreadX的定时器组应用

3.1 代码实现

下载调试默认会运行到main()函数,如下为全部实现的代码。

Demo演示代码

/*Thisisasmalldemoofthehigh-performanceThreadXkernel.Itincludesexamplesofsix
threadsofdifferentpriorities,usingamessagequeue,semaphore,andaneventflagsgroup.*/

#include"tx_api.h"
#include"delay.h"
#include"led.h"
#include"key.h"
#include"uart.h"

#defineDEMO_STACK_SIZE1024

#defineTHREAD0_PRIORITY1
#defineTHREAD0_PREEMPTION_THRESHOLD1


/*DefinetheThreadXobjectcontrolblocks...*/
TX_THREADthread_0;

TX_TIMERMyTimer;

/*Definethecountersusedinthedemoapplication...*/
ULONGthread_0_counter;

/*Definethethreadstacks.*/
UCHARthread_0_stack[DEMO_STACK_SIZE];

/*Definethreadprototypes.*/

voidthread_0_entry(ULONGthread_input);


volatileunsignedintbootloop;


voidSystem_Init(void);
voidAppThreadCreate(void);
voidAppModuleCreate(void);


/*Definemainentrypoint.*/

intmain()
{
System_Init();

/*EntertheThreadXkernel.*/
tx_kernel_enter();
}


/*Definewhattheinitialsystemlookslike.*/

voidtx_application_define(void*first_unused_memory)
{
AppThreadCreate();
AppModuleCreate();

}

voidSystem_Init(void)
{
DELAY_Init();//cannotusesystick
LED_Init();
KEY_Init();
CONSOLE_Init(115200);
printf("!!!Start!!!
");

}

voidAppThreadCreate(void)
{
/*Createthread0.*/
tx_thread_create(
&thread_0,
"thread0",
thread_0_entry,
0,
thread_0_stack,
DEMO_STACK_SIZE,
THREAD0_PRIORITY,
THREAD0_PREEMPTION_THRESHOLD,
TX_NO_TIME_SLICE,
TX_AUTO_START);

}

voidAppModuleCreate(void)
{
/*Createatimergroup.*/
tx_timer_create(&MyTimer,
"MyTimer",
TimerCallback,
0,/*Theparameterspassed*/
100,/*Settheinitialdelayfortimertimeoverflow*/
1000,/*Setthetimerrunperiodaftertheinitialdelay*/
TX_AUTO_ACTIVATE);/*Activatethetimer*/
}


/*Thecallbackfunctionforthetimergroup.*/
voidTimerCallback(ULONGthread_input)
{

LED2_TOGGLE();

}

/*Definethetestthreads.*/
voidthread_0_entry(ULONGthread_input)
{
/*ThisthreadsimplycontrolsLEDflashingtoindicatethatthesystemisrunning*/
while(1)
{
/*Incrementthethreadcounter.*/
thread_0_counter++;
LED1_TOGGLE();
/*Sleepfor300ticks.*/
tx_thread_sleep(300);

}
}

3.2 下载与调试

运行程序,板载LED1闪烁,表示当前系统正在运行。

观察LED2间隔1s闪烁。

程序中创建定时器组,设置溢出周期为1000ms,在定时器回调函数中配置LED2引脚翻转,激活定时器。当计时周期到时,LED2引脚翻转,运行现象是LED2间隔1s闪烁,Demo演示成功。

4小结

Azure RTOS ThreadX提供定时器组能够使应用程序按照特定的时间间隔执行,结合MM32F3270的强大性能,可以实现Azure RTOS广泛的应用场景。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • threadx
    +关注

    关注

    0

    文章

    15

    浏览量

    13829
  • 定时器
    +关注

    关注

    23

    文章

    3246

    浏览量

    114731
  • RTOS
    +关注

    关注

    22

    文章

    811

    浏览量

    119598
  • 开发板
    +关注

    关注

    25

    文章

    5034

    浏览量

    97382
  • Azure
    +关注

    关注

    1

    文章

    123

    浏览量

    12779

原文标题:灵动微课堂 (第242讲)|使用MM32F3270基于Azure RTOS定时器组的应用

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MM32F3270系列32位MCU的特点有哪些

    上海灵动微电子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3内核的32位微控制MM32F3270适用于要求高集成度的高性能控制领域,如:工业
    发表于 11-03 07:20

    使用MM32F3270基于Azure RTOS定时器的应用

    翻转,运行现象是LED2间隔1s闪烁,Demo演示成功。4 小结Azure RTOS ThreadX提供定时器能够使应用程序按照特定的时间间隔执行,结合
    发表于 02-07 14:18

    灵动微电子MM32F3270系列MCU的特点介绍

    上海灵动微电子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3内核的32位微控制MM32F3270适用于要求高集成度的高性能控制领域,如:工业
    发表于 03-22 16:57 2157次阅读

    【国产MCU移植】MM32F3270 EVBoard

    【国产MCU移植】MM32F3270 EVBoard
    发表于 12-03 17:21 5次下载
    【国产MCU移植】<b class='flag-5'>MM32F3270</b> EVBoard

    MM32F3270控制的主要特点

    定时器和模拟资源。MM32F3270系列MCU的典型应用包括工业控制、楼宇自动化、消防监控、指纹模块、家电控制、电源管理、打印机、扫描仪、通信转换模块等。 MM32F3270的主要特点 •Arm
    发表于 12-07 17:26 1243次阅读

    基于MM32F3270 以太网 Client使用

    接下来给大家介绍基于TCP包的通讯。内容分为基于MM32F3270以太网Client的使用与基于MM32F3270以太网Server的使用。
    发表于 02-08 15:10 0次下载
    基于<b class='flag-5'>MM32F3270</b> 以太网 Client使用

    MM32F3270 勘误表(中文版)

    MM32F3270 勘误表(中文版)
    发表于 02-23 18:42 0次下载
    <b class='flag-5'>MM32F3270</b> 勘误表(中文版)

    使用MM32F3270基于Azure RTOS事件标志的应用

    使用MM32F3270基于Azure RTOS事件标志的应用
    的头像 发表于 10-27 11:31 508次阅读
    使用<b class='flag-5'>MM32F3270</b>基于<b class='flag-5'>Azure</b> <b class='flag-5'>RTOS</b>事件标志<b class='flag-5'>组</b>的应用

    使用MM32F3270基于Azure RTOS (ThreadX) 的移植

    使用MM32F3270基于Azure RTOS (ThreadX) 的移植
    的头像 发表于 10-27 10:15 757次阅读
    使用<b class='flag-5'>MM32F3270</b>基于<b class='flag-5'>Azure</b> <b class='flag-5'>RTOS</b> (ThreadX) 的移植

    MM32F3270 ADC注入通道

    MM32F3270 ADC注入通道
    的头像 发表于 09-27 15:59 984次阅读
    <b class='flag-5'>MM32F3270</b> ADC注入通道

    使用MM32F3270 FSMC驱动OLED

    使用MM32F3270 FSMC驱动OLED
    的头像 发表于 09-27 15:30 944次阅读
    使用<b class='flag-5'>MM32F3270</b> FSMC驱动OLED

    使用MM32F3270 FSMC驱动TFT-LCD

    使用MM32F3270 FSMC驱动TFT-LCD
    的头像 发表于 09-27 15:34 1015次阅读
    使用<b class='flag-5'>MM32F3270</b> FSMC驱动TFT-LCD

    基于MM32F3270以太网Client使用

    基于MM32F3270以太网Client使用
    的头像 发表于 09-27 15:44 697次阅读
    基于<b class='flag-5'>MM32F3270</b>以太网Client使用

    基于MM32F3270以太网UDP使用

    基于MM32F3270以太网 UDP使用
    的头像 发表于 09-27 15:42 497次阅读
    基于<b class='flag-5'>MM32F3270</b>以太网UDP使用

    基于MM32F3270以太网Client_Socket使用

    基于MM32F3270以太网Client_Socket使用
    的头像 发表于 09-27 15:37 540次阅读
    基于<b class='flag-5'>MM32F3270</b>以太网Client_Socket使用