找回密码
 立即注册
楼主: LA***

C51 和 C251 标准库的区别

[复制链接]

该用户从未签到

63

主题

660

回帖

1万

积分

荣誉版主

积分
10806
发表于 2024-3-20 16:39:57 | 显示全部楼层
LAOXU 发表于 2024-3-20 16:20
就这么一个简单例子, 主程序执行  strncpy函数 在加载参数变量时(相当于 OS系统的临界区), 被中断打断了,
...

(1)不错,终于肯用实际例子来说明问题了,不再是“老师言”了。

(2)请你再证明一下“strcat”和“strcpy”这两个库函数试试?然后把结果告诉我们

点评

“strcpy” 是被 keil 公司优化过的, 通过 R0R4R5 和 R1R2R3 传递指针参数, 属可重入性质. “strcat”不行, 第一指针参数通过 R1R2R3 传递, 第二指针参数通过 DATA 传递, 同样会出现我例子中的问题.  详情 回复 发表于 2024-3-20 18:20
回复 支持 反对 送花

使用道具 举报

该用户从未签到

550

主题

9345

回帖

1万

积分

管理员

积分
13918
发表于 2024-3-20 16:43:05 | 显示全部楼层
RTX251 这个实时性强的 O/S
KEIL C251 上好好的 O/S 被 A 公司偷偷的拿掉了,那是 A公司在黑 x51阵营
还好精神都在下面的本土原创的 O/S 里面了

全局不关总中断的RTOS / CosyOS-II for STC MCU,最新版本2024/3/18更新说明 - FreeRTOS/uCOS,GUI-uGFX/U8g2,文件系统/嵌入式系统/实时操作系统 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

全局不关总中断的 RTOS / CosyOS-II for STC MCU

公告
   最新版本:2024/3/18 发布!
   CosyOS 取得重大技术突破,现已升级至 CosyOS-II,代码风格焕然一新,说明文档持续更新中。。。
   原有 CosyOS-I 停止更新维护,但仍提供技术支持。

简介

CosyOS是一款来自中国的开源实时操作系统,从经典的8051内核,到流行的Arm Cortex-M内核,
均可实现全局不关总中断、零中断延迟适用于对系统实时性及中断响应速度有较高要求的场合
此外,CosyOS的任务切换效率无与伦比,易用性也完全超乎你的想象,更拥有多项安全关键技术,
助你打造更加实时安全的嵌入式产品。

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

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

突破创新
   实现了所有内核全局不关总中断(零中断延迟),保证了中断的实时响应
   独家技术实现系统服务的可重入,使51彻底摆脱可重入栈、全面提速
   针对51做了高度的性能优化,使51迸发出蓬勃生机、熠熠生辉
   251支持MSPPSP两种栈模式,其中PSP模式可使任务的切换效率等同于Cortex-M
   定时服务(软件定时器中断包括定时中断任务/钩子、定时查询任务/钩子,优先级都可由用户灵活配置
   软件RTC,支持设置时间和获取时间,可替代硬件RTC
   独创的飞信,极简类型、极速通信,是线程间通信的利器
   独创的私信,随意定义,灵活多变,便于多条消息的传递
   消息邮箱,每个邮箱在创建时,都可定义自己的数据类型,极大的丰富了邮件的形式,方便了线程间消息的传递
   消息队列,支持静态队列和动态队列,传输模式支持FIFO、LIFO,采用高效的指针引用方式
   事件标志组,声明标志组的同时定义标志位,不同标志组的标志位可以重名,对标志组和标志位的访问通过组名和位名来实现,极大的方便了标志组的应用
   全局变量访问,支持在任意任务和中断中对全局变量的安全访问,而不必担心重入的发生
   安全关键技术,拥有多项安全关键技术,如中断挂起服务空间隔离、安全运行时等,可靠性高
   任务栈监控,拥有多项任务栈监控措施,可提前预判任务栈溢出的风险

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


什么是零中断延迟
零中断延迟并非是中断响应时间为零,而是指当引入了RTOS以后,中断响应时间仍然能够达到MCU内核特性的响应时间,
即只要中断发生,就能按中断优先级立即抢占,不存在指令级延误。也就是说,中断响应时间不受RTOS影响,与裸机编程是一样的。

CosyOS - 实时运行模型

  • 中断层 【用户中断按中断优先级实时抢占(零中断延迟)】
    • 用户中断
      -> 中断本地服务的执行
      -> 中断挂起服务的装载
  • 服务层 【内核服务】
    • SysTick[minpri]
      -> 软件RTC/定时器计数
      -> 恢复定时任务
      -> 调用定时钩子/滴答钩子(滴答服务的执行)
    • PendSV[minpri]
      -> 中断挂起服务的执行
      -> 任务调度/切换
    • 任务临界区[关闭SysTick/PendSV]
      -> 任务服务的执行
  • 任务层 【不同优先级的任务抢占式调度,相同优先级的任务时间片轮转调度】
    • Taskmgr[maxpri]
    • Debugger[maxpri]
    • Starter[maxpri-1]
    • 一般用户任务[maxpri-1 ~ minpri+1:1]
    • 用户空闲任务[minpri:0]
    • 系统空闲任务[minpri:0]

CosyOS - 零中断延迟基本原理

一、服务层中,SysTick、PendSV、任务临界区,三者间是互斥访问的。换言之,整个服务层是一个大临界区(服务层临界区)。
二、所有内核服务(中断本地服务除外),均在“服务层临界区”执行,从而保证服务的“操作流”不会被打断。
三、中断本地服务采用互斥访问机制。

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

CosyOS-II 示例代码
基于 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)

