标题: 关于C语言unsigned int使用细节问题 [打印本页]

作者: 3232445630    时间: 2021-10-30 15:29
标题: 关于C语言unsigned int使用细节问题
使用unsigned int时为啥出现了图片的两种情况,1、用unsigned int cnt时判断表达式>=时计数到768就进入if里了 2、用unsigned int cnt时判断表达式==时计数到1000就进入if里了。二者理论上都应该是计数到1000进入if才对,为啥会出现这种情况?



第一种情况



第二种情况


作者: wfqxgw    时间: 2021-10-30 18:12
个人觉得,你应该再审一下题,1和2是一样的unsigned int cnt
作者: 188610329    时间: 2021-10-30 18:59
当使用8位机系统的时候, 如果 中断 和 主程序 都会操作同一个变量的时候,  那么, 这个变量应该避免 超过一个字节(8位)。尤其是当你使用的C语言,而不是汇编的话, 会有不可控的情况发生。
作者: Hephaestus    时间: 2021-10-30 19:07
188610329 发表于 2021-10-30 18:59
当使用8位机系统的时候, 如果 中断 和 主程序 都会操作同一个变量的时候,  那么, 这个变量应该避免 超过 ...

那就是原子操作的问题,楼主应该检查中断里面用到cnt没有。
作者: Y_G_G    时间: 2021-10-30 22:37
unsigned int cnt是全局变量,而且cnt是在中断中改变的
if (cnt==1000)虽然在仿真时候能给你想要的结果
但实际使用中,if (cnt>=1000)才是正确的

作者: Hephaestus    时间: 2021-10-30 23:06
Y_G_G 发表于 2021-10-30 22:37
unsigned int cnt是全局变量,而且cnt是在中断中改变的
if (cnt==1000)虽然在仿真时候能给你想要的结果
但 ...

都不对,你没理解什么是原子操作。

对于8位单片机,16位的cnt不管是>=1000还是==1000都需要两步比较,如果两次中间插入中断cnt++会破坏cnt的值,或者改变CY等标志位的状态,导致比较结果错误。

避免这种错误有两种解决办法。1)比较前关中断,比较后开中断。2)把定时中断时间间隔改成4ms,这样cnt就可以用unsigned char类型,不管是比较还是++都可以在一个指令内完成,不怕被中间打断。
作者: Y_G_G    时间: 2021-10-31 13:02
Hephaestus 发表于 2021-10-30 23:06
都不对,你没理解什么是原子操作。

对于8位单片机,16位的cnt不管是>=1000还是==1000都需要两步比较, ...

好的,你是对的.
作者: 3232445630    时间: 2021-10-31 19:05
Hephaestus 发表于 2021-10-30 23:06
都不对,你没理解什么是原子操作。

对于8位单片机,16位的cnt不管是>=1000还是==1000都需要两步比较, ...

谢谢大佬解决了我的疑问
作者: 3232445630    时间: 2021-10-31 19:05
谢谢各位的解答




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1