找回密码
 立即注册
查看: 541|回复: 16

分享 FreeRTOS, uC/OS 移植到51, 251 实用移植集锦 2026-10月 优化更新

[复制链接]

19

主题

920

回帖

2765

积分

荣誉版主

积分
2765
发表于 2026-10-23 10:47:38 | 显示全部楼层 |阅读模式
分享 FreeRTOS, uC/OS 移植到51, 251  实用移植集锦.
2026-10月 优化更新.



# FreeRTOS V11.3.1  Keil C251  (2026最新版 FreeRTOS 内核)
基于 FreeRTOS Kernel V11.3.1 的 251核 移植, Keil C251 编译器
例程在 STC 屠龙刀(STC32G12K128)上实现,下载频率 24MHz.
**堆放 XDATA** ——  队列 / 信号量不再吃 EDATA, 可自由选择
**内核全局变量跟随编译模式** —— Large 模式下自动落 XDATA
**ISR 栈共享** —— 所有中断共用一份独立栈,不再为每个任务预留 ISR 嵌套空间.
** OS内存池支持XDATA, 非常省EDATA **    freertos-v11-251.rar (367.82 KB, 下载次数: 80)




# FreeRTOS V10.5.1  Keil C251
基于 FreeRTOS Kernel V10.5.1 的 251核 移植, Keil C251 编译器
例程在 STC 屠龙刀(STC32G12K128)上实现,下载频率 24MHz.
**堆放 XDATA** ——  队列 / 信号量不再吃 EDATA, 可自由选择
**内核全局变量跟随编译模式** —— Large 模式下自动落 XDATA
**ISR 栈共享** —— 所有中断共用一份独立栈,不再为每个任务预留 ISR 嵌套空间.
** OS内存池支持XDATA, 非常省EDATA **    freertos-v10-251.rar (327.16 KB, 下载次数: 70)




# uC/OS-II V2.93.01  Keil C51        (51核)
* 基于 uC/OS-II V2.93.01 的 51核 移植,Keil C51 编译器.
* 项目中例程在 STC开天斧(STC8H8K64U) 上实现,下载频率 24M
* 中断不用汇编封,简单易用    ucosii-keil-c51.rar (310.6 KB, 下载次数: 75)




# uC/OS-II V2.93.01  Keil C251
* 基于 uC/OS-II V2.93.01 的 251核 移植, Keil C251 编译器.
* 项目中例程在 STC屠龙刀(STC32G12K128) 上实现, 下载频率 24M
ucosii-keil-c251.rar (308.3 KB, 下载次数: 67)




# uC/OS-III V3.08.02  Keil C251  (最新版uC/OS内核)
* 基于 uC/OS-III V3.08.02 的 251核 移植, Keil C251 编译器
* 项目中例程在 STC屠龙刀(STC32G12K128) 上实现, 下载频率 35M
ucosiii-keil-c251.rar (334.71 KB, 下载次数: 72)





回复

使用道具 举报 送花

19

主题

920

回帖

2765

积分

荣誉版主

积分
2765
 楼主| 发表于 2026-10-23 20:47:30 | 显示全部楼层
这次更新对所有版本的变幅都比较大,以下简单的说明:

1.  FreeRTOS V11.3.1  移植是新增的, FreeRTOS新版的向下兼容性较好,老项目适移需要的改动比较小,但也有一些API用法稍有变更.

2. uC/OS-III V3.08.02 移植是新增的,这个版本用起来手感还是非常不错的,功能很全,内置文档结构也非常清晰.
    但是它的使用相对uC/OS-II的变化比较大,不熟练的话就有一定的学习成本.
    另外 CPU占用率,ROM占用率都相对有点偏高,临界区长度也比Free稍高一点点.

3.  C251移植都取消了pendSV机制,节省了一个硬件中断源.
    中断的使用方式有些变化,整体采用了注册函数名到OS的方式,不依赖具体型号,对迁移和换型号很友好,使用方法也很简单.

4. 所有版本都添加了临界区测量功能,以便于对实时性能的评估.但需要注意的是临界区测量本身比较消耗效率,不要长期开着.

5. FreeRTOS实用性的提升很大,OS支持 xdata 后对小容量EDATA的型号比如AI8051U, AI32G8K64等2K edata 型号用FreeRTOS起到强劲的支撑作用,
   现在2K edata 做十几个任务轻轻松松.大容量型号更可以灵活配制.

