硬汉嵌入式论坛

 找回密码
 立即注册
查看: 617|回复: 5
收起左侧

[ThreadX全家桶] ThreadX的CMSIS-RTOS V2封装层升级至V1.4.0(2026-01-14)

[复制链接]

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121282
QQ
发表于 2026-1-14 11:07:08 | 显示全部楼层 |阅读模式

https://github.com/STMicroelectronics/stm32-mw-cmsis-rtos-tx

CMSIS-RTOS v2(简称 CMSIS-RTOS2)为基于 Arm Cortex 处理器的设备提供了通用的实时操作系统接口。它为需要实时操作系统功能的软件组件提供了标准化 API,从而为用户和软件行业带来显著优势:

CMSIS-RTOS2 提供了许多应用所需的基础功能。
1、统一的 CMSIS-RTOS2 功能集降低了学习成本,简化了软件组件的共享流程。
2、基于 CMSIS-RTOS2 的中间件组件可兼容不同实时操作系统,适配更便捷。
3、标准化的 CMSIS-RTOS2 项目模板可随开源可用的 CMSIS-RTOS2 实现一同分发。

本 CMSIS-RTOS v2 封装层基于 ThreadX 实时操作系统的 API,对 CMSIS-RTOS v2 接口进行了实现。当前版本支持的功能如下:

1234.png

CMSIS-RTOS v2 设计
内核初始化与启动
在 ThreadX RTOS 中,仅通过一个接口(tx_kernel_enter)启动内核。该函数将执行以下步骤:

_tx_initialize_low_level:调用底层初始化函数,处理所有处理器相关的初始化事务。
_tx_initialize_high_level:调用高层初始化函数,初始化所有 ThreadX 组件及应用程序的初始化函数。
tx_application_define:调用应用程序提供的初始化函数,并将首个可用内存地址传递给它。
_tx_thread_schedule:进入调度循环,开始执行线程。

对于 ARM CMSIS 方案,必须将内核初始化与内核启动分离,以便用户在此期间创建线程、定时器、信号量等。为此,我们将 CMSIS-RTOS2 封装层设计如下:

osKernelInitialize:通过调用 _tx_initialize_kernel_setup 函数,完成底层和高层的初始化。
osKernelGetState:将调用应用程序提供的初始化函数来启动内核。

动态内存管理
CMSIS-RTOS v2 的 API(如 osThreadNew)使用户在实现应用程序时可以选择:
传递已声明或在应用层分配的块内存及栈地址;
由底层(封装层或 RTOS)分配内存。

动态内存分配方案的总体思路是使用两个 ThreadX BytePool:
HeapBytePool:用于线程、定时器、互斥锁、信号量、事件标志和消息队列对象的块内存分配。
StackBytePool:用于线程和消息队列的栈内存分配。

为此,我们添加了以下三个内部函数:
MemInit        创建 HeapBytePool 和 StackBytePool
MemAlloc        为对象块或栈分配所需内存
MemFree        释放对象块或栈的内存

注意事项:
HeapBytePool 和 StackBytePool 的大小由用户通过宏定义 RTOS2_BYTE_POOL_HEAP_SIZE 和 RTOS2_BYTE_POOL_STACK_SIZE 分别指定。
HeapBytePool 和 StackBytePool 的最小大小由 ThreadX 宏定义 TX_BYTE_POOL_MIN 决定。
HeapBytePool 和 StackBytePool 从 ThreadX 变量 _tx_initialize_unused_memory 定义的第一个空闲内存区域中分配。

静态内存管理
CMSIS-RTOS v2 使用户在实现应用程序时能够静态分配内存。实际上,静态缓冲区将基于用户定义的 RTOS2_BYTE_POOL_HEAP_SIZE 和 RTOS2_BYTE_POOL_STACK_SIZE 进行创建和分配。HeapBytePool 和 StackBytePool 的最小大小由 ThreadX 宏定义 TX_BYTE_POOL_MIN 决定。

部分截图
1234.png
回复

使用道具 举报

1

主题

19

回帖

22

积分

新手上路

积分
22
发表于 2026-1-18 15:05:40 | 显示全部楼层
硬汉哥,这个没有其他组件的封装,感觉比较鸡肋,其实RTOS还好,关键是其他组件,要是能一起封装起来就好了
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121282
QQ
 楼主| 发表于 2026-1-19 09:02:53 | 显示全部楼层
Bruce 发表于 2026-1-18 15:05
硬汉哥,这个没有其他组件的封装,感觉比较鸡肋,其实RTOS还好,关键是其他组件,要是能一起封装起来就好了 ...

你的意思是其它组件的底层驱动接口实现也用CMSIS-RTOS V2实现吧
回复

使用道具 举报

31

主题

101

回帖

194

积分

初级会员

积分
194
发表于 2026-1-19 09:06:24 | 显示全部楼层
这个线程接口不对,线程接口中使用了TX_THREAD中的tx_thread_detached_joinable,但是TX_THREAD中并没有tx_thread_detached_joinable,这个是需要自己手动添加么?还是需要特殊版本么
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121282
QQ
 楼主| 发表于 2026-1-19 09:20:55 | 显示全部楼层
zbq 发表于 2026-1-19 09:06
这个线程接口不对,线程接口中使用了TX_THREAD中的tx_thread_detached_joinable,但是TX_THREAD中并没有tx_t ...

ST有带封装层的例子,检索下这个对应的定义。看看它是什么实现的,或者完全没有实现。
回复

使用道具 举报

1

主题

19

回帖

22

积分

新手上路

积分
22
发表于 2026-1-19 10:10:40 | 显示全部楼层
eric2013 发表于 2026-1-19 09:02
你的意思是其它组件的底层驱动接口实现也用CMSIS-RTOS V2实现吧

是这个意思,大佬,这样用起来就和RL-TCP一样了,方便易用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-3-4 20:30 , Processed in 0.297744 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表