找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1208|回复: 8
打印 上一主题 下一主题
收起左侧

关于C语言unsigned int使用细节问题

[复制链接]
跳转到指定楼层
楼主
使用unsigned int时为啥出现了图片的两种情况,1、用unsigned int cnt时判断表达式>=时计数到768就进入if里了 2、用unsigned int cnt时判断表达式==时计数到1000就进入if里了。二者理论上都应该是计数到1000进入if才对,为啥会出现这种情况?



第一种情况



第二种情况

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:419909 发表于 2021-10-30 18:12 | 只看该作者
个人觉得,你应该再审一下题,1和2是一样的unsigned int cnt
回复

使用道具 举报

板凳
ID:624769 发表于 2021-10-30 18:59 | 只看该作者
当使用8位机系统的时候, 如果 中断 和 主程序 都会操作同一个变量的时候,  那么, 这个变量应该避免 超过一个字节(8位)。尤其是当你使用的C语言,而不是汇编的话, 会有不可控的情况发生。
回复

使用道具 举报

地板
ID:883242 发表于 2021-10-30 19:07 | 只看该作者
188610329 发表于 2021-10-30 18:59
当使用8位机系统的时候, 如果 中断 和 主程序 都会操作同一个变量的时候,  那么, 这个变量应该避免 超过 ...

那就是原子操作的问题,楼主应该检查中断里面用到cnt没有。
回复

使用道具 举报

5#
ID:401564 发表于 2021-10-30 22:37 | 只看该作者
unsigned int cnt是全局变量,而且cnt是在中断中改变的
if (cnt==1000)虽然在仿真时候能给你想要的结果
但实际使用中,if (cnt>=1000)才是正确的
回复

使用道具 举报

6#
ID:883242 发表于 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类型,不管是比较还是++都可以在一个指令内完成,不怕被中间打断。
回复

使用道具 举报

7#
ID:401564 发表于 2021-10-31 13:02 | 只看该作者
Hephaestus 发表于 2021-10-30 23:06
都不对,你没理解什么是原子操作。

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

好的,你是对的.
回复

使用道具 举报

8#
ID:883078 发表于 2021-10-31 19:05 | 只看该作者
Hephaestus 发表于 2021-10-30 23:06
都不对,你没理解什么是原子操作。

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

谢谢大佬解决了我的疑问
回复

使用道具 举报

9#
ID:883078 发表于 2021-10-31 19:05 | 只看该作者
谢谢各位的解答
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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