6851|14

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

变量不能正常赋值,用ARM7和KEIL的朋友进来看一下 [复制链接]

部分C源代码:

void checkFlag(void)
{
  int i;
unsigned char *pc = (unsigned char *)0x0007d000;
unsigned int *pram = (unsigned int *)0x40000000;
  unsigned int *webup =  (unsigned int *)0x00003800;

unsigned int *app =  (unsigned int *)0x00040000;
//上面这条代码,执行后不能正常赋值,如果把上面这条和下面这条位置换一下,一样还是上面这个位置的代码不能正常赋值,但其他位置的均可正常赋值,下面是反汇编代码,大家帮忙看看
unsigned int *uartaddr =  (unsigned int *)0x00001000;

.....


反汇编:
0x00000000  EBFFFFFF  BL        checkFlag(0x00000004)
    9: {
    10:        int i;
0x00000004  E92D47F0  STMDB    R13!,{R4-R10,R14}
    11:        unsigned char *pc            =    (unsigned char *)0x0007d000;      
0x00000008  E3A05A7D  MOV      R5,#0x0007D000
    12:        unsigned int *pram          =    (unsigned int *)0x40000000;  
0x0000000C  E3A07101  MOV      R7,#0x40000000
    13:        unsigned int *webup  =        (unsigned int *)0x00003800;
    14:  
0x00000010  E3A08B0E  MOV      R8,#0x00003800
    15:        unsigned int *app            =    (unsigned int *)0x00040000; ;就这个位置的代码不能正常赋值
0x00000014  BAB0F784  BLT      0xFEC3DE2C
    16:        unsigned int *uartaddr  =        (unsigned int *)0x00001000;
0x00000018  E3A06A01  MOV      R6,#0x00001000
此帖出自ARM技术论坛

最新回复

我以前见过编译器不编译某一行的,后来发现时被优化了对程序没什么影响,楼主这种情况我就不懂了  详情 回复 发表于 2009-9-22 20:52
点赞 关注
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
将0x00040000更换一个别的值尝试一下。
此帖出自ARM技术论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
很有问题,竟然汇编出空指令.当然不能赋值成功了.莫非0x00003800这个空间有古怪?
此帖出自ARM技术论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
换个keil版本编译试试

ps:现在用的是哪个版本的keil?
此帖出自ARM技术论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
这个地址很强大,坐等高手出来解密
此帖出自ARM技术论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

6
 
可以肯定不是地址的问题。

  int i;
unsigned char *pc = (unsigned char *)0x0007d000;
unsigned int *pram = (unsigned int *)0x40000000;
unsigned int *webup =  (unsigned int *)0x00003800;

unsigned int *app =  (unsigned int *)0x00040000;

unsigned int *uartaddr =  (unsigned int *)0x00001000; //当我把这句和上句位置对调后,如下:


  int i; //行1
unsigned char *pc = (unsigned char *)0x0007d000; //行2
unsigned int *pram = (unsigned int *)0x40000000; //行3
unsigned int *webup =  (unsigned int *)0x00003800; //行4

unsigned int *uartaddr =  (unsigned int *)0x00001000;  //行5 //这句放上来,反而赋值不成功

unsigned int *app =  (unsigned int *)0x00040000; //而这句又赋值成功了
现在还没找到问题,我只好找了个临时解决的办法:
我又定义了一个 没用的变量:
unsigned int *temp = (unsigned int *)0x00003800; //把它放在 行4 的下一行,它不能赋值,但它后面的变量都能正常赋值了。

应该不是编译器的问题,我把优化级别设为level 0一样不行。

此帖出自ARM技术论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
IDE环境:


IDE-Version:
礦ision3 V3.90
Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2009

License Information:
Deng Derek
ActionTop
LIC=HN0WF-68H4Y-J66Q9-4XQ41-DGA9D-JA7KA

Tool Version Numbers:
Toolchain:        RealView MDK-ARM  Version: 3.80a
Toolchain Path:    BIN40\
C Compiler:         Armcc.Exe       V4.0.0.524
Assembler:          Armasm.Exe       V4.0.0.524
Linker/Locator:     ArmLink.Exe       V4.0.0.524
Librarian:             ArmAr.Exe       V4.0.0.524
Hex Converter:      FromElf.Exe       V4.0.0.524
CPU DLL:               SARM.DLL       V3.80a
Dialog DLL:         DARMP.DLL       V1.46
Target DLL:             ..\TKScope\UL2ARM_TKSCP_DRV_ARM_for_AGDI.dll       V1.37
Dialog DLL:         TARMP.DLL       V1.46
此帖出自ARM技术论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

8
 
unsigned char *pc = (unsigned char *)0x0007d000; 把这句char 类型改成 int 试试看
此帖出自ARM技术论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
奇怪......
此帖出自ARM技术论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

10
 
编译器追求的是代码执行速度和编译效率。
不知道lz是否在后面的代码里引用过定义的变量?
此帖出自ARM技术论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
手工修改汇编
此帖出自ARM技术论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(高级)

12
 
变量在后面是引用到的。

如果没有引用到,编译器会排除不进行编译的。
此帖出自ARM技术论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

13
 
关闭代码优化,或使用volatile
此帖出自ARM技术论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

14
 
学习了!!
此帖出自ARM技术论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

15
 
我以前见过编译器不编译某一行的,后来发现时被优化了对程序没什么影响,楼主这种情况我就不懂了
此帖出自ARM技术论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表