前言
一、前言
1.1.ThreadX操作系统简介
去年微软宣布收购ThreadX,但是没有公布后续策略,uCOS全家桶进入开源免费后,ThreadX也宣布正式加入。微软未来四年将投资50亿美元到物联网上,收购Express Logic是该战略的一部分。ThreadX的产品涵盖了各种领域,包括NASA的多个太空探测项目,飞机自动驾驶仪系统,火星侦察轨道器等。ThreadX及其所有中间件的安全认证等级,至今没有一款小型RTOS可以与其匹敌。
(1)医疗——FDA510(k),IEC-62304 Class C,IEC-60601,ISO-14971
(2)工业——UL-1998,IEC-61508 SIL 4
(3)运输/铁路——EN50128 SIL 4,BS50128, 49CFR236,IEC-61508
(4)航空航天设备——DO-178B,ED-12B,DO-278
(5)汽车——IEC-61508 ASIL D
(6)核应用——IEC-61508
(7)家电——UL/IEC 60730/60335
可见各种安全等级基本都达到了最高。像工业级安全认证IEC61508,ThreadX满足最高等级SIL4,而SafeRTOS,embOS,uCOS-II都只是SIL3。 随着uCOS和ThreadX全家桶都开源,其它RTOS影响是巨大的,还没有开源的,可能也要加入开源大浪了。那这是为什么呢?1、全球使用Express Logic的ThreadX操作系统的电子设备已经有62亿,这个震撼的数值在持续增长中。
2、因为ThreadX和它功能极为全面各种中间件:
Azure RTOS ThreadX
Azure RTOS NetX
Azure RTOS NetX Duo
Azure RTOS FileX
Azure RTOS GUIX
Azure RTOS GUIX Studio
Azure RTOS USBX
Azure RTOS TraceX
本文中使用的开发板为小熊派IoT开发板,主控为STM32L431RCT6。
由于 ThreadX 仅提供了 Cortex-M0 到 Cortex-M7 的 GCC版本的移植文件,所以本文中我们使用的工具链为:- 操作系统:Window10
- 生成初始化工程:STM32CubeMX
- 阅读代码:VSCode
- 编译器:arm-none-eabi-gcc工具链
- 构建工具:make
- 下载工具:OpenOCD
- 串口工具:QCOM_V1.6
二、环境搭建
2.1. 安装VScode扩展
这个扩展是华为LiteOS提供的,此处不需要了解过多,我们仅仅是使用此扩展完成以下事情:自动安装arm-none-eabi-gccG工具链
自动安装make构建工具
自动安装openocd下载工具
可以在VScode中一键编译、下载、调试
可以在VScode中查看串口输出
2.2. 创建STM32CubeMX工程
使用STM32CubeMX创建一个基于小熊派开发板的裸机工程,只需要配置一个打印串口和正确的时钟频率(图省略)即可:工程设置中选择Makefile,这样cubemx可以自动生成makefile: 生成工程即可:
2.3. 导入工程到VScode
打开VScode,点击下方的Home(第2节扩展安装成功才会有),选择导入GCC工程: 工程目录选择刚刚生成的目录,Makefile默认是此工程中的makefile,芯片选择STM32L431RCT6: 导入成功之后可以看到下方的操作按钮:
2.4. 测试裸机工程是否正常
打开usart.c
,添加将printf重定向到串口1的代码:
/* USER CODE BEGIN 1 */#if 1#include int _write(int fd, char *ptr, int len) { HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, 0xFFFF);return len;}#endif/* USER CODE END 1 */
接着在
main.c
中添加头文件
,然后在main函数中加入打印代码进行测试:
/* USER CODE BEGIN 2 */printf("ThreadX RTOS Port by Mculover666\r\n")/* USER CODE END 2 */
点击下方的Build按钮开始编译,编译成功之后如图所示: 如果编译失败,请重复之前的导入工程步骤。
接下来连接小熊派开发板到电脑,点击下载按钮: 下载成功之后,点击下方的Serial按钮,选择小熊派开发板的串口,在VSCode中打开串口终端: 按下小熊派复位按钮,即可看到正常打印的数据: printf测试可以正常使用之后,接下来开始移植今天的主角——threadX操作系统。
三、移植threadX操作系统
3. 移植threadX操作系统
3.1. 下载内核源码
内核源码可以在官方的GIthub下载: https://github.com/azure-rtos/threadx 将源码中的common和ports文件夹复制到工程中:3.2. 修改makefile
makefile文件是make工具使用的文件,描述了整个工程的编译构建关系。 修改makefile,将threadX的相关文件加入到makefile里。① 添加common/src
下的所有C文件到C_SOURCES
变量中: ② 小熊派的内核是Cortex-M4,所以添加ports/cortex_m4/gnu/src
下的所有.S文件 因为.s
文件是直接汇编文件,.S
文件需要进行预处理之后才能汇编,两者编译时有区别,所以使用两个变量进行区分。
common/inc
和
ports/cortex_m4/gnu/inc
两个头文件路径添加:
④ 编写
.S
文件的编译规则:
至此,makefile修改完成,但是还不能编译。
3.3. 适配小熊派开发板
在threadX底层初始化汇编文件中有两个全局变量: 这两个值需要我们根据不同的平台来自己定义。
① 修改stm32启动文件startup_stm32l431xx.s
,声明中断向量表_vectors标号是全局的:
将此标号位置添加到中断向量表处:
② 修改stm32链接文件
STM32L431RCTx_FLASH.ld
,添加此标号所表示的位置:
3.4. 修改时钟频率
找到threadX的底层初始化汇编文件tx_initialize_low_level_sample.S
,修改系统主频为80Mhz,修改系统tick为1000个tick: 此时点击下方Build按钮开始编译: 编译成功,证明移植没有问题。
四、环境搭建
4. 编写threadX应用代码
在main.c
中编写创建两个不同优先级任务运行的应用代码,观察是否可以正常切换任务、演示。
① 引入头文件:
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include
#include "tx_api.h"
/* USER CODE END Includes */
② 创建两个任务控制块,两个任务入口函数,并创建两个任务:
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
TX_THREAD my_thread1;
TX_THREAD my_thread2;
void my_thread1_entry(ULONG thread_input)
{
/* Enter into a forever loop. */
while(1)
{
printf("threadx 1 application running...\r\n");
/* Sleep for 1 tick. */
tx_thread_sleep(1000);
}
}
void my_thread2_entry(ULONG thread_input)
{
/* Enter into a forever loop. */
while(1)
{
printf("threadx 2 application running...\r\n");
/* Sleep for 1 tick. */
tx_thread_sleep(1000);
}
}
void tx_application_define(void *first_unused_memory)
{
/* Create my_thread! */
tx_thread_create(&my_thread1, "My Thread 1",
my_thread1_entry, 0x1234, first_unused_memory, 1024, 3, 3, TX_NO_TIME_SLICE, TX_AUTO_START);
tx_thread_create(&my_thread2, "My Thread 2",
my_thread2_entry, 0x1234, first_unused_memory+1024, 1024, 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
}
③ 在main函数初始化完毕之后启动内核:
/* USER CODE BEGIN 2 */
printf("ThreadX RTOS Port By Mculover666\r\n");
/* Enter the ThreadX kernel. */
tx_kernel_enter( );
/* USER CODE END 2 */
再次点击Build按钮编译,编译成功: 接上小熊派开发板,点击下方的Download按钮,烧录成功: 点击下方Serial,在VScode打开串口终端,查看串口输出: 1s打印一次,并且两个任务切换运行,任务2的优先级高于任务1,实现现象和预期一样,至此,threadX移植成功,赶快上手试试吧~
本工程源码在公众号后台回复关键词 threadX 获取,下载之后使用iotlink导入到VScode即可编译,下载。