谢谢各位的解答![]() |
Hephaestus 发表于 2021-10-30 23:06 谢谢大佬解决了我的疑问 ![]() |
Hephaestus 发表于 2021-10-30 23:06 好的,你是对的. |
Y_G_G 发表于 2021-10-30 22:37 都不对,你没理解什么是原子操作。 对于8位单片机,16位的cnt不管是>=1000还是==1000都需要两步比较,如果两次中间插入中断cnt++会破坏cnt的值,或者改变CY等标志位的状态,导致比较结果错误。 避免这种错误有两种解决办法。1)比较前关中断,比较后开中断。2)把定时中断时间间隔改成4ms,这样cnt就可以用unsigned char类型,不管是比较还是++都可以在一个指令内完成,不怕被中间打断。 |
unsigned int cnt是全局变量,而且cnt是在中断中改变的 if (cnt==1000)虽然在仿真时候能给你想要的结果 但实际使用中,if (cnt>=1000)才是正确的 |
188610329 发表于 2021-10-30 18:59 那就是原子操作的问题,楼主应该检查中断里面用到cnt没有。 |
当使用8位机系统的时候, 如果 中断 和 主程序 都会操作同一个变量的时候, 那么, 这个变量应该避免 超过一个字节(8位)。尤其是当你使用的C语言,而不是汇编的话, 会有不可控的情况发生。 |
个人觉得,你应该再审一下题,1和2是一样的unsigned int cnt |