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

STC单片机 uC/OS-II核心技术(12):关于临界区保护和函数可重入的测试题

[复制链接]

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10922
 楼主| 发表于 2024-3-23 14:02:48 | 显示全部楼层
tzz1983 发表于 2024-3-23 13:16
Keil C51自然是优秀的,好用的,采用固定地址传递参数,调用树,覆盖。对于C51来说,这些都是闪闪发光的优 ...


我对LAOXU言词激烈,我不否认,可是我实在想不出怎么来形容他行为,愿你教我。
比如你说的“至于 装逼作秀撒谎狡辩”,此话太过了, 杨老师你这是要折煞热血小青年吗?”。
(1)请问我在这个帖子了说过“装逼作秀”这四个字了吗?如果说过,请指出来,我道歉。
(2)请问如果我在这个帖子没有说过“装逼作秀”这四个字,那么对于你这种行为,我向你请教,我应该怎么评价你才不“折煞你”?



点评

言词激烈已经见怪不怪了,,只要能有知识输出就得了  发表于 2024-3-23 14:45
我错了,是 “装神弄鬼+炫耀”  发表于 2024-3-23 14:22
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 177 天

    [LV.7]常住居民III

    5

    主题

    581

    回帖

    2385

    积分

    荣誉版主

    积分
    2385
    发表于 2024-3-23 14:10:31 | 显示全部楼层
    函数是否可重入的问题确实是嵌入式开发中的重点问题,应给与足够的重视。
    C51的标准库函数中,的确有不少都是不可重入的,对于新手小白来说容易犯错。
    C251标准库、Arm C/C++库中也同样存在不可重入函数,只是相对来说数量会少一些。
    重写函数有时也的确是一个好方法。
    LAOXU的精神是值得称赞的,为LAOXU点赞

    点评

    “Arm C/C++库中也同样存在不可重入函数”这个问题我要向你请教,因为我正在用Keil MDK玩RTOS,STC也将推出STC33系列单片机。 你的CosyOS已经有运行在ARM上的版本了,请问Keil的MDK的库函数有哪些是不可重入的?这些  详情 回复 发表于 2024-3-23 15:55
    (1)随着STC8051H和全新架构的 32位 8051@STC32G96K256这两种新STC单片机的推出,改写相当部分的C51和C251编译器的库函数是肯定的了,而且已经在进行中了。 (2)C51和C251当初在框架设计时就已经考虑对芯片厂商增  详情 回复 发表于 2024-3-23 15:35
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10922
     楼主| 发表于 2024-3-23 14:28:32 | 显示全部楼层
    tzz1983 发表于 2024-3-23 13:16
    Keil C51自然是优秀的,好用的,采用固定地址传递参数,调用树,覆盖。对于C51来说,这些都是闪闪发光的优 ...

    等着你2楼的答案呢,这才是正题吧。味口吊得差不多啦!心里怪痒痒的,急不可耐呀。

    (1)这个问题属于OS理论中的临界区保护,这个问题我们在这个板块已经讨论了很多了。但是LAOXU发的那个帖子有一句话是对的,就是对于新手入门或者不使用RTOS时怎么办?是不是非要改写C51库函数?这是个学术问题,故发此贴,以课堂提问教学形式来进行讨论。
    (2)对于这个问题,包括后面的高难度题目,不只一种解决方法,我当然都知道。不过我准备用通俗的新手入门的解决方法、你移植的uC/OS中的可嵌套关总中断的解决方法和CosyOS的全局不关总中断解决方法三个例子来写。要写得通俗易懂不容易,写好会放在2楼的。
    (3)我也感到大家着急,对于高难度题目LAOXU也说了除了重新写库函数,他没有解决方案。那么我先把最简单方案公布一下。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 177 天

    [LV.7]常住居民III

    5

    主题

    581

    回帖

    2385

    积分

    荣誉版主

    积分
    2385
    发表于 2024-3-23 14:43:10 | 显示全部楼层
    我感觉我给出的答案也许与杨老师的不同,敬请期待吧

    点评

    期待 CosyOS 大虾的方法. 说实话, 只要不是关中断, 再笨再复杂的方法, 我认为都是实用方法(至少有优化的空间, 或者能给出一点提示, 最后成就更好方法). 至于关中断, 是个万金油, 傻子都会, 没一点技术含量, 实在没  详情 回复 发表于 2024-3-23 17:14
    完全可能,届时我介绍的对不对,以你的判定为准  详情 回复 发表于 2024-3-23 16:29
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 23:21
  • 签到天数: 174 天

    [LV.7]常住居民III

    17

    主题

    371

    回帖

    1371

    积分

    荣誉版主

    积分
    1371
    发表于 2024-3-23 15:03:54 | 显示全部楼层
    KEIL C51很优秀,在国内使用广泛。
    当前,更优秀的IAR C51,也加大了推广力度,起码在教学方面免费。

    希望能看到OS系统在IAR C51上的编译结果。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10922
     楼主| 发表于 2024-3-23 15:35:11 | 显示全部楼层
    CosyOS 发表于 2024-3-23 14:10
    函数是否可重入的问题确实是嵌入式开发中的重点问题,应给与足够的重视。
    C51的标准库函数中,的确有不少都 ...

    (1)随着STC8051H全新架构的 32位 8051@STC32G96K256这两种新STC单片机的推出,改写相当部分的C51和C251编译器的库函数是肯定的了,而且已经在进行中了。

    (2)C51和C251当初在框架设计时就已经考虑对芯片厂商增加硬件加速器的支持,C51和C251的标准库是最后连接的。意思就是你不用修改Keil的原装库,你只要写一个相同库函数名的自己的函数,Keil就优先连接用户的这个函数,而忽略掉Keil本身原装的库函数。
    顺带点评一下LAOXU的修改C51的STRING库的方法,他老兄居然连这一点都不知道,居然是在STRING.H头文件里
    /* extern char *strcat (char *s1, char *s2); */
    #define  strcat(dst, src)                                strcat1a ((long)src, dst)
    extern char *strcat1a (long dst, char *src);

    用“#define  strcat(dst, src)”引导编译程序连接自己写得库函数:LAOXU这种方法我觉得很不专业这个言词不激烈了吧),好歹先了解下C51/C251的规则呀。
    (3)其实在推出STC32G/STC32F后,STC官方已经按上面(2)的专业的方法给出了修改后的C251库函数了(包括USB),而且也放到STC-SIP中了。所以大家只要在自己的项目中加入STC的官方库,自然就已经将C251的库函数修改了。
    (4)对于新的STC8系列,使用了DPU32的新的芯片推出后,自然对应的C51的官方的修改了的标准函数库就会推出来,现在LAOXU瞎操心,我形容为是“产前焦虑症”,不为过吧。


    (5)LAOXU的孜孜不倦在库函数领域,包括64位浮点数基础算法方面的研究精神当然是值得称赞的。但是把一个风车夸张成魔鬼,冲上去大战一番,去解救心上人的实际行动最好还是免了吧,这样会吓到别人的。
    比如这一次,先是以老师的名义树了个“魔鬼”:使用了“全称否定”:老师言: "C51的LIB都是不可重入."
    然后号称传统51由于构架原因, 并不适用于跑 OS系统(特别是大容量程序), keil 在 51上推 OS, 问题多多, 后来 251上就直接取消 OS 了.
    然后吓唬:记得十年前, 网上经常有网友发贴求教 51  OS系统运行不稳定易死机. 后来M3/M0流行了, 我想这帮子人都转 M3/M0 去了
    然后冲上去自己编了STRING库,
    然后觉得只有他的这个方法能“拯救”C51,进而拯救STC8051单片机。
    然后发出挑战:除了他谁能解C51库函数不能重入的问题
    然后再提出一个除了改写库函数自己都解决不了的问题

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10922
     楼主| 发表于 2024-3-23 15:55:34 | 显示全部楼层
    CosyOS 发表于 2024-3-23 14:10
    函数是否可重入的问题确实是嵌入式开发中的重点问题,应给与足够的重视。
    C51的标准库函数中,的确有不少都 ...

    “Arm C/C++库中也同样存在不可重入函数”这个问题我要向你请教,因为我正在用Keil MDK玩RTOS,STC也将推出STC33系列单片机。
    你的CosyOS已经有运行在ARM上的版本了,请问Keil的MDK的库函数有哪些是不可重入的?这些不可重入的库函数会不会被基本的RTOS比如你的CosyOS用到?

    点评

    有用到的,但都做了互斥访问,如 malloc。 Arm的C/C++库中已经不怎么提“reentrant”的概念了,而是“Thread-safe” 或 “not thread-safe”。  详情 回复 发表于 2024-3-23 16:13
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 177 天

    [LV.7]常住居民III

    5

    主题

    581

    回帖

    2385

    积分

    荣誉版主

    积分
    2385
    发表于 2024-3-23 16:13:00 | 显示全部楼层
    杨为民 发表于 2024-3-23 15:55
    “Arm C/C++库中也同样存在不可重入函数”这个问题我要向你请教,因为我正在用Keil MDK玩RTOS,STC也将推 ...

    有用到的,但都做了互斥访问,如 malloc。
    Arm的C/C++库中已经不怎么提“reentrant”的概念了,而是“Thread-safe” 或 “not thread-safe”。

    点评

    谢谢分享。 我比较激进,对于CODE区不在RAM区的单片机上的RTOS不主张使用“malloc”,只使用静态任务建立  详情 回复 发表于 2024-3-23 16:24
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10922
     楼主| 发表于 2024-3-23 16:13:20 | 显示全部楼层
    LAOXU 发表于 2024-3-23 01:11
    对, 我没有好的办法, 请你老指教.

    事实上很多时候, 如杨老师所言: "其实解决方法很简单", 只是, 他知道 ...

    最直观最简单的方法已经放到2楼了,不知LAOXU是否认可
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10922
     楼主| 发表于 2024-3-23 16:24:39 | 显示全部楼层
    CosyOS 发表于 2024-3-23 16:13
    有用到的,但都做了互斥访问,如 malloc。
    Arm的C/C++库中已经不怎么提“reentrant”的概念了,而是“Thre ...

    谢谢分享。

    我比较激进,对于CODE区不在RAM区的单片机上的RTOS不主张使用“malloc”,只使用静态任务建立


    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-21 16:11 , Processed in 0.084046 second(s), 71 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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