找回密码
 立即注册
楼主: fanxsp

原创极简的51-MCU专用RTOS TinyRTOS51

  [复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-5-2 22:34:04 | 显示全部楼层
本帖最后由 fanxsp 于 2024-5-2 23:17 编辑
杨*** 发表于 2024-5-2 19:36
(1)测试的起源:

92楼: 楼主: 如果是用Timer0做系统节拍,那就要调用OSTimeTick()函数,那设为“不可 ...

关于我的测试程序,我仔细想了一下,我把Timer0中断设为1ms, 这个间隔时间太长了,不能保证在任务切换的过程中timer0有发生中断,有可能发现不了问题。我把Timer0的中断间隔改为2us,重新进行了测试,发现任务切换时间变长了很多,说明在任务切换过程中,Timer0已经发生了多次中断。将Timer0的中断间隔改为2us进行测试,程序工作正常。这样就可以证明在没有调用系统服务的情况,是没问题的。关于你修改的测试程序,我也试一下。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-5-2 23:30:20 | 显示全部楼层
本帖最后由 fanxsp 于 2024-5-2 23:37 编辑
杨*** 发表于 2024-5-2 19:36
(1)测试的起源:

92楼: 楼主: 如果是用Timer0做系统节拍,那就要调用OSTimeTick()函数,那设为“不可 ...

关于你修改的测试程序我也进行了测试,之所以能正常工作,没有发现问题,原因就是Timer0 1ms的间隔时间太长了,结果在任务切换过程中,Timer0没有发生中断,也就没有发现问题。我把Timer0的中断间隔改为4us, OSTimeTick()的预分频改为250,Tick间隔 还是 1ms, 结果运行一段时间,就死机了。
Test_杨为民修改1.zip (345.27 KB, 下载次数: 151)

点评

(1)敢于实验,好事,点赞。而且给出了实验程序供大家讨论研究,更要点赞。 (2)试到死机,好事,说明你碰到了自己认知的一个边界,如果解决了,自己的眼界就提升到一个新阶段了。 (3)定时器0的不可屏蔽中断模  详情 回复 发表于 2024-5-3 00:45
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-5-3 00:06:08 | 显示全部楼层
我增加了P06输出,用来指示Timer0中断频率,这样就能观察到任务切换过程中Timer0中断的次数。

点评

等你自己的研究结论  详情 回复 发表于 2024-5-3 01:15
回复 支持 反对

使用道具 举报 送花

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

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-5-3 00:45:04 | 显示全部楼层
本帖最后由 杨为民 于 2024-5-3 01:15 编辑
fan*** 发表于 2024-5-2 23:30
关于你修改的测试程序我也进行了测试,之所以能正常工作,没有发现问题,原因就是Timer0 1ms的间隔时间太 ...

(1)敢于实验,好事,点赞。而且给出了实验程序供大家讨论研究,更要点赞

(2)试到死机,好事,说明你碰到了自己认知的一个边界,如果解决了,自己的眼界就提升到一个新阶段了。
(3)定时器0的不可屏蔽中断模式3是STC单片机专门为OS预留的系统节拍中断,因此弄清楚其正确使用的各种条件是很重要的。
(4)所以一定要弄清楚为什么定时器0中断时间缩短到4uS后会死机。为了方便大家研究探讨,我截了逻辑分析仪的屏:
A)下图是死机开始的现场:
Fig_05_4uS_死机.jpg

从32.25秒开始,任务B和任务C不工作了
B)下图是中断唤醒响应时间图:
Fig_06_4uS_56uS中断响应.jpg

中断唤醒响应时间从原来正常时的17uS,拉长到56us了


C)下图是任务切换响应时间图:

Fig_07_4uS_54uS任务响应.jpg

任务切换响应时间从原来正常时的14uS,拉长到54us了



