跳转到主要内容

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

<strong><font color="#4e5e9e"> 简 介 </font> </strong>

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

具体的介绍和用户指南可以参考:

<a href="https://docs.microsoft.com/zh-cn/azure/rtos/threadx/">https://docs.micr…;

本文描述了如何在MM32F3270系列MCU上使用Azure RTOS ThreadX做基本移植。

包括底层启动文件的移植, 系统Systick的配置技巧,引导用户理解Azure RTOS ThreadX基本应用。

表 1 适用系列型号
<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256992-1.png&…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

<strong><font color="#4e5e9e">1、移植应用的准备</font> </strong>

<strong>1.1 硬件开发板的准备</strong>

该移植过程中应用的开发板为MM32的EVBoard MB039(MM32F3273G9P)

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256993-2.png&…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

EV Board (MM32F3273G9P)的简要参数:

<ul><li>Arm Cortex-M3 内核</li>

<li>板载 MM32F3273G9P(LQFP144)</li>

<li>USB Host / Device、SPI、I2C</li>

<li>4 x Key、4 x LED</li>

<li>I2S Speaker</li>

<li>TF-Card</li>

<li>Ethernet PHY</li></ul>

<strong>1.2 软件的准备</strong>

<strong><font color="red">库函数和例程(Lib Samples)</font> </strong>

该移植过程中应用的Firmware分别为MM32F3270 库函数和例程下载地址:

<a href="https://www.mindmotion.com.cn/products/mm32mcu/mm32f/mm32f_mainstream/m…;

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256994-3.png&…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

<strong><font color="red">Azure RTOS ThreadX(源码)</font> </strong>

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

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

具体的商用使用条件参考Azure的许可证说明:

<a href="https://www.microsoft.com/en-us/legal/intellectualproperty/tech-licensi…;

Microsoft publishes the Azure RTOS source code to GitHub. No license is required to install and use the software for internal development, testing, and evaluation purposes. A license is required to distribute or sell components and devices unless using Azure RTOS licensed hardware.

Azure RTOS 何时需要许可证?

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

ThreadX 安装

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

shell复制

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

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

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

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256995-4.png&…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

如下图所示:

<strong><font color="red">Azure RTOS ThreadX(源码)支持的开发环境</font> </strong>

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

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256996-5.png&…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

本次移植过程使用keil模板为例子,做移植说明。

<strong><font color="#4e5e9e">2、Threadx 的移植</font> </strong>

该章节介绍了移植的过程和注意事项。

<strong>2.1 建立工程目录</strong>

建立目标工程文件夹“MM32F3270Project”:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256997-6.png&…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

复制Threadx中的“common”目录和“ports”目录下的“Cortex-M3”目录到:

“MM32F3270Project\threadx\common”

“MM32F3270Project\threadx\ports\cortex_m3\keil”

目录。

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256998-7.png&…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

复制LibSamples_MM32F3270中的“Device”目录到:MM32F3270Project\Device

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256999-8.png&…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

复制“Samples\LibSamples\GPIO\GPIO_Toggle”目录到“MM32F3270Project”目录。

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257000-9.png&…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>
<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257001-10.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

最后形成如下目标目录:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257002-11.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

<strong>2.2 添加源码到KEIL工程</strong>

打开IOtoggle工程;

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257003-12.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

它包含基本的LED blink功能;

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257004-13.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

通过完成编译,选择相应的调试下载工具(ULINK,Jlink,CMSIS-DAP Link,MM32LINK-OB),可以验证EVB正常工作,实现四个LED做500ms/500ms的亮暗闪烁。

验证过后,复制KEILPRJ工程目录为KEILPRJ_Threadx目录;

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257005-14.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

新建threadX/common分组,添加threadX/common/src下的所有c文件:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257006-15.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

新建threadX/ports/mm32f3270/keil分组,选择对应的编译环境。

移植使用的KEIL为5.35,选用KEIL compiler version 5编译器(armcc)。

