杨为民 发表于 2024-5-27 07:10:45

华山论剑(5):CosyOS-II-STC8H在有函数重入时又崩溃了

本帖最后由 杨为民 于 2024-5-27 07:33 编辑

一、前言本文是华山论剑系列文章的的第5篇。在裸机编程中,如果在后台任务与中断任务(或者一个以上的中断任务)中都调用了同一个函数,那么这个函数必须是可重入的函数,否则会产生不可预料的灾难后果。同样在RTOS中,如果在一个以上的实时任务(含中断任务)中调用了同一个函数,那么这个函数也必须是可重入的函数。比如一个实时任务正好运行该函数时发生看任务切换,被切换的新任务也调用了这个函数,如果该函数是不可重入的,那么当任务切换回来后,该函数的现场得不到恢复,则该函数往下执行时就会不正常,甚至该任务或者整个系统都会崩溃。本文给出了对RTOS不可重入函数的实际测试例子,测试结果表明“CosyOS-II-STC8H”目前的版本是不支持函数重入的,碰到有函数重入时崩溃了。 二、RTOS函数不可重入的实际例子(1)本文的测试方法是对本论坛RTOS排行榜的方法进行改造而来的。对CosyOS-II-STC8H的测试程序来源于该排行榜,测试结果仅适用于那个测试版本,未必代表CosyOS-II-STC8H最新版本的水平。(2)本文的测试程序有3个实时任务,优先级最高的任务A是在P04端口产生一个500毫秒宽度的方波作为参考信号,程序见下图:
(3)本文测试采用的不可重入的函数如下图:
这是一个3重循环的超长延时函数。其中第28行函数定义没有加任何关键字,对于C51编译器,这个函数肯定是不可重入的。
(4)任务B和任务C都调用了这个超长延迟函数,这两个任务的程序如下:
其中任务B产生一个700毫秒的正脉冲,任务C产生10毫秒宽度的方波。
(5)由于函数是不可重入的,对倚天剑x51和CosyOS-II-STC8H测试结果如下:
从图中可以看出当任务B第一次执行不可重入函数“DelayMS()”后,任务C便崩溃了,程序陷入死循环状态。
(6)程序继续执行下去的结果见下图:
只有任务A和任务B还在正常运行,任务C已经死在那里了。 三、RTOS函数可重入的实际例子
(7)对于C51编译器,将一个不可重入函数变为可重入函数的标准方法是对该函数加“reentrant”的关键字。加关键字的程序见下图
其中第28行函数定义已经加了“reentrant”的关键字。
(8)将“DelayMS()”函数设置为可重入后,倚天剑x51的系统启动信号如下图:
其中任务C可以连续运行下去了。图中任务C中的缺口是高优先级任务B调用“DelayMS()”函数时对剥夺了低优先级任务C的执行权产生的停滞。
程序继续运行下去的信号见下图:
(9)当对CosyOS-II-STC8H的“DelayMS()”函数加了“reentrant”的关键字后,系统启动时的信号是这样的:
当任务B第3次执行不可重入函数“DelayMS()”后,任务C便崩溃了,程序陷入死循环状态。同时任务C的方波宽度缩小到13个微秒。
程序继续运行下去的信号见下图:
任务C继续崩溃,死在那里了。
(10)结论:CosyOS-II-STC8H碰到加了“reentrant”的关键字后的函数便会崩溃,这对于“抢占式”的RTOS是一个不能接受的硬伤。




杨为民 发表于 2024-5-27 07:11:14

本帖最后由 杨为民 于 2024-5-27 07:12 编辑

第4篇文章《华山论剑(4):倚天剑x51,真正实现了“零中断延迟”的STC单片机RTOS》介绍了对倚天剑x51和CosyOS-II进行含系统服务的用户高优先级中断的响应时间的测试方法、实际测试结果和测试结论。经过测试,倚天剑x51对于用户的“高优先级有系统服务中断”真正实现了“零中断延迟”,而CosyOS-II对于用户重复中断调用有限制,当用户重复中断周期小于7微秒(大约)后,系统会崩溃,因此只有当用户重复中断周期长于限制值时,CosyOS-II才算是“零中断延迟”的。 华山论剑(4):倚天剑x51,真正实现了“零中断延迟”的STC单片机RTOShttps://www.stcaimcu.com/forum.php?mod=viewthread&tid=8565(出处: 国芯技术交流网站)
第3篇文章《CosyOS-II-STC8H在测试高优先级中断服务调用时崩溃了》介绍了用CosyOS-II官宣的“零中断延迟”测试程序进行测试的结果。结果表明当在用户中断中进行系统服务调用时,如果用户中断的周期小于25微秒(40KHz),则系统运行崩溃。在该帖子中,CosyOS本尊给出了崩溃的原因。

