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

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

[复制链接]
  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 172 天

    [LV.7]常住居民III

    1

    主题

    164

    回帖

    711

    积分

    高级会员

    积分
    711
     楼主| 发表于 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进行测试,程序工作正常。这样就可以证明在没有调用系统服务的情况,是没问题的。关于你修改的测试程序,我也试一下。
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    1

    主题

    164

    回帖

    711

    积分

    高级会员

    积分
    711
     楼主| 发表于 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, 下载次数: 5)

    点评

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

    使用道具 举报

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

    [LV.7]常住居民III

    1

    主题

    164

    回帖

    711

    积分

    高级会员

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

    点评

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

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10906
    发表于 2024-5-3 00:45:04 | 显示全部楼层
    本帖最后由 杨为民 于 2024-5-3 01:15 编辑
    fanxsp 发表于 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)造成的

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

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

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

    使用道具 举报

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

    [LV.7]常住居民III

    1

    主题

    164

    回帖

    711

    积分

    高级会员

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

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

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

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


    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    1

    主题

    164

    回帖

    711

    积分

    高级会员

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

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

    使用道具 举报

    该用户从未签到

    552

    主题

    9492

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 11:08
  • 签到天数: 173 天

    [LV.7]常住居民III

    5

    主题

    579

    回帖

    2347

    积分

    荣誉版主

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


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




    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    1

    主题

    164

    回帖

    711

    积分

    高级会员

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

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

    点评

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-18 08:01 , Processed in 0.075122 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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