OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2571|回复: 7

为什么keil里连着对变量赋值两次直接执行第二次

[复制链接]

21

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-6-28
在线时间
33 小时
发表于 2019-10-15 15:52:39 | 显示全部楼层 |阅读模式
1金钱
        for(;ram_address_back <= Ram_address; ram_address_back++)
        {
                if(*ram_address_back==0x00000000)
                {
                        *ram_address_back =0x55555555;
                        back=*ram_address_back;
                        back=0x00000000;
                }
                else {RAM_check_flag=FALSE;break;        }
        }


如上图,在KEIL中,如果我这样按步运行仿真back=*ram_address_back这个语句不运行,直接运行back=0x00000000;但我如果去掉back=0x00000000这条语句的话back=*ram_address_back;可以运行,这是为什么?求大佬解答

最佳答案

查看完整内容[请看2#楼]

改为截图所示再去看下,不行的话就按照上面楼主说的方法弄
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-10-15 15:52:40 | 显示全部楼层
改为截图所示再去看下,不行的话就按照上面楼主说的方法弄
1.png
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
922
金钱
922
注册时间
2018-7-18
在线时间
385 小时
发表于 2019-10-15 16:22:48 | 显示全部楼层
应为编译器编译时会对你的代码进行优化
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
922
金钱
922
注册时间
2018-7-18
在线时间
385 小时
发表于 2019-10-15 16:24:13 | 显示全部楼层
如果要避免这样的操作 可以在变量声明是加上关键字 volatile
回复

使用道具 举报

21

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-6-28
在线时间
33 小时
 楼主| 发表于 2019-10-15 16:24:26 | 显示全部楼层
wwhh 发表于 2019-10-15 16:22
应为编译器编译时会对你的代码进行优化

那这个优化能改吗?
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
922
金钱
922
注册时间
2018-7-18
在线时间
385 小时
发表于 2019-10-15 16:28:14 | 显示全部楼层
hyl88099 发表于 2019-10-15 16:24
那这个优化能改吗?

定义变量时加上volatile关键字!
回复

使用道具 举报

21

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-6-28
在线时间
33 小时
 楼主| 发表于 2019-10-16 09:52:44 | 显示全部楼层
wwhh 发表于 2019-10-15 16:28
定义变量时加上volatile关键字!

哦哦,懂了,可是我为什么加上关键字后程序都不能仿真了,能否帮我看下
  bool RAM_check_flag;
   u32 *ram_address = (u32 *) 0x20000030;   
         u32 *ram_address_back = (u32 *) 0x20000030;   
        static u32 *Ram_address = (u32 *) 0x20000fff;   
        volatile u32 back;
void RAM_check(void)
{

        for(;ram_address <= Ram_address; ram_address++)
        {       
                *ram_address =0x00000000;
        }
                        back=0x11111111;
                        back=0x00000000;
        for(;ram_address_back <= Ram_address; ram_address_back++)
        {
        if(*ram_address ==0xffffffff)
                        RAM_check_flag=TRUE;
        else
                        RAM_check_flag=FALSE;break;
         }
}

在全部赋完0后,到这一句back=0x11111111;仿真就停止了
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
922
金钱
922
注册时间
2018-7-18
在线时间
385 小时
发表于 2019-10-16 10:36:48 | 显示全部楼层
hyl88099 发表于 2019-10-16 09:52
哦哦,懂了,可是我为什么加上关键字后程序都不能仿真了,能否帮我看下
  bool RAM_check_flag;
   u32 ...

.........这就不知道了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 23:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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