threadx 移植(二)-基于 CubeIDE 移植 threadx

tech2022-08-31  105

CubeIDE 移植 threadx

本系列教程均基于正点原子 L475 潘多拉开发板为硬件平台。项目开源地址 github 地址

threadx 移植(一)-CubeIDE 新建 LED 闪烁工程

threadx 移植(二)-基于 CubeIDE 移植 threadx

threadx 移植(三)-添加串口打印功能

下载 threadx 源码

threadx 源码 github 仓库地址

移植所需要的全部文件

因为 stm32l475 使用的内核为 conter-m4,使用的开发环境为 CubeIDE,所以选择 ports 文件的时候选择 cm4 以及 gnu。

common/src 文件夹下所有源文件common/inc 文件夹下所有头文件ports/cortex_m4/gnu/src 文件夹下所有源文件ports/cortex_m4/gnu/inc 文件夹下的所有头文件ports/cortex_m4/gnu/example_build 文件夹下的 tx_initialize_low_level.S 文件

以上所列即为移植 threadx 最小系统所需要的全部文件

添加源码到工程

将上述文件添加到本地工程的文件夹中,CubeIDE 会自动将文件的目录结构显示在工程中,如果没有显示刷新工程即可,添加完成之后工程目录如下所示:

工程目录结构和本地资源目录结构是一致的,这里只是修改了工程目录结构,但是源码并不会参与编译,而且头文件路径也没有设置。

添加头文件路径

右键工程,选择 Properties 属性,如下图所示

添加汇编文件的头文件路径

汇编文件的头文件添加完成之后如下

C 文件的头文件路径

c 文件头文件路径添加完成之后如下图

汇编和 C 头文件添加完毕之后将设置保存

将源码参与编译

添加完成之后 threadx 文件夹会有一个 c 的标志,如下图所示

编译程序

将 threadx 源码加入工程参与编译后会报错,接下来就一个一个解决报错。

中断服务函数重定义报错

multiple definition of `SysTick_Handler' multiple definition of `PendSV_Handler'

threadx 系统中会用到这两个中断服务函数,所以需要屏蔽掉 stm32l4xx_it.c 文件中工程自带的这两个中断服务函数。

中断向量表未定义报错

threadx/ports/cortex_m4/gnu/example_build/tx_initialize_low_level.S:114: undefined reference to `_vectors'

将 tx_initialize_low_level.S 文件中的 _vectors 换为自己的中断向量表,例如本例中 startup_stm32l475vetx.s 启动文件中定义了中断向量表为 g_pfnVectors,将其替换即可。

__RAM_segment_used_end__ 未定义报错

undefined reference to `__RAM_segment_used_end__'

需要在链接脚本中指定未使用的 RAM 地址,所以在链接脚本栈中栈结束的地方指定为 RAM 未使用的地址

._user_heap_stack : { . = ALIGN(8); PROVIDE ( end = . ); PROVIDE ( _end = . ); . = . + _Min_Heap_Size; . = . + _Min_Stack_Size; . = ALIGN(8); __RAM_segment_used_end__ = .; } >RAM

至此,编译报错已经全部解决

启动操作系统内核

main.c 文件中包含 threadx 系统头文件 tx_api.h ,并在 while(1) 之前调用 tx_kernel_enter() 函数,此时会报错

undefined reference to `tx_application_define'

所以需要自己定义 tx_application_define 这个函数,并在这个函数中启动一个线程来进行 LED 的闪烁,示例代码如下:

TX_THREAD demo_thread; #define DEMO_STACK_SIZE 1024 static uint8_t thread_stack[DEMO_STACK_SIZE]; void demo_thread_entry(ULONG thread_input) { /* This thread simply sits in while-forever-sleep loop. */ while(1) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET); tx_thread_sleep(1000); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET); tx_thread_sleep(1000); } } void tx_application_define(void *first_unused_memory) { /* Create the main thread. */ tx_thread_create(&demo_thread, "demo thread", demo_thread_entry, 0, thread_stack, DEMO_STACK_SIZE, 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); }

编译下载,可以看到 LED 已经成功的闪烁,至此,threadx 已经移植成功。

最新回复(0)