杨为民 发表于 2024-3-23 14:02:48

tzz1983 发表于 2024-3-23 13:16
Keil C51自然是优秀的,好用的,采用固定地址传递参数,调用树,覆盖。对于C51来说,这些都是闪闪发光的优 ...


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



CosyOS 发表于 2024-3-23 14:10:31

函数是否可重入的问题确实是嵌入式开发中的重点问题,应给与足够的重视。
C51的标准库函数中,的确有不少都是不可重入的,对于新手小白来说容易犯错。
C251标准库、Arm C/C++库中也同样存在不可重入函数,只是相对来说数量会少一些。
重写函数有时也的确是一个好方法。
LAOXU的精神是值得称赞的,为LAOXU点赞{:4_250:}

杨为民 发表于 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也说了除了重新写库函数,他没有解决方案。那么我先把最简单方案公布一下。

CosyOS 发表于 2024-3-23 14:43:10

我感觉我给出的答案也许与杨老师的不同,敬请期待吧

社区闲人 发表于 2024-3-23 15:03:54

KEIL C51很优秀,在国内使用广泛。
当前,更优秀的IAR C51,也加大了推广力度,起码在教学方面免费。

希望能看到OS系统在IAR C51上的编译结果。

杨为民 发表于 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); */
#definestrcat(dst, src)                              strcat1a ((long)src, dst)
extern char *strcat1a (long dst, char *src);

用“#definestrcat(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 了.
然后吓唬:记得十年前, 网上经常有网友发贴求教 51OS系统运行不稳定易死机. 后来M3/M0流行了, 我想这帮子人都转 M3/M0 去了
然后冲上去自己编了STRING库,
然后觉得只有他的这个方法能“拯救”C51,进而拯救STC8051单片机。
然后发出挑战:除了他谁能解C51库函数不能重入的问题
然后再提出一个除了改写库函数自己都解决不了的问题

杨为民 发表于 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用到?

CosyOS 发表于 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”。

杨为民 发表于 2024-3-23 16:13:20

LAOXU 发表于 2024-3-23 01:11
对, 我没有好的办法, 请你老指教.

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

最直观最简单的方法已经放到2楼了,不知LAOXU是否认可

杨为民 发表于 2024-3-23 16:24:39

CosyOS 发表于 2024-3-23 16:13
有用到的,但都做了互斥访问,如 malloc。
Arm的C/C++库中已经不怎么提“reentrant”的概念了,而是“Thre ...

谢谢分享。

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


页: 1 2 3 [4] 5 6 7 8 9 10
查看完整版本: STC单片机 uC/OS-II核心技术(12):关于临界区保护和函数可重入的测试题