fanxsp
发表于 2023-11-15 17:04:06
tzz1983 发表于 2023-11-15 15:51
@COsyOS我记得人好像说过可以用IO中断来做PendSv , 刚才我去试了一下, 结果发现IO中断标志软件写不了, 只 ...
我用第三方的,用外部中断模拟PendSV, 也发现一个问题,硬件产生的中断,响应后会自动清除中断标志,软件设置的,就不会自动清除,折腾了很久才发现。 所以模拟pendSV, 这种非常规的使用方法,还是要以实测为准,不能单看规格书。
CosyOS
发表于 2023-11-15 17:15:45
fanxsp 发表于 2023-11-15 17:04
我用赛元的,用外部中断模拟PendSV, 也发现一个问题,硬件产生的中断,响应后会自动清除中断标志,软件设 ...
是的,赞同你的说法,一切以实测为准。
CosyOS
发表于 2023-11-15 19:04:01
CosyOS PendSV中断 选择注意事项
现有测试表明:
1、使用INT0、INT1中断,可确保长时间稳定、可靠运行。
2、使用INT2、INT3、INT4、TM2、TM3、TM4中断,短时间测试就会死机。
初步结论:
CosyOS暂时只能选择中断使能寄存器和中断标志寄存器均可直接位寻址的中断。
另外,为确保可靠,即使中断标志位能够在中断服务程序中硬件自动清零,MCU配置头文件中的“中断清零”也还是定义为好。
这个问题,这两天我会做为专题来研究一下,待有新结论后,会再次告知大家。
tzz1983
发表于 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, 正好是一个能用的{:lol:}
CosyOS
发表于 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,情况就会好的多,但也仍然会死机。
待我明日再深入研究一下。
tzz1983
发表于 2023-11-16 09:54:39
本帖最后由 tzz1983 于 2023-11-16 09:57 编辑
CosyOS 发表于 2023-11-15 22:11
根据你的测试,看来IO口中断标志位是不能写1的。
你可以用写IO的方法,测试看是否稳定、可靠。
那你这边可能是时序问题, 我昨天也测试了写IO以后, 要多久长能响应中断, 其实是有延时的, 不管是写IO还是写标志都有延时,以下我是测试的代码, 看看对你有没有用:
用这种方法测试还挺准的,实际测试值为写IO 4个时钟周期后响应中断
顺带吐槽一下仿真器, 有时候和实际运行不符, 昨天在测试中断嵌套时, 仿真单步执行直接不响应中断. 下载代码实际运行又没有问题 , 花了不少时间.总的来说就是仿真器和实际运行差异还是挺大的
平常我比较习惯用printf()调试程序
fanxsp
发表于 2023-11-16 11:44:56
本帖最后由 fanxsp 于 2023-11-16 11:49 编辑
tzz1983 发表于 2023-11-16 09:54
那你这边可能是时序问题, 我昨天也测试了写IO以后, 要多久长能响应中断, 其实是有延时的, 不管是写IO还是 ...
看来,单周期51单片机和传统的Intel 80318051的中断响应时序不会完全一样,而且不同厂家也有可能还有区别,我这边也测试一下。之前讨论中断响应时序时,我就有这种疑问,所以想叫厂家设计芯片内部电路的工程师来回答。不过,这些问题还不会影响模拟PendSV方法的使用。
CosyOS
发表于 2023-11-16 11:52:49
tzz1983 发表于 2023-11-16 09:54
那你这边可能是时序问题, 我昨天也测试了写IO以后, 要多久长能响应中断, 其实是有延时的, 不管是写IO还是 ...
你的研究很仔细嘛,很好!
看来写IO中断响应确实慢了些。
写标志位应该会快的多,但不同的中断也可能不同。
我曾做过测试,INT0,写标志位IE0 = 1,会立即响应中断。
如果是中断标志寄存器不能直接位寻址的会不会有延迟?如 AUXINTIF |= INT2IF; 这个需要实际测试一下。
待我今天下午测试一下。。。
CosyOS
发表于 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中断的选择,不同的单片机可能会有不同的结论,一切还是要以实际测试为准。
神农鼎
发表于 2023-11-16 20:36:27
STC传统8051, 如 STC89C52RC的中断响应过程