Threadx移植
本章所讲的移植方法是基于STM32F407系列芯片在mdk5编译环境上的移植方法,但此方法也通用于其他系列单片机型号,此文会详细讲解每个步骤,希望大家一步一步跟着移植。
1.0准备资源文件
本章所需要的资源文件如下:
一个裸板工程(我所使用的是正点原子的HAL库版本)
ThreadX资源文件(官方网站:https://github.com/azure-rtos/threadx[我所使用的是6.13版本])
注意:我所使用的AC6环境,因为AC5编译环境编译文件太慢,所以本章所教授的是AC6编译(MDK5)下编译工程,而且所在的环境必须是全英文环境!!!
左边为裸板工程,右边是下载的资源文件。
1.1添加ThreadX到工程中
在所准备的工程模板下创建ThreadX文件夹
将下载的ThreadX资源文件打开,要求在如图所示的目录下,进行下一步操作。
把这里所有的内容全部粘贴复制到刚在裸机模板的ThreadX文件夹内,要如图所示:
之后,打开工程,我的工程如图所示:
我们点击三色框,如图所示:
我们接下来要在工程下添加ThreadX资源文件,点击新建文件组,即如图所示位置。
新建ThreadX/Ports和ThreadX/Source这两个文件组。
定位到裸板工程目录下的ThreadX/ports/cortex_m4/ac6/example_build/sample_threadx将tx_initialize_low_level.S添加到ThreadX/Ports组里。(ps:同样的只有选定文件类型为 All files才可以添加,即先点击1才能看见2)
在定位到裸板工程目录下的ThreadX/ports/cortex_m4/ac6/srcj将里面所有文件全部添加到ThreadX/Ports组里(ps:同样的只有选定文件类型为 All files才可添加 )
到这一步ThreadX/Ports组里面的所有东西就添加完了,因为是在AC6模式下的所以共有8个文件如图所示:
接下来是添加ThreadX/Source组内容,首先定位到裸板工程目录下的ThreadX/common/src中将此文件所有的.c文全部添加到ThreadX/Source组中。
所以ThreadX/Source组内容如下:
点击OK,此时我们的工程如下:
之后就是头文件的添加:
点击魔术棒,点击C/C++选项卡。选择添加头文件,
首先定位到:裸板工程目录下的\ThreadX\ports\cortex_m4\ac6\inc中添加头文件
在定位到:裸板工程目录下的\ThreadX\common\inc中添加头文件
如图所示:
1.2修改tx_initialize_low_level.s文件
首先打开tx_initialize_low_level.s文件,在如图所示的位置添加
- .global __initial_sp (堆栈指针,指向堆栈顶.)
- .global __Vectors (这是启动文件向量表,用于管理启动信息)
之后更改ThreadX时钟频率,
- 将SYSTEM_CLOCK = 6000000更改为SYSTEM_CLOCK = 168000000【等于系统时钟频率】
- 将SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1)更改为SYSTICK_CYCLES = ((SYSTEM_CLOCK / 1000) -1)【这里更改的是ThreadX滴答频率即上下文切换速度1/1000秒,等于1毫秒】
再往下会找到一个这样子的代码块
1 | @ /* Set base of available memory to end of non-initialised RAM area. */ |
更改为
1 | @ /* Set base of available memory to end of non-initialised RAM area. */ |
更改完毕之后工程是这个样子的
到这里修改tx_initialize_low_level.s文件已经完毕了,其主要的是会找到向量表和堆栈指针,然后会修改时钟频率就可以了。
1.3修改stm32f4xx_it.c文件
在上面由于我们已经更改的启动文件,所以我们需要修改stm32f4xx_it.c文件。
首先定位到USER/stm32f4xx_it.c文件中,寻找到如图所示代码并注释掉。
我在这里讲解一下:
- 首先void PendSV_Handler(void)要注释掉的原因是ThreadX有自己的异常检测,所以是重复的要求注释掉。
- void SysTick_Handler(void)是系统时钟中断,由于ThreadX需要时钟频率,所以我们把这个给予了ThreadXD但是出现了一些问题,就是HAL_IncTick();【HAL库就没有时钟频率了】所以我们在下面首先要在分配HAL_IncTick【即HAL库一个新的时钟源】
到这一步stm32f4xx_it.c就修改完毕了。但是我们还是不能编译,由于HAL库的特性和AC6编译环境的特性,我们还需要在进行修改。
1.4修改sys.c文件
首先定位sys.c文件中,由于我们使用的是AC6编译环境,所有会有汇编的一些错误,这些错误主要的是位于sys.c文件里面。将其汇编改为如下
1 | //THUMB指令不支持汇编内联 |
修改结果如图所示:
到这sys.c就修改完毕。
1.5重构delay.c/delay.h文件
首先打开delay.c文件,删除全部的代码,添加以下代码:
1 |
|
在打开delay.h文件,也是删除全部代码,添加如下代码:
1 |
|
到此delay文件修改完毕。
1.6删除usart.c/usart.h文件
删除usart.c文件
删除usart.h文件
1.7添加TX_USER文件
首先在SYSTEM文件中新建一个TX_USER文件夹,在新建TX_USER.h文件首先把TX_USER文件加入SYSTEM组中
即按如图所示顺序:
之后在tx_user.h文件中写入以下代码:
1 | /* |
最后结果为:
然后填好头文件路径
1.8添加宏定义
打开魔术棒,打开c/c++选项卡,在DEFINE上修改为USE_HAL_DRIVER, STM32F407xx,USE_FULL_LL_DRIVER,TX_ENABLE_FPU_SUPPORT, TX_ENABLE_STACK_CHECKING, TX_INCLUDE_USER_DEFINE_FILE
其中TX_ENABLE_FPU_SUPPORT,X_ENABLE_STACK_CHECKING, TX_INCLUDE_USER_DEFINE_FILE是ThreadX所需要的即如果你是要移植其他型号单片机就只添加这个就可以了。
在带ASM选项卡中,更改为如图所示。
1.9编写主函数
编写主函数:
主函数代码为如下:粘贴复制即可。
1 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
到此编译无错误就可以下载了,但是注意一件事,在
1 | void TASK_INSPECT_Timing_Light_APP(ULONG thread_input) |
附录:编译错误的解决办法
有时候会出这样子的错误,首先你要检查你的ASM选项卡是否修改,再然后按图修改添加微软库。
如果修改了还出这样子的问题,那你首先定位到startup_stm32f407xx.s文件夹里面,Ctrl+A 之后Ctrl+C 再然后Ctrl+V就会解决问题。【这是个bug不用管它!】
在文章的最后奉上已经完毕的链接:
链接:https://pan.baidu.com/s/1mzz7Cm2qqRYGZFa8Sw1zSw
提取码:1ywd
-------------本文结束感谢您的阅读-------------
本文链接: http://1ywd1.github.io/2021/02/08/Threadx%E7%AC%AC%E5%9B%9B%E7%AB%A0%E8%AE%B2%E8%A7%A3/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!