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

cathy的头像
cathy 发布于:周五, 06/10/2022 - 16:07 ,关键词:

简 介

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

1、移植应用的准备

1.1 硬件开发板的准备

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

“使用MM32F3270基于Azure

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

Azure RTOS ThreadX(源码)

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

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

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

https://www.microsoft.com/en-us/legal/intellectualproperty/tech-licensing/programs?msclkid=f7ab4ff3afa011ec90a79366a52034fa&activetab=pivot1:primaryr11

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

如下图所示:

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

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

“使用MM32F3270基于Azure

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

2、Threadx 的移植

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

2.1 建立工程目录

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

“使用MM32F3270基于Azure

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

“MM32F3270Project\threadx\common”

“MM32F3270Project\threadx\ports\cortex_m3\keil”

目录。

“使用MM32F3270基于Azure

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

“使用MM32F3270基于Azure

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

“使用MM32F3270基于Azure

“使用MM32F3270基于Azure

最后形成如下目标目录:

“使用MM32F3270基于Azure

2.2 添加源码到KEIL工程

打开IOtoggle工程;

“使用MM32F3270基于Azure

它包含基本的LED blink功能;

“使用MM32F3270基于Azure

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

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

“使用MM32F3270基于Azure

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

“使用MM32F3270基于Azure

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

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

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

“使用MM32F3270基于Azure

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

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

tx_initialize_low_level.s:

“使用MM32F3270基于Azure

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

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

sample_threadx.c:

“使用MM32F3270基于Azure

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

“使用MM32F3270基于Azure

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

“使用MM32F3270基于Azure

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

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

..\threadx\common\inc

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

删除未用到的目录

..\USER

“使用MM32F3270基于Azure

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

编译报如下错误:

“使用MM32F3270基于Azure

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

“使用MM32F3270基于Azure

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

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

“使用MM32F3270基于Azure

及删除__user_initial_stackheap函数:

“使用MM32F3270基于Azure

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

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

“使用MM32F3270基于Azure

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

“使用MM32F3270基于Azure

修改__tx_vectors为__Vectors

修改|Image$$ZI$$Limit|

“使用MM32F3270基于Azure

添加SysTick_Handler声明到如下代码:

“使用MM32F3270基于Azure

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

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

“使用MM32F3270基于Azure

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

“使用MM32F3270基于Azure

把宏定义:#define USE_SYSTICK_DELAY 1

修改为:#define USE_SYSTICK_DELAY 0

编译通过:

“使用MM32F3270基于Azure

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

3、Threadx 的运行与调试

3.1 下载与调试

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

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

“使用MM32F3270基于Azure

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

“使用MM32F3270基于Azure

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

“使用MM32F3270基于Azure

4、小结

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

提示

可通过下方链接进行下载:
https://mindmotion.com.cn/whir_system/module/extension/Download.aspx?path=/uploadfiles/&name=download%2FMM32F3270Project.zip

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

围观 139