![cathy的头像 cathy的头像](https://cdn.eetrend.com/files/styles/picture200/public/letter-avatars/u-593.png?itok=XTs2kpZ8)
简 介
Azure RTOS ThreadX 是 Microsoft 提供的高级工业级实时操作系统 (RTOS)。它是专门为深度嵌入式实时 IoT 应用程序设计的。Azure RTOS ThreadX 提供高级计划、通信、同步、计时器、内存管理和中断管理功能。此外,Azure RTOS ThreadX 具有许多高级功能,包括 picokernel™ 体系结构、preemption-threshold™ 计划、event-chaining™、执行分析、性能指标和系统事件跟踪。Azure RTOS ThreadX 非常易于使用,适用于要求极其苛刻的嵌入式应用程序。Azure RTOS ThreadX 在各种产品(包括消费者设备、医疗电子设备和工业控制设备)上的部署次数已达数十亿次。
具体的介绍和用户指南可以参考:
https://docs.microsoft.com/zh-cn/azure/rtos/threadx/
本文描述了如何在MM32F3270系列MCU上使用Azure RTOS ThreadX做基本移植。
包括底层启动文件的移植, 系统Systick的配置技巧,引导用户理解Azure RTOS ThreadX基本应用。
表 1 适用系列型号
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256992-1.png)
1、移植应用的准备
1.1 硬件开发板的准备
该移植过程中应用的开发板为MM32的EVBoard MB039(MM32F3273G9P)
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256993-2.png)
EV Board (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 库函数和例程下载地址:
https://www.mindmotion.com.cn/products/mm32mcu/mm32f/mm32f_mainstream/mm32f3270/
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256994-3.png)
Azure RTOS ThreadX(源码)
ThreadX的源代码已经开放,我们可以从ThreadX公共源代码存储库获取 Azure RTOS ThreadX,网址为:
https://github.com/azure-rtos/threadx/
具体的商用使用条件参考Azure的许可证说明:
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 主页上的“下载”按钮来下载存储库的副本。
下载后的仓库代码目录列表如下:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256995-4.png)
如下图所示:
Azure RTOS ThreadX(源码)支持的开发环境
ThreadX 内核提供好了各种主流硬件平台和软件平台的移植文件,以Cortex_M3为例,可以支持以下六种开发环境:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256996-5.png)
本次移植过程使用keil模板为例子,做移植说明。
2、Threadx 的移植
该章节介绍了移植的过程和注意事项。
2.1 建立工程目录
建立目标工程文件夹“MM32F3270Project”:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256997-6.png)
复制Threadx中的“common”目录和“ports”目录下的“Cortex-M3”目录到:
“MM32F3270Project\threadx\common”
“MM32F3270Project\threadx\ports\cortex_m3\keil”
目录。
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256998-7.png)
复制LibSamples_MM32F3270中的“Device”目录到:MM32F3270Project\Device
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-256999-8.png)
复制“Samples\LibSamples\GPIO\GPIO_Toggle”目录到“MM32F3270Project”目录。
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257000-9.png)
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257001-10.png)
最后形成如下目标目录:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257002-11.png)
2.2 添加源码到KEIL工程
打开IOtoggle工程;
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257003-12.png)
它包含基本的LED blink功能;
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257004-13.png)
通过完成编译,选择相应的调试下载工具(ULINK,Jlink,CMSIS-DAP Link,MM32LINK-OB),可以验证EVB正常工作,实现四个LED做500ms/500ms的亮暗闪烁。
验证过后,复制KEILPRJ工程目录为KEILPRJ_Threadx目录;
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257005-14.png)
新建threadX/common分组,添加threadX/common/src下的所有c文件:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257006-15.png)
新建threadX/ports/mm32f3270/keil分组,选择对应的编译环境。
移植使用的KEIL为5.35,选用KEIL compiler version 5编译器(armcc)。
需要添加 threadX\ports\cortex_m3\keil\src 下的所有 .s 文件:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257007-16.png)
新建threadX/ports/mm32f3270/keil_s分组,选择对应的汇编文件。
添加threadx\ports\cortex_m3\keil\example_build 下的.s 文件:
tx_initialize_low_level.s:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257008-17.png)
新建threadX/ports/mm32f3270/demo分组。
添加threadx\ports\cortex_m3\keil\example_build 下的.c 文件:
sample_threadx.c:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257009-18.png)
因为sample_threadx.c包含main()函数,需要USER 组,以删除USER目录下的main.c文件。
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257010-19.png)
设置编译环境,选择Use default compiler version 5,编译器为(armcc):
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257011-20.png)
设“C/C++”的头文件包含目录:
添加threadx\ports\下的.h文件包含目录:
..\threadx\common\inc
..\threadx\ports\cortex_m3\keil\inc
删除未用到的目录
..\USER
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257012-21.png)
完成源代码添加和头文件目录包含,进行首次编译,
编译报如下错误:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257013-23.png)
检查适配ThreadX官方的底层适配文件tx_initialize_low_level.s,发现除了必须的函数:_tx_initialize_low_level。该tx_initialize_low_level.s还包含了汇编启动文件startup_mm32f327x_keil.s中的配置代码,包括stack与heap的配置、中断向量表,从而导致了冲突:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257014-24.png)
因此需要移除tx_initialize_low_level.s中stack与heap的配置、中断向量表相关的代码(参考上图中的代码),因为已经在startup_mm32f327x_keil.s中实现。
同样的原因,需要删除Reset_Handler函数:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257015-25.png)
及删除__user_initial_stackheap函数:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257016-26.png)
并修改ThreadX适配文件tx_initialize_low_level.s中SYSTICK配置的参数。
修改SYSCLK频率,配置systick的中断时间间隔为1ms:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257017-27.png)
并修改tx_initialize_low_level.s中相关代码,以匹配MM32F3270系列的启动代码startup_mm32f327x_keil.s,以下左侧为tx_initialize_low_level.s原始代码,右侧为修改后代码。
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257018-28.png)
修改__tx_vectors为__Vectors
修改|Image$$ZI$$Limit|
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257019-29.png)
添加SysTick_Handler声明到如下代码:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257020-30.png)
具体参考修改后的.s文件。
再次编译,发现SysTick_Handler有冲突:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257021-31.png)
原因是系统中的DELAY_Init &DELAY_Ms延时函数使用了SysTick_Handler。
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257022-32.png)
把宏定义:#define USE_SYSTICK_DELAY 1
修改为:#define USE_SYSTICK_DELAY 0
编译通过:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257023-33.png)
配置好下载Debugger工具(可以使用MM32LINK-OB,JLINK,U-LINK或CMSIS-DAP LINK),下载调试。
3、Threadx 的运行与调试
3.1 下载与调试
下载调试默认会运行到main()函数。
该demo示例,建立了5个线程,程序都不与芯片的外设相关:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257024-34.png)
线程只做数值自加,Demo演示了事件(Event),队列(queue),信号量(semaphore)的功能。
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257025-35.png)
全速运行后,可以看到相关的数值在变化:
![“使用MM32F3270基于Azure](http://mcu.eetrend.com/files/2022-06/wen_zhang_/100561111-257026-36.png)
4、小结
关于使用MM32F3270基于Azure RTOS ThreadX 的最小系统就移植完成,并运行起来,后面再给大家介绍Task相关的配置,信号量,互斥锁等Azure RTOS的特色功能。
提示
来源: 灵动MM32MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。