6. 51核的 uC/OS-II 移植本次对任务切换作了较大的优化,切换搬栈仍是开中断进行,不增加中断响应时间,并且进一步的把搬栈置于比最低中断优先级更低一级,
   优化处表现为,前版是在pendSV内搬栈,阻障了同级(最低优先级)中断响应,现在是最低优先级也不受搬栈影响.
   恢复了OSIntNesting运行时保护,消除了假定256字节IDATA的“碰巧正确”问题,这两点之前是受部分网友诟病的.
   切换机制仍沿用pendSV机制,这是因为如果不用pendSV机制,51对中断的处理就很麻烦,需要逐中断汇编引导才安全.
   用pendSV机制非常安全和方便,应用可以和祼机一样自由定义中断函数,用一个pendSV机制换取使用时的方便和安全是非常值的.
   不过现在需要用OSIntNesting++了! 不要忘记了这一茬.

7. 对开源版本合规性进行改进, uC/OS 采用的是 APACHE-2.0许可, 该许可要求对源代码更改时要在相应的文档头部显著位置提交说明.
   FreeRTOS 是 MIT 许可,不需要说明改动,但为了方便查阅和历史改动追塑,也尽量做了详尽的说明.


这次更新对所有版本的变幅都比较大,可能影响使用习惯,老朋友们需要查看一下项目内的自述文件,有些使用方法和注意事项已经变更。

回复

使用道具 举报 送花

已绑定手机

74

主题

1019

回帖

3775

积分

论坛元老

初出茅庐&无甚本事

积分
3775
发表于 2026-10-23 11:53:10 | 显示全部楼层
系统移植需要解决许多问题
改进迭代后逐渐适配(2)51核
用于Ai8051U和STC32G144K效果怎么样
偶尔看看玩玩
回复

使用道具 举报 送花

1

主题

62

回帖

135

积分

注册会员

积分
135
发表于 2026-10-23 18:08:50 | 显示全部楼层
所有中断向量散转程序都列出,有点占用代码空间,能像以前版本一样,只有用到的中断程序才会产生代码

点评

现在新出的 STC32G144K246 有一百多个中断向量入口. 最新的251核OS移植管理了0-127号向量入口, 正好占用1K ROM, 实际ROM占比并不高. 另外,以前那种方式是固定映射,每个中断都有一个宏定义的封皮,现在是大家共用封  详情 回复 发表于 2026-10-23 19:20
回复

使用道具 举报 送花

已绑定手机

32

主题

446

回帖

2867

积分

金牌会员

积分
2867
发表于 2026-10-23 18:31:39 | 显示全部楼层
好样的!
学习MCU
回复

使用道具 举报 送花

19

主题

920

回帖

2765

积分

荣誉版主

积分
2765
 楼主| 发表于 2026-10-23 19:20:16 | 显示全部楼层
eda*** 发表于 2026-10-23 18:08
所有中断向量散转程序都列出,有点占用代码空间,能像以前版本一样,只有用到的中断程序才会产生代码 ...

现在新出的 STC32G144K246 有一百多个中断向量入口.
最新的251核OS移植管理了0-127号向量入口, 正好占用1K ROM, 实际ROM占比并不高.
另外,以前那种方式是固定映射,每个中断都有一个宏定义的封皮,现在是大家共用封皮.
如果应用中用到很多个中断老的方式会比新方式消耗更多的ROM.

统一管理带来的好处很明显:
1. 现在针对的是中断向量号,在多种型号上迁移没有硬件映射依赖,自己写函数名,赋值上去就可以了. 扩展也非常容易.
2. 统一管理可以防忘记回中断计数器.
3. 统一管理对于 ISR 专用栈实现非常有利.

以前的几个版本我都还留着的,有需求的话说一下,可以放出来.
回复

使用道具 举报 送花

1

主题

62

回帖

135

积分

注册会员

积分
135
发表于 2026-10-23 19:55:19 | 显示全部楼层
tzz1*** 发表于 2026-10-23 19:20
现在新出的 STC32G144K246 有一百多个中断向量入口.
最新的251核OS移植管理了0-127号向量入口, 正好占用1K ...

主要是我用的中断一般在3-5个,所以感觉ROM占用有点大,另外把中断函数ISR_HandlerTable放在XDATA中感觉不如放在ROM中可靠,非常感谢您的回复。如果能出一版采用老的中断封皮函数方式就更好了,这样可以按需选择使用

点评

我认为新的版本处理方式更好,没有必要回去或做冗长设计. 你用FREE还是uC,这两个251的老版本并没有BUG,可以继续沿用,需要的话我现在重新挂在回复框里,你自己下载.  详情 回复 发表于 2026-10-23 20:51
回复

使用道具 举报 送花

19

主题

920

回帖

2765

积分

荣誉版主

积分
2765
 楼主| 发表于 2026-10-23 20:51:32 | 显示全部楼层
eda*** 发表于 2026-10-23 19:55
主要是我用的中断一般在3-5个,所以感觉ROM占用有点大,另外把中断函数ISR_HandlerTable放在XDATA中感觉 ...

我认为新的版本处理方式更好,没有必要回去或做冗长设计.
你用FREE还是uC,这两个251的老版本并没有BUG,可以继续沿用,需要的话我现在重新挂在回复框里,你自己下载.
回复

