数码之家

 找回密码
 立即注册
搜索
查看: 2295|回复: 13

[C51] STC 原生RTOS PK 移植RTOS

[复制链接]
头像被屏蔽
发表于 2023-5-18 13:53:48 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、移植RTOS可能涉及到的一些问题

1、任务切换
不同内核的MCU,在任务切换时,出入栈的方法可能有所不同,需做相关调整。

2、临界区保护
不同内核的MCU,开关中断的方法可能有所不同,需做相关调整。

3、系统全局变量访问
8051:只有单字节变量访问不会重入;
80251:data、edata直接寻址(1~4字节)不会重入,间接寻址(1~2字节)不会重入;
Arm32:所有(1~4字节)访问不会重入;

如果一个原生仅支持Arm32或更高端内核的RTOS,移植到51或251,所有系统全局变量都要
考虑是否有重入的可能(因为RTOS的作者从来不会考虑这个问题,因为根本不需要)。

4、系统服务函数可重入
很多RTOS中的系统服务函数,是需要可重入的,典型的示例如下(以任务中调用服务为例):
RET_t Function(p1, p2, ..., pn)
{
   lv1; lv2; ... lvn;   // 定义局部变量
   ... ...;
   进入任务临界区;
   临界区保护代码;
   退出任务临界区;
   ... ...;
}

如果这样的RTOS移植到251,还非常好处理,只需要一定大小的edata,并生成全局可重入函数即可解决。



可如果移植到51,将变得非常艰难。
1、仔细检查每个服务函数是否已经是可重入函数(形参和局部变量都是寄存器变量),然而这又取决于多方面因素,还与编译器优化等级有关(keil c51 4级优化以上才支持寄存器变量),是无常的,所以根本无法采用。
2、每个服务函数的声明和定义都加上“reentrant”属性,再增加XBP入出任务栈,虽然可以实现,但性能将会大打折扣,使本来就弱的51更加雪上加霜。


二、CosyOS对相关问题的处理

由于CosyOS是原生支持STC 8051和32位8051的,在设计之初就考虑到了上述问题,并采取了一系列行之有效的措施,不但解决了问题,还可实现高性能。
下面主要介绍一下CosyOS对系统服务可重入的处理(以任务中调用服务为例)

1、本地代码
do{   \
   进入任务临界区;   \
   本地执行服务;   \
   退出任务临界区;   \
}while(false)
由于是本地独立的代码,并非调用函数,所以不存在重入的问题。


2、调用服务函数(无返回值)
do{   \
   进入任务临界区;   \
   调用服务函数();   \
}while(false)
由于是在进入任务临界区之后才调用的服务函数,所以服务函数是不会重入的,也不需要可重入。
服务函数在返回时会自动退出任务临界区。


3、调用服务函数(有返回值)
(   \
   __enter_critical() ? 调用服务函数() : 返回一个其它值   \
)
采用了三目运算,巧妙的实现了在进入任务临界区之后再调用服务函数并返回值。
__enter_critical()的返回值为真,必然会调用服务函数并返回值;为假时返回一个其它值是在欺骗编译器,这种情况永远不会发生。

这一类服务又可细分为三类:
1、服务函数在退出任务临界区后返回常量寄存器变量当前任务节点中的变量这一类服务函数,在退出任务临界区之前是不会重入的,在退出之后是可重入的。
2、服务函数会中途退出任务临界区并触发任务调度,当再次回到当前位置时,会直接返回任务节点中的变量,这一类服务函数,与上一类相同。
3、服务函数会中途退出任务临界区并触发任务调度,当再次回到当前位置时,会再次访问形参或局部变量,而后返回,这一类服务函数需额外定义为可重入函数。


CosyOS需额外定义为可重入函数的系统服务(已加入了reentrant属性):
1、任务中接收私信,uRecvDM(tc);
2、任务中接收邮件,uRecvMail(mail, mbox, tc);
3、中断中接收邮件,iRecvMail(mail, mbox);
4、中断中接收消息,iRecvMsg(que);



