找回密码
 立即注册
查看: 1036|回复: 7

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-5-27 07:10:45 | 显示全部楼层 |阅读模式
本帖最后由 杨为民 于 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毫秒宽度的方波作为参考信号,程序见下图:
Fig_01_TaskA.jpg
(3)本文测试采用的不可重入的函数如下图:
Fig_02_不可重入函数.jpg
这是一个3重循环的超长延时函数。其中第28行函数定义没有加任何关键字,对于C51编译器,这个函数肯定是不可重入的。

(4)任务B和任务C都调用了这个超长延迟函数,这两个任务的程序如下:
Fig_03_TaskBC.jpg
其中任务B产生一个700毫秒的正脉冲,任务C产生10毫秒宽度的方波。

(5)由于函数是不可重入的,对倚天剑x51和CosyOS-II-STC8H测试结果如下:
Fig_04_不可重入结果A.jpg
从图中可以看出当任务B第一次执行不可重入函数“DelayMS()”后,任务C便崩溃了,程序陷入死循环状态。

(6)程序继续执行下去的结果见下图:
Fig_05_不可重入结果B.jpg
只有任务A和任务B还在正常运行,任务C已经死在那里了。
三、RTOS函数可重入的实际例子

(7)对于C51编译器,将一个不可重入函数变为可重入函数的标准方法是对该函数加“reentrant”的关键字。加关键字的程序见下图
Fig_06_可重入函数.jpg
其中第28行函数定义已经加了“reentrant”的关键字。

(8)将“DelayMS()”函数设置为可重入后,倚天剑x51的系统启动信号如下图:
Fig_07_可重入结果A.jpg
其中任务C可以连续运行下去了。图中任务C中的缺口是高优先级任务B调用“DelayMS()”函数时对剥夺了低优先级任务C的执行权产生的停滞。

程序继续运行下去的信号见下图:
Fig_08_可重入结果B.jpg
(9)当对CosyOS-II-STC8H的“DelayMS()”函数加了“reentrant”的关键字后,系统启动时的信号是这样的:
Fig_09_崩溃A.jpg
当任务B第3次执行不可重入函数“DelayMS()”后,任务C便崩溃了,程序陷入死循环状态。同时任务C的方波宽度缩小到13个微秒。

程序继续运行下去的信号见下图:
Fig_10_崩溃B.jpg
任务C继续崩溃,死在那里了。

10)结论:CosyOS-II-STC8H碰到加了“reentrant”的关键字后的函数便会崩溃,这对于“抢占式”的RTOS是一个不能接受的硬伤。
附件501_倚天剑x51_V31_STC8H_函数重入问题.rar (87.45 KB, 下载次数: 84)

附件502_CosyOS-II-STC8H-TEST_函数重入问题.rar (408.43 KB, 下载次数: 77)


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 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单片机RTOS
https://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
(
出处: 国芯技术交流网站)


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-5-28 10:24:55 | 显示全部楼层
本帖最后由 tzz1983 于 2024-5-28 11:24 编辑

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

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

看来杨老师以后要低调一点了,高处不胜寒啊!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 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,  研发中


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-6-9 08:23:08 | 显示全部楼层
在学习中, 发现杨教授这是多年的累积, 是真的从底层开始研究的, 除了不做数字逻辑实现, 真的是平地起高楼,从打桩到硬装, 全部搞定, 大赞!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 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, 其实对于效率而言可能反而有所损失

点评

这就是PLC等通用工控设备的串口通信波特率缺省为9600的道理  详情 回复 发表于 2024-7-24 19:19
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-7-24 19:19:56 | 显示全部楼层
139182*** 发表于 2024-7-24 07:48
关EA和丢信号之间的关系我之前理解不准确
应该是关闭EA时间内,同一个VECTOR有2次信号才会丢失后一个信号
...

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-7-25 22:55:51 | 显示全部楼层
杨*** 发表于 2024-7-24 19:19
这就是PLC等通用工控设备的串口通信波特率缺省为9600的道理

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

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:13 , Processed in 0.125598 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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