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

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:439
  • 最近打卡:2025-06-15 06:17:51
已绑定手机

17

主题

714

回帖

1237

积分

金牌会员

积分
1237
发表于 2024-11-26 07:30:28 | 显示全部楼层
erci*** 发表于 2024-11-25 10:11
请问是中断的问题,那这里在变量定义时赋值又是什么问题?

变量定义时赋值应该没有问题,我在中断程序中有一些其他操作,暂时正常了,如果把其他操作都去掉,只保留变量的自加操作,还是会出现问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:557
  • 最近打卡:2025-06-15 09:02:29

24

主题

524

回帖

1220

积分

荣誉版主

积分
1220
发表于 2024-11-29 18:47:26 | 显示全部楼层
临界变量问题,要注意保护。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:439
  • 最近打卡:2025-06-15 06:17:51
已绑定手机

17

主题

714

回帖

1237

积分

金牌会员

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

{:5_278:}

所以进行16位,32位的volatile变量访问时,一定要关闭中断!确保访问操作的原子性,关闭中断这确实是正解
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2025-04-25 09:17:26

2

主题

17

回帖

140

积分

注册会员

积分
140
发表于 2024-12-10 17:59:07 | 显示全部楼层
  1. void main(void)
  2. {
  3.         P_SW2 |= 0x80;
  4.         Init_Timer_1ms();
  5.         EA = 1;
  6.         P3M1 = 0;P3M0 = 0x10;
  7.         while(1)
  8.         {
  9.                 uint16_t usTmp;
  10.                 EA = 0;
  11.                 usTmp = timer_ms;
  12.                 EA = 1;
  13.                 if(usTmp>=500)
  14.                 {//500ms任务
  15.                         P34 ^= 1;
  16.                         rf_buf[aa]=usTmp;
  17.                         EA = 0;
  18.                         timer_ms = 0;
  19.                         EA = 1;
  20.                         aa++;
  21.                         if(aa>=28)
  22.                         {
  23.                                 aa=0;
  24.                         }
  25.                 }
  26.         }
  27. }
复制代码

上面这样或者下面这样,但是要加volatile声明变量timer_ms,试试。
  1. void main(void)
  2. {
  3.         P_SW2 |= 0x80;
  4.         Init_Timer_1ms();
  5.         EA = 1;
  6.         P3M1 = 0;P3M0 = 0x10;
  7.         while(1)
  8.         {
  9.                 uint16_t usTmp;
  10.                 while(usTmp != timer_ms){usTmp = timer_ms;};
  11.                 if(usTmp>=500)
  12.                 {//500ms任务
  13.                         P34 ^= 1;
  14.                         rf_buf[aa]=usTmp;
  15.                         EA = 0;
  16.                         timer_ms = 0;
  17.                         EA = 1;
  18.                         aa++;
  19.                         if(aa>=28)
  20.                         {
  21.                                 aa=0;
  22.                         }
  23.                 }
  24.         }
  25. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:439
  • 最近打卡:2025-06-15 06:17:51
已绑定手机

17

主题

714

回帖

1237

积分

金牌会员

积分
1237
发表于 2024-12-10 22:12:27 | 显示全部楼层
axush*** 发表于 2024-12-10 17:59
上面这样或者下面这样,但是要加volatile声明变量timer_ms,试试。

上面的办法就挺好的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:248
  • 最近打卡:2025-06-15 19:53:00

6

主题

251

回帖

564

积分

高级会员

积分
564
发表于 2024-12-14 09:25:44 | 显示全部楼层

学习了!

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:191
  • 最近打卡:2025-06-15 10:05:52

2

主题

74

回帖

568

积分

高级会员

积分
568
发表于 2024-12-14 11:06:45 | 显示全部楼层

学习到三个专业名词

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:392
  • 最近打卡:2025-06-15 06:54:02

7

主题

286

回帖

1391

积分

金牌会员

积分
1391
发表于 2024-12-14 12:25:30 | 显示全部楼层
学习了
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:75
  • 最近打卡:2025-05-23 10:49:11
已绑定手机

1

主题

4

回帖

343

积分

中级会员

积分
343
发表于 2024-12-21 08:03:33 来自手机 | 显示全部楼层
又懂一个知识点了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-06-15 05:39:40

3

主题

25

回帖

1235

积分

金牌会员

积分
1235
发表于 2024-12-21 09:27:00 | 显示全部楼层

很好的例子,

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 04:26 , Processed in 0.198719 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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