使用道具 举报 送花

19

主题

920

回帖

2765

积分

荣誉版主

积分
2765
 楼主| 发表于 2026-10-23 21:20:31 | 显示全部楼层
在新的移植优化过程中,发现原移植版本 "uCOS-II_STC8H_small+large" 存在 BUG  公示如下:

BUG代码:

void pendSV_ISR_Handler (void)
{
#pragma asm
   
    PUSHALL

    MOV      A,?C_IBP
    CPL      A
    INC      A          //补码
    MOV      R7,A           //IBP数据深度

    CLR      C
    MOV      A,SP
    SUBB     A,#?STACK-1
    MOV      R6,A           //SP深度

    ADD      A,R7
    ADD      A,#02H         //额外两字节
    CPL     A
    INC     A               //补码
    ADD      A,?C_XBP+01H
    MOV     R5,A            //更新后的栈顶低字节
    MOV     A,?C_XBP
    ADDC    A,#0FFH
    MOV     R4,A            //更新后的栈顶高字节

    MOV      DPL,OSTCBCur+01H
    MOV      DPH,OSTCBCur
    MOVX     @DPTR,A
    INC      DPTR
    MOV      A,R5
    MOVX     @DPTR,A        //提前更新OSTCBStkPtr
   
    MOV     DPH,R4          //OSTCBStkPtr写入DPTR
    MOV     DPL,R5
   
    MOV     A,R6
    MOVX    @DPTR,A         //保存SP深度
..........

修复补丁如下:
void pendSV_ISR_Handler (void){
#pragma asm

    PUSHALL

    MOV      A,?C_IBP
    CPL      A
    INC      A          //补码
    MOV      R7,A           //IBP数据深度

    CLR      C
    MOV      A,SP
    SUBB     A,#?STACK-1
    MOV      R6,A           //SP深度

    ADD      A,R7
    ADD      A,#02H         //额外两字节
    CPL     A
    INC     A               //补码
    ADD      A,?C_XBP+01H
    MOV     R5,A            //更新后的栈顶低字节
    MOV     A,?C_XBP
    ADDC    A,#0FFH
    MOV     R4,A            //更新后的栈顶高字节

    MOV      DPL,OSTCBCur+01H
    MOV      DPH,OSTCBCur
    MOVX     @DPTR,A
    INC      DPTR
    MOV      A,R5
    MOVX     @DPTR,A        //提前更新OSTCBStkPtr

    MOV     DPH,R4          //OSTCBStkPtr写入DPTR
    MOV     DPL,R5

    CLR     EA                                   ;需要添加这四行
    MOV     ?C_XBP,DPH
    MOV     ?C_XBP+1,DPL
    SETB    EA

    MOV     A,R6
    MOVX    @DPTR,A         //保存SP深度
..................

以上BUG:为任务结束并准备保存上下文到模拟栈时没有及时向下更新
C_XBP,有较低机率任务上下文被嵌套中断污染。

第二个可能的BUG, 前版选 TIM4中断 作为 pendSV 使用并不合适。(仅限于51, 251不在此限,因为251使用位寻址标志)
原因是 AUXINTIF|=0X04;  属于读修写写类型语句,
AUXINTIF 的其它位也是中断志,随时可能由硬件置位,写操作有较小机率擦除正在置位的其它中断标志.
如果AUXINTIF中的其它中断标志在项目中没有被使用则不会有问题,如果使用了AUXINTIF中的其它中断标志则有丢失概率,虽然机率不高,但理论存在。
这里一并说明。

已经再使用 uCOS-II_STC8H_small+large 的务必自行修复补丁 + pendSV 源的合适性检查,或更换用新版.

另外寻找上次 “红蓝对抗” 测试的朋友,我见你测试的比较认真,有概率会使用 uCOS-II_STC8H_small+large , 请务必添加补丁+检查pendSV中断源合规,
话说回来,你那个“红蓝对抗”检查了那么多项,可这两真BUG是一个也没检出来哈,哈哈










回复

使用道具 举报 送花

1

主题

62

回帖

135

积分

注册会员

积分
135
发表于 2026-10-23 21:25:35 | 显示全部楼层
tzz1*** 发表于 2026-10-23 20:51
我认为新的版本处理方式更好,没有必要回去或做冗长设计.
你用FREE还是uC,这两个251的老版本并没有BUG, ...

我用uc,251的版本老版本在兼容的前提下能提供进一步的优化升级版本吗?

点评

我想想看,其实对 uC/OS-II - C251, 本次的更新点是 取消了pendSV 机制 + 中断使用方式变更。 如果你适应了就接着用吧,前版没有问题,效率也没有折扣,前版只是多用了一个pendSV模拟硬件中断。  详情 回复 发表于 2026-10-23 21:42
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 11:25 , Processed in 0.082246 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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