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

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 已经移植成功。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值