华山论剑(3): CosyOS-II-STC8H在测试高优先级中断服务调用时崩溃了
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=8516
(出处: 国芯技术交流网站)


第2篇文章《“零中断延迟”是否可以实现: RTOS的最大中断延迟时间测量》介绍了如何测量单片机RTOS的中断延迟时间,并且对“同等优先级中断”的延迟时间进行了实际测量,结论是:对于硬件中断优先级与系统中断相同或更低的用户中断而言,哪怕在用户中断里没有调用系统服务,由于系统中断的阻塞,用户中断也不可能是“零中断延迟”的。换言之“零中断延迟”的概念仅适用于那些优先级高于系统中断的用户中断。
华山论剑(2): “零中断延迟”是否可以实现: RTOS的最大中断延迟时间测量
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=8196
(出处: 国芯技术交流网站)


第1篇文章《科普“零中断延迟”的临界区保护方法》介绍了“零中断延迟”的概念和STC单片机RTOS临界区保护的两类方法:关闭和不关闭总中断的临界区保护方法。

华山论剑(1): 科普“零中断延迟”的临界区保护方法
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=8151
(出处: 国芯技术交流网站)


tzz1983 发表于 2024-5-28 10:24:55

本帖最后由 tzz1983 于 2024-5-28 11:24 编辑

这华山之巅怎么静悄悄的呢,难道现代人都不练武了吗{:loveliness:}.

估计是杨老师功力太深了,没人敢上山。

看来杨老师以后要低调一点了,高处不胜寒啊!

神农鼎 发表于 2024-5-28 10:45:39

曲高和寡 !
点灯大师们在杨老师的指引下,一定会登顶 RTOS 高峰 !
等 STC8051U, STC8052U, STC32G96K256 今年出来

RTOS 必将在51世界,灿烂的盛放


STC8051U, 2K edata,      32K xdata,    管脚兼容 STC89C52RC
STC8052U, 32K edata ?64K xdata ? 管脚兼容 STC89C52RC
===要加 DSP/DPU32, 加 CAN-FD

STC32G96K256-LQFP100/64/48,32K edata,64K xdata,研发中

13918210822 发表于 2024-6-9 08:23:08

在学习中, 发现杨教授这是多年的累积, 是真的从底层开始研究的, 除了不做数字逻辑实现, 真的是平地起高楼,从打桩到硬装, 全部搞定, 大赞!

13918210822 发表于 2024-7-24 07:48:51

本帖最后由 13918210822 于 2024-7-24 07:54 编辑

杨为民 发表于 2024-5-27 07:11
第4篇文章《华山论剑(4):倚天剑x51,真正实现了“零中断延迟”的STC单片机RTOS》介绍了对倚天剑x51和Cos ...
关EA和丢信号之间的关系我之前理解不准确
应该是关闭EA时间内,同一个VECTOR有2次信号才会丢失后一个信号
比如115200的UART, 87us一个字节,如果不用DMA, 且关闭EA超过87us, 且有2字节到达,才丢后一个字节

因此,只要控制好关闭EA的时钟数,也是信号安全的

过分追求不关闭EA, 其实对于效率而言可能反而有所损失

杨为民 发表于 2024-7-24 19:19:56

13918210822 发表于 2024-7-24 07:48
关EA和丢信号之间的关系我之前理解不准确
应该是关闭EA时间内,同一个VECTOR有2次信号才会丢失后一个信号
...

这就是PLC等通用工控设备的串口通信波特率缺省为9600的道理

13918210822 发表于 2024-7-25 22:55:51

杨为民 发表于 2024-7-24 19:19
这就是PLC等通用工控设备的串口通信波特率缺省为9600的道理

9600bps, 1个字节要 1ms+, 对单片机当年的速度比较友好,也对RTOS默认时间片比较宽容

页: [1]
查看完整版本: 华山论剑(5):CosyOS-II-STC8H在有函数重入时又崩溃了