(5)现在要研究的是我在98楼的新结论还正确吗?或者还需要加入什么条件吗?
98楼:(8)新结论:如果一个RTOS的临界区保护方法不是“采用不可嵌套的、直接关闭总中断”的方法,那么系统中断的定时器0可以也应该工作在模式3的不可屏蔽中断模式下。


补充说明:上面逻辑分析仪截屏中的第6通道信号不连续是采样时间太长(2uS)造成的

回复 支持 反对

使用道具 举报 送花

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

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-5-3 01:15:47 | 显示全部楼层
fan*** 发表于 2024-5-3 00:06
我增加了P06输出,用来指示Timer0中断频率,这样就能观察到任务切换过程中Timer0中断的次数。 ...

等你自己的研究结论
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-5-3 07:50:28 | 显示全部楼层
杨*** 发表于 2024-5-3 01:15
等你自己的研究结论

我的结论: TinyRTOS51可支持不可屏蔽中断条件是在不可屏蔽中断中不调用任何系统服务

死机的原因:任务切换期间需要操作链表、任务控制块(TCB)及堆栈,所以是要通过关中断进入临界区,由于Timer0是不可
屏蔽中断,关中断不起作用,如果在任务切换期间发生了Timer0中断,且在Timer0中断中调用了系统服务,就有可能会破坏
链表、TCB及堆栈的数据,造成系统死机。所以在不可屏蔽中断中不能调用任何系统服务。Timer0中断间隔为1ms时,
Timer0中断都是发生在空闲任务里,不会在任务切换期间发生中断,所以程序运行正常。Timer0中断间隔为4us时,就会在
任务切换期间发生Timer0中断,所以就死机了。

任务切换时间变长的原因:在切换过程中,发生了多次Timer0中断,中断响应的时间,就加到任务切换时间里了。


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-5-3 08:03:55 | 显示全部楼层
本帖最后由 fanxsp 于 2024-5-3 09:08 编辑

Timer0中断间隔改为2us, 增加P06输出,用于指示Timer0的中断频率,这样就可以直观观察到
任务切换期间Timer0发生了多少次中断。通过这个测试,才能真正证明RTOS是支持不可屏蔽中断的。
Test1.zip (356.13 KB, 下载次数: 149)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-5-3 09:39:54 | 显示全部楼层
Timer0中断间隔为4us时
===如果 STC8H8K64U工作在 40MHz
       1个uS是40个时钟
       4个uS是160个时钟,可以执行完 51的全部 111条指令了
       4个uS能干点事      
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:432
  • 最近打卡:2025-05-01 16:19:56

5

主题

1127

回帖

4263

积分

荣誉版主

积分
4263
发表于 2024-5-3 10:55:02 | 显示全部楼层
我想,杨老师可能是要提示我们,
当RTOS的临界区保护方法不是“采用不可嵌套的、直接关闭总中断”的方法时,
有一种可以在不可屏蔽中断中执行系统服务的方法。


难道是查询临界区嵌套计数器?
为假就执行服务;
为真就缓存服务,待最终退出临界区之前再执行?




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-5-3 11:11:48 | 显示全部楼层
本帖最后由 fanxsp 于 2024-5-3 11:15 编辑
Cos*** 发表于 2024-5-3 10:55
我想,杨老师可能是要提示我们,
当RTOS的临界区保护方法不是“采用不可嵌套的、直接关闭总中断”的方法时 ...

我的系统没有提供这种方法,只能是在不可屏蔽中断中不调用系统服务。因为不可屏蔽中断的目的就是为了快速响应,如果要等待退出临界区,那就相当于中断被屏蔽了,那不可屏蔽中断就没有什么意义了。

点评

我的意思不是说要你在“不可屏蔽中断中”等待, 而是说, 计数器为假,说明当前不在临界区中,你就可以执行服务; 计数器为真,说明当前在临界区中,你就只做一个标志位, 然后中断该退出就退出。 等最终临界区退出  详情 回复 发表于 2024-5-3 11:38
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 11:22 , Processed in 0.174289 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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