对于用户来说:
1、如果是8051内核、80251内核(keil C251 Version 1.x),如果用户调用了上述的四个服务,需要用户自行在启动文件中配置可重入栈[XBP]。
2、Arm内核、80251内核(keil C251 Version 2或更高版本),用户无需理会。
但有一点需要注意:
对于80251内核(keil C251 Version 2或更高版本),您的自定义函数如需可重入,可使用reentrant属性声明,
但不要勾选编译器的 Generate reentrant functions 选项,原因是CosyOS内核为实现高效大量声明或定义了局部的bit型变量,将与此选项冲突。


可见,CosyOS所用的方法可以说是各种内核通吃,尽可能的拜托了系统服务对可重入栈的依赖,即使是8051也可轻松实现高性能。

计划在下一版本中把任务中接收私信任务中接收邮件调整为不使用可重入栈;
针对51,中断中接收邮件中断中接收消息调整为限制调用(只允许在相同优先级的各个中断中调用),用户的自定义函数也不允许使用可重入栈,使51彻底摆脱可重入栈,全面提速。
发表于 2023-5-22 10:06:09 | 显示全部楼层
看着很好,不过挺深奥的
~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2023-5-31 08:55:40 | 显示全部楼层
哪里可以下载模板    新版网站里的是吗
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-5-31 09:28:56 | 显示全部楼层
hewayking 发表于 2023-5-31 08:55
哪里可以下载模板    新版网站里的是吗

对的,可以到STCAIMCU.COM,跟我们STC研发人员交流探讨,一起提高!
回复 支持 反对

使用道具 举报

发表于 2023-5-31 09:33:57 | 显示全部楼层
疯狂的兔子来了 发表于 2023-5-31 09:28
对的,可以到STCAIMCU.COM,跟我们STC研发人员交流探讨,一起提高!

哪个是 CosyOS   我看只有FreeRTOS
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-5-31 09:50:13 | 显示全部楼层
本帖最后由 疯狂的兔子来了 于 2023-5-31 09:52 编辑

全局不关总中断的RTOS / CosyOS for STC MCU
简介
CosyOS是一款来自中国的开源实时操作系统,所有内核全局不关总中断(零中断延迟)是其最大亮点
此外,CosyOS的任务切换效率无与伦比,易用性也完全超乎你的想象,更拥有多项安全关键技术,
助你打造更加实时安全的嵌入式产品,适用于对系统实时性及中断响应速度有较高要求的场合。

支持内核
CosyOS现支持8051、STC32位8051/STC32G12K128、Cortex-M等内核,未来会陆续添加对其它内核的支持。
实际用STC8H、STC32进行了开发测试,可以说是为STC8051世界量身定做。

编译环境
CosyOS是在Keil C51、Keil C251、Arm编译器下开发的,对其支持最好。未来,将会陆续优化调整对其它编译器的支持。

突破创新
  ● 开创性的实现了所有内核全局不关总中断(零中断延迟),保证了中断中用户代码的实时性
  ● 独创的私信(任务形参),参数可随意定义,使用极为灵活,是任务间通讯的利器
  ● 独创的软件RTC,支持设置时间和获取时间,可替代硬件RTC
  ● 80251内核支持独创的虚拟双栈指针技术,使任务的切换效率等同于Cortex-M
  ● 定时中断任务/钩子、定时查询任务/钩子,针对于嵌入式开发中最典型的应用
  ● 消息邮箱,每个邮箱在创建时,都可定义属于自己的数据类型,极大的丰富了邮件的形式,方便了任务间消息的传递
  ● 消息队列,同时支持静态创建和动态创建,传输模式支持FIFO、LIFO,采用高效的指针引用方式
  ● 事件标志组,声明标志组的同时定义标志位,不同标志组的标志位可以重名,对标志组和标志位的访问通过组名和位名来实现,极大的方便了标志组的应用
  ● 全局变量访问,通过调用API可实现在任意任务和中断中对全局变量的安全访问,而不必担心重入的发生
  ● 安全关键技术,拥有多项安全关键技术,如中断异步服务空间隔离、安全运行时等,可靠性高
  ● 任务栈监控,拥有多项任务栈监控措施,如每调度监控、线程入口监控等,可提前预判任务栈溢出的风险