CosyOS-II 专业版测试程序
专门用于测试CosyOS的各项系统服务在极限条件下运行的稳定性、可靠性及性能。
详细说明:

回复 支持 反对 送花

使用道具 举报

该用户从未签到

550

主题

9345

回帖

1万

积分

管理员

积分
13918
发表于 2024-3-20 16:45:06 | 显示全部楼层
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

    积分
    3990
     楼主| 发表于 2024-3-20 16:46:10 | 显示全部楼层
    111.JPG


    捕获2.JPG


    红框中的 RAM地址重叠( strncpy函数 通过 RAM 加载参数变量), 怎么解决?
    那怕优化全部取消(优化级0), 也没法解决, 这就是不可重入函数, 头大之处.
    您老有办法解决吗?
    静等回复.

    点评

    “您老有办法解决吗?静等回复.” 解决方法很简单:我用VB60语言为STC51单片机新写了一个基于8051指令集的C语言编译器-“长缨8 C351编译器”(论坛里有),其中采用了标准C语言规范,每一个函数都是可重入函数!并  详情 回复 发表于 2024-3-20 17:22
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

    积分
    3990
     楼主| 发表于 2024-3-20 16:49:46 | 显示全部楼层
    杨为民 发表于 2024-3-20 15:32
    (1)为什么我的C51的STRING.H库函数是这样的:

    那是我改写的, 把里面的所有函数做了优化, 并且不是可重入的函数, 都改写成可重入的了

    缓冲区操作 和 字符串操作 标淮库程序, 全部改写成 可重入 类型 !
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7083
    (出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)

    点评

    string.h里面的函数,能支持STC8系列的双数据指针就更好了。  详情 回复 发表于 2024-3-20 17:22
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    660

    回帖

    1万

    积分

    荣誉版主

    积分
    10806
    发表于 2024-3-20 17:06:57 | 显示全部楼层
    LAOXU 发表于 2024-3-20 16:34
    你老是教授会说话, 我向你老向 keil 道歉, 总行了吧.

    传统51由于构架原因, 并不适用于跑 OS系统(特别是大 ...

    (1)传统51由于构架原因, 并不适用于跑 OS系统(特别是大容量程序)
    别抽象地就否定,具体说说是什么“构架原因”?本论坛在STC51单片机上有多个RTOS介绍,你说说它们有什么不行或者不适合?你不便说别人,那你说说我移植的和我写的STC51单片机RTOS具体因为什么原因就不适合跑了?

    (2) keil 在 51上推 OS, 问题多多, 后来 251上就直接取消 OS 了.
    这句话属于乱说:谁告诉你的Keil的C51上的RTX51 OS“问题多多”?谁告诉你“251上就直接取消 OS”?
    你不知道安装C251后就包含了RTX251了吗?你是安装了个假的C251吗?
    (3)记得十年前, 网上经常有网友发贴求教 51  OS系统运行不稳定易死机. 后来M3/M0流行了, 我想这帮子人都转 M3/M0 去了.

    51上有很多个OS系统,从C51自带的RTX51,到周立功的Small RTOS,到标准的uC/OS-II,都是很稳定的系统,你觉得哪个OS系统运行不稳定易死机?你看个网友的帖子就下结论,是不是太轻率了?



    点评

    同样使用 os系统, 251, m3/m0等, 对新手来说, 出错的 概率要低很多(因为函数的变量传递可通过 sp堆栈传递), 而 51构架的局限性, 内部库函数都是通过 r0-r7(不够用通过 data)传递, 像我上面举的例子, 你老是老司机,  详情 回复 发表于 2024-3-20 18:05
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9345

    回帖

    1万

    积分

    管理员

    积分
    13918
    发表于 2024-3-20 17:13:32 | 显示全部楼层
    旧版 KEIL C251 有带 RTX251,
    我们买的新版 KEIL C251 没带 RTX251,

    A 公司参与后干的坏事
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    660

    回帖

    1万

    积分

    荣誉版主

    积分
    10806
    发表于 2024-3-20 17:22:17 | 显示全部楼层
    本帖最后由 杨为民 于 2024-3-20 17:29 编辑
    LAOXU 发表于 2024-3-20 16:46
    红框中的 RAM地址重叠( strncpy函数 通过 RAM 加载参数变量), 怎么解决?
    那怕优化全部取消(优化级0), ...

    “您老有办法解决吗?静等回复.”


    解决方法很简单:我用VB60语言为STC51单片机新写了一个基于8051指令集的C语言编译器-“长缨8 C351编译器”(论坛里有),其中采用了标准C语言规范,每一个函数都是可重入函数!并且用A351汇编语言重新编写了全部C51的标准库函数,当然也是函数可重入的。同时为这个C语言编译器配套了我自己写的RTOS(论坛里有)!
    怎么样?满意了吧


    点评

    你老跑题啦~~~ 咱们现在说 keil C51怎么解决.  详情 回复 发表于 2024-3-20 17:34
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    371

    回帖

    1327

    积分

    荣誉版主

    积分
    1327
    发表于 2024-3-20 17:22:43 | 显示全部楼层
    LAOXU 发表于 2024-3-20 16:49
    那是我改写的, 把里面的所有函数做了优化, 并且不是可重入的函数, 都改写成可重入的了

    缓冲区操作 和 字 ...

    string.h里面的函数,能支持STC8系列的双数据指针就更好了。

    点评

    这这个我早就改写了, 但没放出来, 因为, 在所有中断中使用到 dptr的必须手工保存 dptr1和 dps. 如使用 os系统, 也必须加保存 dptr1和 dps 才行. 否则会产生不可预测的后果. 你如想用, 我抽空整理一下传上来吧.  详情 回复 发表于 2024-3-20 17:53
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

    积分
    3990
     楼主| 发表于 2024-3-20 17:34:13 | 显示全部楼层
    杨为民 发表于 2024-3-20 17:22
    “您老有办法解决吗?静等回复.”

    你老跑题啦~~~

    咱们现在说 keil C51怎么解决.

    点评

    看来你问你老师也没有得到解决方法,那就去看看大家给你支的招吧。 《关于临界区保护和函数可重入的测试题,欢迎大家来测试自己学的怎么样》 (https://www.stcaimcu.com/forum.p ... &extra=page%3D1)  详情 回复 发表于 2024-3-22 12:32
    我不愿意在这里跟你说,你问你老师去  详情 回复 发表于 2024-3-20 17:53
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-8 14:44 , Processed in 0.071540 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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