找回密码
 立即注册
楼主: 小飞侠

发现一个bug不知道是单片机还是Keil的问题 | 是细节问题,大家必须看下,原子操作

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:518
  • 最近打卡:2025-05-01 05:52:49
已绑定手机

46

主题

1694

回帖

2540

积分

金牌会员

积分
2540
发表于 2024-11-20 16:12:04 | 显示全部楼层
VC*** 发表于 2024-11-20 13:30
我虽然没点开楼主的程序,但是结合他的截图,和你的修改,我就知道问题出在哪里了

,stc32就没有这种问题吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-11-20 16:23:38 | 显示全部楼层
jw*** 发表于 2024-11-20 16:12
,stc32就没有这种问题吧

是的,80251指令集允许单指令加载16位数据。也就是将内存数据mov到WRj

但是似乎没有找到32位数据的加载指令(将内存数据mov到DRj)


截图202411201621597839.jpg


联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-11-20 16:43:26 | 显示全部楼层
本帖最后由 bkeuqoaq 于 2024-11-20 16:44 编辑
VC*** 发表于 2024-11-20 16:23
是的,80251指令集允许单指令加载16位数据。也就是将内存数据mov到WRj

但是似乎没有找到32位数据的加载指 ...

有32位的加载指令dir8,和dir16都可以加载到双字寄存器里
只能直接寻址,不能间接寻址


截图202411201643436360.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-11-20 17:14:38 来自手机 | 显示全部楼层
bkeuqoaq 发表于 2024-11-20 16:43
有32位的加载指令dir8,和dir16都可以加载到双字寄存器里
只能直接寻址,不能间接寻址


这是立即数的加载指令吧?

能否把内存地址里的连续4字节加载到寄存器里呢?
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-11-20 17:28:50 | 显示全部楼层
本帖最后由 bkeuqoaq 于 2024-11-20 17:30 编辑
VC*** 发表于 2024-11-20 17:14
这是立即数的加载指令吧?

能否把内存地址里的连续4字节加载到寄存器里呢? ...

这不是立即寻址,是直接寻址,标准的51只能8位地址直接寻址,251扩展到16位地址了

可以把内存地址里的连续4字节加载到寄存器里,只能直接地址,但不能间接地址,如果能间接就NB了
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2024-11-25 10:11:58 | 显示全部楼层
小*** 发表于 2024-11-20 12:25
变量定义时不赋初值,在主程序中赋值,结果就正常了,再请问一下,局部变量也是这样吗? ...

请问是中断的问题,那这里在变量定义时赋值又是什么问题?
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-17 09:50:59

17

主题

91

回帖

755

积分

高级会员

积分
755
发表于 2024-11-25 10:25:23 | 显示全部楼层
STC 是 8位单片机,中断中尽量不用8位以上的比较,用也要先赋值一个临时变量再用,复制后还要比较一下有没有变化:
a=b;
if (a==b)
{
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:320
  • 最近打卡:2025-04-30 11:29:16
已绑定手机

21

主题

487

回帖

1023

积分

金牌会员

积分
1023
发表于 2024-11-25 10:36:18 | 显示全部楼层
经典案例,大有收获 感谢分享
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2025-04-30 08:40:57
已绑定手机

15

主题

630

回帖

730

积分

高级会员

积分
730
发表于 2024-11-25 16:58:57 | 显示全部楼层
确实经典 一般没遇到还真想不到这个方面去
STC 666 888
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:82
  • 最近打卡:2025-05-01 11:31:59
已绑定手机

1

主题

5

回帖

365

积分

中级会员

积分
365
发表于 2024-11-25 21:22:42 | 显示全部楼层
在使用AI8051U单片机时定义了float型数据,放在edata就是正常的,放在xdata就出现了莫名奇妙的问题,原来是原子操作的问题,长见识了!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 19:58 , Processed in 0.183340 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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