因循守旧
  ● 完全开源的免版税、确定性的RTOS
  ● 任务调度支持抢占式调度、时间片轮转调度
  ● 用户任务数量不限,且每个任务都可以有255级优先级(0~254)
  ● 简洁高效的代码,极低的硬件资源占用,使CosyOS可轻松应用于各种小型MCU
  ● 任务管理器,可实时监控各任务的运行,便于开发者急时发现设计中存在的潜在问题

关于STC32G
兼容80251指令集的内核,CosyOS是使用STC16F/兼容80251指令集 进行开发的,针对STC32G直接使用。未来,作者将针对STC32G进行测试并做出优化调整。

相信,CosyOS将会成为 www.STCAIMCU.com 的加速器,助力STC32位8051腾飞!


DemoCode

基于 FreeRTOS-STC32G-CORE-V1.0.2-Library-DemoCode-20220817 修改的,将FreeRTOS替换为CosyOS的示例代码,
目的是能让用户快速掌握CosyOS的基本应用,降低使用门槛。
作者仅做了必要的调整,调整的地方多是先注释掉原来的代码,再在下方重写,以便用户比较CosyOS与FreeRTOS的异同。
示例代码简要说明:
配置情况:
    系统时钟24MHz,任务管理器使用UART1(切换至P1.6/P1.7,波特率460800),PendSV_Handler使用外部中断0。
    任务管理器已配置为开机自动启动,USB-TTL接入P1.6/P1.7,打开串口助手设置正确的波特率即可输出。
配置文件:
    syscfg.h            (系统配置文件,.\Sources\Config\syscfg.h)
    mcucfg_80251.h(MCU配置文件,.\Sources\Config\mcucfg_80251.h)
    CosyOS.h          (用户配置文件,.\Sources\User\include\CosyOS.h)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-5-31 09:51:24 | 显示全部楼层
hewayking 发表于 2023-5-31 09:33
哪个是 CosyOS   我看只有FreeRTOS

我去官网下载并发布在此处,您可以下载参考参考。
回复 支持 反对

使用道具 举报

发表于 2023-5-31 10:49:43 | 显示全部楼层
疯狂的兔子来了 发表于 2023-5-31 09:51
我去官网下载并发布在此处,您可以下载参考参考。

直接上链接   官网没找到
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-5-31 11:02:05 | 显示全部楼层
hewayking 发表于 2023-5-31 10:49
直接上链接   官网没找到

已经单独给您发了链接,数码这边估计发链接应该过不了的,您也可以加我  QQ: 3323874452,感谢支持!
回复 支持 反对

使用道具 举报

发表于 2023-6-1 08:56:17 | 显示全部楼层
中文注释用了   汉字编码格式不统一    总有一种乱码Insight4.0影响阅读理解   咱们统一一下啊
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-6-1 09:08:20 | 显示全部楼层
hewayking 发表于 2023-6-1 08:56
中文注释用了   汉字编码格式不统一    总有一种乱码Insight4.0影响阅读理解   咱们统一一下啊 ...

这个也是热心网友分享的技术贴,高手们也可以帮修改格式,后期帮您全网发布分享!
回复 支持 反对

使用道具 举报

发表于 2023-6-1 09:16:26 | 显示全部楼层
疯狂的兔子来了 发表于 2023-6-1 09:08
这个也是热心网友分享的技术贴,高手们也可以帮修改格式,后期帮您全网发布分享! ...

这个cosyos不是咱们官方维护的系统啊  我还以为跟freertos一样官方维护难怪在论坛而不是官网
回复 支持 反对

使用道具 举报

发表于 昨天 18:51 | 显示全部楼层
STC32位8051 发表于 2023-5-31 09:50
**** 作者被禁止或删除 内容自动屏蔽 ****

很好,多了解下
回复 支持 反对

使用道具 举报

发表于 昨天 20:47 来自手机浏览器 | 显示全部楼层
这个太有难度了
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-2 01:00 , Processed in 0.327600 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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