1、 本文讲解利用cubeMX+ TrueSTUDIO工具来移植ThreadX系统到stm32f407ZGT6芯片上,首先讲讲为什么选择这样的框架来移植?因为cubeMX支持生成的工程代码有如下几种:

打开ThreadX的官方网站https://rtos.com/solutions/threadx/real-time-operating-system/在Debuggers栏目下可以找到与之匹配有Atollic TrueSTUDIO、IAR,然而IAR需要授权,所以我选择免费版本的Atollic TrueSTUDIO。
2、在计算机的某个盘符下建立文件夹,取名ThreadX_Study,再在该文件夹下建立新的文件夹,取名CubeMX_Project

3、 建立CubeMX工程,工程名称为ThreadX_F407ZGT6,保存路径为G:\ThreadX_Study\CubeMX_Project

4、 时钟配置

5、 利用cubeMX配置一个输出GPIO用来控制LED

6、 重要配置


去掉Pendablerequest for system service项的Generate IRQ handler选项,是因为ThreadX需要用到PendSV_Handler中断服务程序。
7、 利用cubeMX生成AtollicTrueSTUDIO工程文件

生成完毕,在弹出的对话框中点击close

8、 打开Atollic TrueSTUDIO软件,选择工作空间G:\ThreadX_Study,然后点击OK

9、 点击File->Import…弹出如下对话框,选择Existing Projects into Workspace,然后点击Next

10、按下图操作,然后点击Finish

这时在软件的左侧工程栏会出现cubeMX生成的工程文件:

11、打开CubeMX_Project->Src->main.c文件,在main函数中while(1)代码段中添加如下代码用来控制LED秒闪:
/*USER CODE BEGIN WHILE */
while (1) {
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_Delay(1000);
/*USER CODE END WHILE */
/*USER CODE BEGIN 3 */
}
/* USER CODEEND 3 */然后编译、烧录、运行。如果此时LED闪烁,说明软件硬件都没问题,下面直接进入移植ThreadX阶段。
12、将threadx-6.0.2_rel目录下的common文件夹及ports文件夹拷贝到ThreadX_Study->CubeMX_Project目录下

13、 因为Atollic TrueSTUDIO采用的是gcc编译以及F407为M4内核,所以需要对ports目录下的无关目录及文件进行删除,删除后的目录及文件如下

14、 回到TrueSTUDIO软件,这时左侧工程目录已经自动加载了刚才复制的目录及文件了

15、 现在对ports\cortex_m4\gnu\example_build目录下的文件进行删除操作,删除以下文件:
build_threadx.bat
build_threadx_sample.bat
cortexm4_crt0.s
sample_threadx.ld
tx_simulator_startup.s
删除后的目录文件如下

16、修改sample_threadx.c文件,将该文件里的main函数名称改为main_user
int main_user()
{
/* Enter the ThreadX kernel. */
tx_kernel_enter();
}将该函数在CubeMX_Project->Src->main.c文件中进行声明并在main()函数中调用:
声明:
/*USER CODE BEGIN PTD */
externint main_user();
/* USER CODEEND PTD */
调用:
/*USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_Delay(1000);
main_user();
/*USER CODE END WHILE */
/*USER CODE BEGIN 3 */
}
/* USER CODEEND 3 */
17、修改tx_initialize_low_level.S文件
SYSTEM_CLOCK = 12000000018、修改启动文件
在CubeMX_Project->startup->startup_stm32f407xx.s文件中修改两个地方:
第一,在.global g_pfnVectors前面添加.global _vectors
.thumb
.global_vectors
.global g_pfnVectors
第二,在g_pfnVectors:后面添加_vectors:
g_pfnVectors:
_vectors:
.word _estack
19、修改链接文件
将__RAM_segment_used_end__ = .;添加到CubeMX_Project->STM32F407ZG_FLASH.ld文件中:
._user_heap_stack :
{
. = ALIGN(4);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(4);
__RAM_segment_used_end__ = .;
} >RAM20、添加头文件及源文件路径


21、添加LED闪烁代码
打开ports\cortex_m4\gnu\example_build\sample_threadx.c文件,
第一, 添加头文件
#include"gpio.h"
第二,在void thread_0_entry(ULONGthread_input)函数中添加LED闪烁代码,并更改睡眠时间为50个ticks
while(1)
{
/*Increment the thread counter. */
thread_0_counter++;
/*Sleep for 10 ticks. */
tx_thread_sleep(50);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_6);
/*Set event flag 0 to wakeup thread 5. */
status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR);
/*Check status. */
if (status != TX_SUCCESS)
break;
}22、编译工程,下载运行,这时可以看到LED闪烁了。

















