振兴中华之threadX RTOS移植到stm32用stm32cubeMX 保姆级教程

张开发
2026/4/4 9:03:30 15 分钟阅读
振兴中华之threadX RTOS移植到stm32用stm32cubeMX 保姆级教程
1.背景我曾经写了一个PX5 RTOS移植到stm32用stm32cubeMX的保姆级教程链接如下https://blog.csdn.net/dqsh06/article/details/150612971?spm1001.2014.3001.5501这个PX5 RTOS是个很好的RTOS但是它有两个问题暂时不好克服。哪两个问题呢1. 代码不开源尤其是关键代码没有开源大家不能完整的研究和放心的使用2. 不是免费的license商用的话估计要交license费。虽然可以移植成功并且可以大量使用但是万一被告的话搞不好要花很多钱。所以要找另外好用的免费的RTOS。刚刚好PX5 RTOS的老板和作者先写了threadX, 据说全球有120亿的设备使用了这个threadX, 而且在太空车上都是用的这个那么它的性能和安全性是毫无疑问的。而且这个threadX还被微软收购了微软收购了后就将其改造成azureRTOS, 并且开源了。不仅开源了而且微软将这个RTOS捐赠给了eclipse基金会license也变成了MIT license, 大家可以随便使用随便更改随便发布只要保留文件头就行。所以呢在我实际开发的项目中我是用的这个threadX RTOS。下面是介绍。https://github.com/eclipse-threadx/rtos-docs/blob/main/rtos-docs/threadx/overview-threadx.md既然我实际是用的threadX RTOS, 那么为了振兴中华我就来写一个threadX RTOS移植到stm32用stm32cubeMX的保姆级教程。2. threadX RTOS移植到stm32的方法2.1用stm32cubeMX来生成项目的框架因为我是用的stm32g474vet6的芯片所以我就用这颗芯片来做例子来配置一个很简单的项目框架。我这项目是这样的。实际上要演示这个threadX的移植配一个IO和一个串口就行了。我这里配置了8个IO口1个串口1个RS485口和4个PWM口。外加系统要用的外部晶振接口和SWD调试接口。一般的配置就不多说了大家都会就来专门演示一下怎么配threadX。2.2 用stm32cubeMX来配threadX本身在cubeMX的中间件和软件包里应该有【X-CUBE-AZRTOS-G4】这个选项如果有的话呢按照这样勾中就行了。那如果没有【X-CUBE-AZRTOS-G4】或者【X-CUBE-AZRTOS-G4】是灰的那么应该怎么办呢这时需要到【Software Packs】里面去下载。在这里选择【x-CUBE-AZRTOS-G4】来install.install完成之后呢点开这个【x-CUBE-AZRTOS-G4】在里面勾选【ThreadX-Core】, 我里面是安装的6.2.0的版本那么就选择这个版本。这里选好之后那么在cubeMX的中间件和软件包里应该有【X-CUBE-AZRTOS-G4】这个选项那么勾选好【RTOS ThreadX】就行。接下来是配ThreadX的选项。一般来说按照我这样来选就OK了。这里配完了之后在SYS里面配【Timebase Source】不能选SysTick, 要用其他的定时器用TIM6的很多但是我这里是选的TIM7.到这里跟threadX相关的配置就完成了其他的组件各自可以自己配一下。在【Project Manager】这里【Linker Settings】可以改一下Size稍微改大一点。好了可以点【GENERATE CODE】生成代码了。2.3 相关任务/线程的编写生成代码之后就导入到VSCode, 导入之后的目录结构是这样的。可以看到一些跟threadX相关的目录和文件。为了方便管理我将自己生成的线程/任务都放到了my_app.h和my_app.c文件里了。my_app.h的内容如下这里只设计了2个线程一个叫thread1一个叫thread_IDLE。堆栈的大小都是1KB, 调度的优先级一个是28一个是31。thread_IDLE是IDLE任务优先级最低所以给的31。my_app.c的内容如下因为是演示用的这2个线程写得很简单thread1就是翻转绿灯打印Thread1 running. 等50ms。 thread_IDLE就是将电机正转20s, 停5s, 反转20s, 停5s, 打印一个软件版本等3s。这2个线程写完了之后呢要将线程登记到RTOS里面去登记线程的动作在文件app_threadx.c里。内容如下这些都写完了之后将相关的文件都加入进CMakeLists.txt就可以进行编译了。我的文件编译的结果如下。反正线程很少并且线程里的任务也很轻所以所以编译出来很小只有50kB。3. 运行结果检验下载到板子里看看运行的结果怎么样。可以看到板子上的绿灯在闪串口也确实在打印。用调试器在IDLE线程的3s等待处打个断点可以看到线程运行的情况和堆栈使用的情况。如下。可以运行成功了。4. 大功告成亲个嘴儿。

更多文章