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

今停一次,RTOS 线上教学:全局不关总中断的CosyOS for STC,20课时

 火... [复制链接]

该用户从未签到

20

主题

575

回帖

1191

积分

荣誉版主

积分
1191
发表于 2023-11-15 16:59:45 | 显示全部楼层
tzz1983 发表于 2023-11-15 15:51
@COsyOS  我记得人好像说过可以用IO中断来做PendSv , 刚才我去试了一下, 结果发现IO中断标志软件写不了, 只 ...

可能我自己的问题, 晚上再看看, 不过我知道有些中断标志是不能写1的, 比如UART3的 S3TI , 清零可以, 写1却没有作用
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:35
  • 签到天数: 171 天

    [LV.7]常住居民III

    1

    主题

    164

    回帖

    707

    积分

    高级会员

    积分
    707
    发表于 2023-11-15 17:04:06 | 显示全部楼层
    tzz1983 发表于 2023-11-15 15:51
    @COsyOS  我记得人好像说过可以用IO中断来做PendSv , 刚才我去试了一下, 结果发现IO中断标志软件写不了, 只 ...

    我用第三方的,用外部中断模拟PendSV, 也发现一个问题,硬件产生的中断,响应后会自动清除中断标志,软件设置的,就不会自动清除,折腾了很久才发现。 所以模拟pendSV, 这种非常规的使用方法,还是要以实测为准,不能单看规格书。

    点评

    是的,赞同你的说法,一切以实测为准。  详情 回复 发表于 2023-11-15 17:15
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    5

    主题

    579

    回帖

    2347

    积分

    荣誉版主

    积分
    2347
     楼主| 发表于 2023-11-15 17:15:45 | 显示全部楼层
    fanxsp 发表于 2023-11-15 17:04
    我用赛元的,用外部中断模拟PendSV, 也发现一个问题,硬件产生的中断,响应后会自动清除中断标志,软件设 ...

    是的,赞同你的说法,一切以实测为准。
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    5

    主题

    579

    回帖

    2347

    积分

    荣誉版主

    积分
    2347
     楼主| 发表于 2023-11-15 19:04:01 | 显示全部楼层
    CosyOS PendSV中断 选择注意事项


    现有测试表明:
    1、使用INT0、INT1中断,可确保长时间稳定、可靠运行。
    2、使用INT2、INT3、INT4、TM2、TM3、TM4中断,短时间测试就会死机。

    初步结论:

    CosyOS暂时只能选择中断使能寄存器中断标志寄存器可直接位寻址的中断。
    另外,为确保可靠,即使中断标志位能够在中断服务程序中硬件自动清零,MCU配置头文件中的“中断清零”也还是定义为好。

    这个问题,这两天我会做为专题来研究一下,待有新结论后,会再次告知大家。



    点评

    我刚才的测试结果: (型号STC32G12K128 设置低电平触发 P32引脚IO中断 3种情况) 1. 外部按钮拉低, 有效 2. IO口写0拉低, 有效 3. 软件写中断标志, 无效 另外, 你说TM4 会死机? 我一直都用TM4啊, 从来没死机过,  详情 回复 发表于 2023-11-15 19:44
    回复 支持 1 反对 0 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    575

    回帖

    1191

    积分

    荣誉版主

    积分
    1191
    发表于 2023-11-15 19:44:48 | 显示全部楼层
    CosyOS 发表于 2023-11-15 19:04
    CosyOS PendSV中断 选择注意事项

    我刚才的测试结果:  (型号STC32G12K128  设置低电平触发 P32引脚IO中断  3种情况)
    1. 外部按钮拉低, 有效
    2. IO口写0拉低, 有效
    3. 软件写中断标志, 无效

    另外, 你说TM4 会死机?  我一直都用TM4啊, 从来没死机过, 考虑是不是软件上的问题?

    STC32G有些中断写中断标志无效很早前无意中发现的, 当时是做UAST3的串口程序, 本来想写S3TI产生中断启动, 结果发现不行, 当时也没在意.

    漠然回首, 发现STC32G 好多中断标志都是只能硬件置位的, 软件能清零, 但写1无效.
    也不知道是运气好还是怎么的, 我当时挑了一个TM4, 正好是一个能用的

    点评

    根据你的测试,看来IO口中断标志位是不能写1的。 你可以用写IO的方法,测试看是否稳定、可靠。 CosyOS与你移植的UCOS-II有所不同, CosyOS会在进入/退出任务临界区时,关闭/开启 PendSV中断、和SysTick中断,而这种  详情 回复 发表于 2023-11-15 22:11
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    5

    主题

    579

    回帖

    2347

    积分

    荣誉版主

    积分
    2347
     楼主| 发表于 2023-11-15 22:11:24 | 显示全部楼层
    tzz1983 发表于 2023-11-15 19:44
    我刚才的测试结果:  (型号STC32G12K128  设置低电平触发 P32引脚IO中断  3种情况)
    1. 外部按钮拉低, 有效 ...

    根据你的测试,看来IO口中断标志位是不能写1的。
    你可以用写IO的方法,测试看是否稳定、可靠。


    CosyOS与你移植的UCOS-II有所不同,
    CosyOS会在进入/退出任务临界区时,关闭/开启 PendSV中断、和SysTick中断,而这种情况会是频繁发生的。
    而且还必须满足时序要求,就是必须先关闭PendSV,待成功后再关闭SysTick。


    而你的UCOS-II是不会的,你初始化时开启中断就OK了。



    我可以基本确定 CosyOS之所以会出现这个问题的原因是:
    当PendSV中断的中断使能寄存器不能直接位寻址时,关闭中断不能立即生效(虽然汇编仅有一条指令),从而导致“先关闭PendSV,后关闭SysTick”,在实际的时序上未能实现。
    前些天我曾做过测试,但没有深入研究,草草就收场了,就是在关闭PendSV后,插入了两个空操作,再关闭SysTick,情况就会好的多,但也仍然会死机。
    待我明日再深入研究一下。






    点评

    那你这边可能是时序问题, 我昨天也测试了写IO以后, 要多久长能响应中断, 其实是有延时的, 不管是写IO还是写标志都有延时,以下我是测试的代码, 看看对你有没有用: [attachimg]26999[/attachimg] [attachimg]27002[/  详情 回复 发表于 2023-11-16 09:54
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    575

    回帖

    1191

    积分

    荣誉版主

    积分
    1191
    发表于 2023-11-16 09:54:39 | 显示全部楼层
    本帖最后由 tzz1983 于 2023-11-16 09:57 编辑
    CosyOS 发表于 2023-11-15 22:11
    根据你的测试,看来IO口中断标志位是不能写1的。
    你可以用写IO的方法,测试看是否稳定、可靠。

    那你这边可能是时序问题, 我昨天也测试了写IO以后, 要多久长能响应中断, 其实是有延时的, 不管是写IO还是写标志都有延时,以下我是测试的代码, 看看对你有没有用:
    微信图片1.png


    微信图片_20231116094716.png

    用这种方法测试还挺准的,  实际测试值为写IO 4个时钟周期后响应中断

    顺带吐槽一下仿真器, 有时候和实际运行不符, 昨天在测试中断嵌套时, 仿真单步执行直接不响应中断. 下载代码实际运行又没有问题 , 花了不少时间.  总的来说就是仿真器和实际运行差异还是挺大的
    平常我比较习惯用printf()调试程序

    点评

    你的研究很仔细嘛,很好! 看来写IO中断响应确实慢了些。 写标志位应该会快的多,但不同的中断也可能不同。 我曾做过测试,INT0,写标志位IE0 = 1,会立即响应中断。 如果是中断标志寄存器不能直接位寻址的会不会有  详情 回复 发表于 2023-11-16 11:52
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:35
  • 签到天数: 171 天

    [LV.7]常住居民III

    1

    主题

    164

    回帖

    707

    积分

    高级会员

    积分
    707
    发表于 2023-11-16 11:44:56 | 显示全部楼层
    本帖最后由 fanxsp 于 2023-11-16 11:49 编辑
    tzz1983 发表于 2023-11-16 09:54
    那你这边可能是时序问题, 我昨天也测试了写IO以后, 要多久长能响应中断, 其实是有延时的, 不管是写IO还是 ...

    看来,单周期51单片机和传统的Intel 8031  8051的中断响应时序不会完全一样,而且不同厂家也有可能还有区别,我这边也测试一下。之前讨论中断响应时序时,我就有这种疑问,所以想叫厂家设计芯片内部电路的工程师来回答。不过,这些问题还不会影响模拟PendSV方法的使用。

    点评

    这个问题是一直都有, 不是现在才有. ARM的SVC指令就是为了避免写存储器, 写本身就有延迟, 写过以后还要查询到才能  发表于 2023-11-16 13:12
    所以我们在设计RTOS时,还是要尽可能的避开这些细节,这些时序上的细节问题恐怕不同的厂家也都不同。  发表于 2023-11-16 11:59
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    5

    主题

    579

    回帖

    2347

    积分

    荣誉版主

    积分
    2347
     楼主| 发表于 2023-11-16 11:52:49 | 显示全部楼层
    tzz1983 发表于 2023-11-16 09:54
    那你这边可能是时序问题, 我昨天也测试了写IO以后, 要多久长能响应中断, 其实是有延时的, 不管是写IO还是 ...

    你的研究很仔细嘛,很好!
    看来写IO中断响应确实慢了些。
    写标志位应该会快的多,但不同的中断
    可能不同。
    我曾做过测试,INT0,写标志位IE0 = 1,会立即响应中断。
    如果是中断标志寄存器不能直接位寻址的会不会有延迟?如 AUXINTIF |= INT2IF; 这个需要实际测试一下。
    待我今天下午测试一下。。。



    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    5

    主题

    579

    回帖

    2347

    积分

    荣誉版主

    积分
    2347
     楼主| 发表于 2023-11-16 20:08:09 | 显示全部楼层
    题外话

    1、中断标志位写1后,需要多少个时钟周期才可以响应中断?

    笔者针对 STC8A8K64S4A12 做了测试,INT1、INT2、INT3、INT4、TM3、TM4,都是2个时钟周期。
    我曾说INT0中断标志位写1后会立即响应中断是错误的。

    2、STC32G的普通IO口中断,中断标志位写1能否触发中断?
    我的测试结论与 tzz1983 是一样的,不能。
    如果通过写IO的方法来触发,则需要等待4个时钟周期才能响应中断(引用 tzz1983 的测试结论,本人未做测试),而且在中断中还需要如下繁琐的操作:
    P00 = 1;
    _nop_();
    _nop_();
    P0INTF &=~0x01;

    效率低下,不建议用户采用。



    CosyOS PendSV中断 最新测试结论

    1、针对 STC8A8K64S4A12 的测试结论:
    (1)INT0、INT1、INT2、INT3、INT4、TM1,做为PendSV,均可正常工作。
    (2)TM3、TM4,做为PendSV,系统死机。
    (3)TM2,未做测试,想必结果与TM3、TM4 定然是一样的。
    (4)其它中断,未做测试。

    2、针对 STC32G12K128 的测试结论:
    (1)INT0、INT1、INT2、INT3、INT4、TM1、TM3、TM4、普通IO口中断(仅测试了P00),做为PendSV,均可正常工作。

    (2)其它中断,未做测试。


    所以,用户对PendSV中断的选择,不同的单片机可能会有不同的结论,一切还是要以实际测试为准。




    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-18 03:12 , Processed in 0.072345 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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