- 作者:zzssdd2
- E-mail:[email protected]
一、前言
在uCOS全家桶宣布开源之后被微软收购的ThreadX也开源了,真是喜大普奔,对于我们这些嵌入式行业从业者来说,能够学习这些高含金量的代码对于眼界的开拓和能力的提升都是很有帮助的。ThreadX还包含了NETX、GUIX、FILEX、USBX等丰富的组件,几乎包含了嵌入式开发中的所有场景,这些组件和ThreadX-RTOS能够完美的配合完成一条龙的开发。ThreadX的github地址:[Azure RTOS (github.com)]:
二、准备
ThreadX在更新了几个版本之后已经提供了多个平台的移植端口,包括AC5、AC6、GCC、IAR,现在可以更方便地移植到各编译器平台了。本次移植是在STM32H743 + MDK-AC6 + ThreadX6.1.2
下完成。首先使用STM32CubeMX
新建一个工程,配置了LED、KEY、UART,然后将下载的ThreadX放在同一工程下(移植用到common
和ports/cortex_m7/ac6
下的文件)。
三、配置
1、添加文件及参数
-
工程新增
ThreadX/Port
、ThreadX/Src
分组,ThreadX/Port
f组中添加ports/cortex_m7/ac6/src
目录下所有文件以及ports\cortex_m7\ac6\example_build\sample_threadx
目录下的tx_initialize_low_level.S
文件;ThreadX/Src
组中添加threadx\common\src
下所有文件。添加完成如下图所示: -
-
配置工程宏定义参数和文件包含路径如下所示。
其中USE_HAL_DRIVER
和STM32H743xx
是使用HAL库创建工程需要包含的定义,TX_ENABLE_FPU_SUPPORT
是使能ThreadX的浮点运算支持需要定义的,在readme_threadx.txt
文档中有如下描述:
If saving the context of the FPU registers
is needed, the ThreadX library should be re-built with TX_ENABLE_FPU_SUPPORT defined.
当然要正确的使用硬件浮点运算功能还应该开启MDK中的如下配置:
2、修改适配文件
主要是对tx_initialize_low_level.S
文件进行修改,该文件作用是初始化栈地址和向量表、配置系统心跳节拍、配置部分中断优先级、定义部分中断处理函数。但是其中有些工作在STM32H743的启动文件startup_stm32h743xx.s
中已经做了,而STM32启动文件所实现的一些功能这个文件又没有实现。因为该文件是针对cortex_m7内核芯片做的,没有针对具体某一款芯片,所以没有STM32的启动文件实现的功能完善,因此不能替代启动文件。这里的修改方法是不动STM32启动文件,修改tx_initialize_low_level.S文件,在此提供两种修改方案:1、根据冲突修改tx_initialize_low_level.S文件内容;2、将tx_initialize_low_level.S文件改为C语言实现(STM32启动文件已经实现的不管,只需将ThreadX需要配置的功能用C实现)。
-
方案1修改后内容如下(修改处已标注):
@/**************************************************************************/ @/* */ @/* Copyright (c) Microsoft Corporation. All rights reserved. */ @/* */ @/* This software is licensed under the Microsoft Software License */ @/* Terms for Microsoft Azure RTOS. Full text of the license can be */ @/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ @/* and in the root directory of this software. */ @/* */ @/**************************************************************************/ @ @ @/**************************************************************************/ @/**************************************************************************/ @/** */ @/** ThreadX Component */ @/** */ @/** Initialize */ @/** */ @/**************************************************************************/ @/**************************************************************************/ @ @ .global _tx_thread_system_stack_ptr .global _tx_initialize_unused_memory .global _tx_timer_interrupt .global __main .global __tx_SVCallHandler .global __tx_PendSVHandler .global __tx_NMIHandler @ NMI .global __tx_BadHandler @ HardFault .global __tx_SVCallHandler @ SVCall .global __tx_DBGHandler @ Monitor .global __tx_PendSVHandler @ PendSV .global __tx_SysTickHandler @ SysTick .global __tx_IntHandler @ Int 0 @ @ SYSTEM_CLOCK = 480000000 @---modify by user(系统频率) SYSTICK_CYCLES = ((SYSTEM_CLOCK / 1000) -1) @---modify by user(时钟节拍) .text 32 .align 4 .syntax unified @/**************************************************************************/ @/* */ @/* FUNCTION RELEASE */ @/* */ @/* _tx_initialize_low_level Cortex-M7/AC6 */ @/* 6.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @/* */ @/* DESCRIPTION */ @/*