需要添加 threadX\ports\cortex_m3\keil\src 下的所有 .s 文件:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257007-16.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

新建threadX/ports/mm32f3270/keil_s分组,选择对应的汇编文件。

添加threadx\ports\cortex_m3\keil\example_build 下的.s 文件:

tx_initialize_low_level.s:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257008-17.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

新建threadX/ports/mm32f3270/demo分组。

添加threadx\ports\cortex_m3\keil\example_build 下的.c 文件:

sample_threadx.c:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257009-18.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

因为sample_threadx.c包含main()函数,需要USER 组,以删除USER目录下的main.c文件。

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257010-19.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

设置编译环境,选择Use default compiler version 5,编译器为(armcc):

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257011-20.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

设“C/C++”的头文件包含目录:

添加threadx\ports\下的.h文件包含目录:

..\threadx\common\inc

..\threadx\ports\cortex_m3\keil\inc

删除未用到的目录

..\USER

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257012-21.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

完成源代码添加和头文件目录包含,进行首次编译,

编译报如下错误:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257013-23.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

检查适配ThreadX官方的底层适配文件tx_initialize_low_level.s,发现除了必须的函数:_tx_initialize_low_level。该tx_initialize_low_level.s还包含了汇编启动文件startup_mm32f327x_keil.s中的配置代码,包括stack与heap的配置、中断向量表,从而导致了冲突:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257014-24.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

因此需要移除tx_initialize_low_level.s中stack与heap的配置、中断向量表相关的代码(参考上图中的代码),因为已经在startup_mm32f327x_keil.s中实现。

同样的原因,需要删除Reset_Handler函数:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257015-25.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

及删除__user_initial_stackheap函数:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257016-26.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

并修改ThreadX适配文件tx_initialize_low_level.s中SYSTICK配置的参数。

修改SYSCLK频率,配置systick的中断时间间隔为1ms:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257017-27.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

并修改tx_initialize_low_level.s中相关代码,以匹配MM32F3270系列的启动代码startup_mm32f327x_keil.s,以下左侧为tx_initialize_low_level.s原始代码,右侧为修改后代码。

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257018-28.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

修改__tx_vectors为__Vectors

修改|Image$$ZI$$Limit|

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257019-29.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

添加SysTick_Handler声明到如下代码:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257020-30.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

具体参考修改后的.s文件。

再次编译,发现SysTick_Handler有冲突:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257021-31.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

原因是系统中的DELAY_Init &DELAY_Ms延时函数使用了SysTick_Handler。

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257022-32.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

把宏定义:#define USE_SYSTICK_DELAY 1

修改为:#define USE_SYSTICK_DELAY 0

编译通过:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257023-33.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

配置好下载Debugger工具(可以使用MM32LINK-OB,JLINK,U-LINK或CMSIS-DAP LINK),下载调试。

<strong><font color="#4e5e9e">3、Threadx 的运行与调试</font> </strong>

<strong>3.1 下载与调试</strong>

下载调试默认会运行到main()函数。

该demo示例,建立了5个线程,程序都不与芯片的外设相关:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257024-34.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

线程只做数值自加,Demo演示了事件(Event),队列(queue),信号量(semaphore)的功能。

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257025-35.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

全速运行后,可以看到相关的数值在变化:

<center><img src="http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257026-36.png…; alt=“使用MM32F3270基于Azure RTOS (ThreadX) 的移植"></center>

<strong><font color="#4e5e9e">4、小结</font> </strong>

关于使用MM32F3270基于Azure RTOS ThreadX 的最小系统就移植完成,并运行起来,后面再给大家介绍Task相关的配置,信号量,互斥锁等Azure RTOS的特色功能。

<strong>提示</strong>

可通过下方链接进行下载:
<a href="https://mindmotion.com.cn/whir_system/module/extension/Download.aspx?pa…;

来源:<a href="https://mp.weixin.qq.com/s/SbLIEdSoEzmP391AQAlkDw"&gt; 灵动MM32MCU</a>
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。