ThreadX与STM32H7相关资源
ThreadX官方文档
ThreadX代码仓库
STM32Cube MCU包
ThreadX移植
以下基于STM32H7的基本模板(已经移植HAL)
将ThreadX源文件添加进工程中(MDK为例)
在ThreadX代码仓库中下载ThreadX,下载好的ThreadX(6.2.1)有以下文件夹
.
├── cmake # CMake,用于构建工程,使用MDK时可删除
├── common # ThreadX
├── common_modules # ThreadX module核心文件
├── common_smp # ThreadX SMP核心文件
├── docs # 文档支持
├── ports # 针对于不同架构和编译器的接口文件,需要做修改,适用于ThreadX
│ ├── cortex_m7
│ │ ├── iar # IAR工程样例
│ │ │ ├── example build # IAR workspace and sample project files
│ │ │ ├── inc # 适用于cortex_m7架构的tx_port.h
│ │ │ └── src # 适用于cortex_m7架构的接口源代码
│ │ ├── ac6 # AC6工程样例
│ │ ├── gnu # GUN工程样例
│ │ └── ...
│ └── ...
├── ports_modules # 同上,适用于threadX modules
├── ports_smp # 同上,适用于threadX SMP
├── samples # 一些例子
└── utility # 测试样例和资源
将.\common\src
下的所有源文件(除tx_misra.c
外)添加进工程,将.ports\cortex_m7\ac6\src
下的所有源文件(除tx_misra.S
外)和".\ports\cortex_m7\ac6\example_build\sample_threadx\tx_initialize_low_level.S"
添加进工程,如图所示:
添加包含目录
在MDK的C\C++选项的包含目录中添加.\ports\cortex_m7\ac6\inc
(用于包含tx_port.h)、.\common\inc
,在ASM选项中的包含目录中添加tx_user.h
所在的目录
使用tx_user.h
.\common\inc\tx_user_sample.h
提供了一个tx_user.h的模板,tx_user.h提供了一些选项用于配置ThreadX,编译器中宏定义TX_INCLUDE_USER_DEFINE_FILE即可将tx_user.h包含入tx_port.h以使用tx_user.h。
修改tx_initialize_low_level.S
修改时钟频率和SysTick频率
SYSTEM_CLOCK = 400000000
SYSTICK_CYCLES = ((SYSTEM_CLOCK / 1000) -1)
修改堆栈起始地址
LDR r0, =_tx_initialize_unused_memory @ Build address of unused memory pointer
LDR r1, =__initial_sp @ Build first free address
这里的起始地址是ST提供的启动文件中的__initial_sp:
Stack_Size EQU 0x00001000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
修改向量表地址
@
@ /* Setup Vector Table Offset Register. */
@
MOV r0, #0xE000E000 @ Build address of NVIC registers
LDR r1, =__Vectors @ Pickup address of vector table
STR r1, [r0, #0xD08] @ Set vector table address
@
@ /* Set system stack pointer from vector value. */
@
LDR r0, =_tx_thread_system_stack_ptr @ Build address of system stack pointer
LDR r1, =__Vectors @ Pickup address of vector table
LDR r1, [r1] @ Pickup reset stack pointer
STR r1, [r0] @ Save system stack pointer
这里的向量表地址是ST提供的启动文件中的__Vectors:
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
在systick中调用HAL_IncTick,以保证HAL的正常工作
SysTick_Handler:
@ VOID TimerInterruptHandler (VOID)
@ {
@
PUSH {r0, lr}
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
BL _tx_execution_isr_enter @ Call the ISR enter function
#endif
BL HAL_IncTick
BL _tx_timer_interrupt
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
BL _tx_execution_isr_exit @ Call the ISR exit function
#endif
关闭其他的SysTick_Handler和PendSV_Handler
这两个中断函数都由ThreadX实现,其他地方的定义应该删除。
实现void tx_application_define(void *first_unused_memory)
函数
这个函数应该实现任务的定义,可参考.\samples\demo_threadx.c
在main函数中调用tx_kernel_enter()
正常情况下,这个函数不会返回,可参考.\samples\demo_threadx.c
,在调用这个函数前需要进行最基本的初始化(例如配置系统时钟)