ThreadX 介绍
ThreadX 是专为嵌入式应用而设计的高性能实时内核。同其它实时内核不同, ThreadX具有通用性,使基于RISC(reduced instruction set computer 简化指令集计算机)和 DSP(Digital Signal Processing 数字信号处理)的小型微控制器的应用程序易于升级。ThreadX 易于升级的原因基于其隐藏式结构。因为 ThreadX 的服务以 C 库来执行,只有在应用程序中用到的服务才被纳入运行映像。因此,实际的 ThreadX 的大小完全取决于应用程序。对大多数的应用程序而言, ThreadX 的指令映像从 2Kbyte 到 15Kbyte。
ThreadX的产品已涵盖了各种领域,包括NASA的多个太空探测项目,飞机自动驾驶仪系统,火星侦察轨道器等。且安全认证等级基本达到最高,达到项目安全认证等级要求。threadx具有丰富的组件,ThreadX中间件如下:
Azure RTOS NetX
TCP/IP协议标准的高性能实现,与Azure RTOS ThreadX完全集成,可用于所有支持的处理器。
Azure RTOS NetX Duo
先进的、工业级的TCP/IP网络栈是专门为深嵌入式实时和loT应用程序设计的。Azure RTOS NetX Duo是一个IPv4和IPv6双网络堆栈,而Azure RTOS NetX是最初的IPv4网络堆栈,本质上是Azure RTOS NetX Duo的一个子集
Azure RTOS FileX
一个高性能、兼容文件分配表(FAT)的文件系统,完全集成了Azure RTOS ThreadX ano,可用于所有支持的处理器。
Azure RTOS GUIX
小巧、快速,并且可以轻松地移植到任何能够支持图形输出的硬件配置上。
Azure RTOS GUIX Studio
提供了一个完整的嵌入式图形用户界面(GUl)应用程序设计环境,便于在应用程序的GUI中创建和维护所有图形元素。
Azure RTOS USBX
高性能的USB主机、设备和运行中(OTG)嵌入式栈,它与Azure RTOS ThreadX完全集成,可用于所有Azure RTOS线程支持的处理器
Azure RTOS TraceX
基于 Windows 的分析工具。它为嵌入式开发者提供了实时系统事件的图形视图,使其能够了解和更好地理解其实时系统的行为。
ThreadX 移植
一、移植环境介绍
芯片:stm32F103ZET6
工具:stm32CubeMx5.6.0
MDK编译环境:MDK5.30
gcc编译环境:ubuntu16.04
arm-none-eabi-gcc version 4.9.3
参考资料:
①.安富莱嵌入式论坛
http://www.armbbs.cn/forum.php?gid=1
②Mculover666 大神博客
https://blog.csdn.net/Mculover666/article/details/106388532
③ThreadX官方指导手册
二、生成裸机工程
1. 建立裸机工程 ,支持MDK、GCC串口输出
裸机工程参考以下链接:
http://www.mculover666.cn/posts/578764034/, 创建工程时需要开启某个串口,例如可使用usart1作为调试口。
生成MDK工程后可在usart.c文件中添加以下函数:
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
return ch;
}
生成GCC工程后可在usart.c文件中添加以下函数:
int _write(int fd, char *ptr, int len)
{
HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, 0xFFFF);
return len;
}
若两个工程做兼容,我的做法是:
2. 生成MDK及Makefile工程
3. 编译、验证MDK工程
MDK工程可直接在keil中编译生成,若无错误,可直接下载验证,查看串口是否有输出。
4. 编译、验证gcc工程
gcc工程没有IDE搭建的编译环境,需要自行搭建。gcc使用windows或linux搭建均可,本文采用linux桌面版ubuntu搭建gcc编译环境,并使用交叉编译工具链arm-none-eabi-gcc进行编译。安装交叉编译工具链参考如下:
https://blog.csdn.net/zhengyangliu123/article/details/54783443
安装后使用进入文件夹即可使用Makefile工具进行编译。(本文直接将MDK及gcc生成一个工程并放置在虚拟机共享文件夹中)。编译成功后将生成的hex或bin文件使用stm32 st-link
Utility工具烧录至开发板进行验证。
三、ThreadX MDK裸机移植
1. 下载ThreadX源码
首先需要下载ThreadX源码,地址:https://github.com/azure-rtos/threadx,如果下载速度很慢,可以自己在gitee上拉去github的代码,之后在自己的gitee仓库pull即可。方法参考:https://blog.gitee.com/2018/06/05/github_to_gitee/。
2. 移植源码到MDK裸机工程
第一步:新建ThreadX文件夹,可以使用ThreadX文件,(我的命名THREADX看着怪怪的哈哈,不过建立的gcc工程需要改东西就没动它了,这是后话)第二步:将源码中的common和ports文件夹放入刚建立的ThreadX文件夹内。
第三步:添加工程中.c .S(注意Threadx的汇编为.S) .h文件
第四步:编译及解决错误
1.两个函数多重定义,原因是ThreadX在内核中已经定义,去掉stm32f1xx_it.c自带的函数
2.未定义函数,tx_application_define 、__RAM_segment_used_end__,
解决:tx_application_define 为内核初始化时指定线程调度前需要进行操作的函数,我们可以在main.c文件中进行定义该函数,并在该函数中创建线程。
__RAM_segment_used_end设置为__initial_sp的值
3. 未定义__vectors
解决:这是因为stm32启动文件的__vectors为大写__Vectors,修改ThreadX内核的所有__vectors 改为大写。
编译成功了,终于可以进行烧录测试,测试运行结果是否与自己的编码一致,可以在线程中进行打印,具体可获取工程源码。
四、ThreadX GCC裸机移植
1. 下载ThreadX源码 同MDK裸机移植
2. 移植源码到MDK裸机工程 同MDK裸机移植
3. 修改Makefile文件
添加ThreadX源码中.c\.S\.h文件
4、编译测试及解决
错误1:
Makefile:248: *** missing separator. Stop.解决:
![901c5851cf91f0bc52374b845d210a01.png](https://i-blog.csdnimg.cn/blog_migrate/16d2656b70665f65223b2e047aaec50b.png)
![89ad52de5c44301820c393b54ddbb717.png](https://i-blog.csdnimg.cn/blog_migrate/1271900c93b3be2fe852e83749d31ec5.png)
![901c5851cf91f0bc52374b845d210a01.png](https://i-blog.csdnimg.cn/blog_migrate/16d2656b70665f65223b2e047aaec50b.png)
https://blog.csdn.net/vblittleboy/article/details/21012991
错误3:![901c5851cf91f0bc52374b845d210a01.png](https://i-blog.csdnimg.cn/blog_migrate/16d2656b70665f65223b2e047aaec50b.png)
![7890280d84428ada086896950e458a6b.png](https://i-blog.csdnimg.cn/blog_migrate/b9bca0bf979058e84da1c11f388d744e.png)
解决:修改STM32F103ZETx_FLASH.ld 链接脚本:
修改启动文件,作全局声明,详细见工程源码:
编译成功:
5. 烧录验证