打印
[ZLG-ARM]

这两个涵数有什么区别?

[复制链接]
1492|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunny_jgp|  楼主 | 2007-9-11 14:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, ADDR, DDR, ui, TE

原涵数:
uint16  ReadFromNet(uint8 ADDR_16)
{
    uint16 temp;
temp=(*((volatile unsigned short *)NET_BASE_ADDR+ADDR_16));//0x83400000
    return (temp);
}
改成这样就不行:
uint16  ReadFromNet(uint8 ADDR_16)
{
  uint16 temp;
uint32 address;
address=NET_BASE_ADDR+ADDR_16;
temp=(*((volatile unsigned short *)address));//0x83400000
    return (temp);
}
谁清楚的解译一下,谢谢!

相关帖子

沙发
ayb_ice| | 2007-9-11 14:37 | 只看该作者

address=NET_BASE_ADDR+ADDR_16;可能已经溢出了...

使用特权

评论回复
板凳
sunny_jgp|  楼主 | 2007-9-11 14:48 | 只看该作者

我还是不能理解

我觉得是不应该溢出的,NET_BASE_ADDR是个常数值,值为:0x83400000,而ADDR_16是一个字节,相加不会溢出吧!这个和temp=(*((volatile unsigned short *)NET_BASE_ADDR+ADDR_16));有多大区别;我还是不能理解

使用特权

评论回复
地板
ruraliter| | 2007-9-11 19:33 | 只看该作者

建议你反汇编试一试

你这是C语言,最后都要编译成汇编语言,建议你在编译的时候,同时生成反汇编代码,其中的内存访问方式一目了然
个人认为,没有区别,不过没有做过验证

使用特权

评论回复
5
luhuaren| | 2007-9-11 21:29 | 只看该作者

re

uint16  ReadFromNet(uint8 ADDR_16)
{
  uint16 temp;
uint32 address;
address= (uint32)(NET_BASE_ADDR+ADDR_16);
temp=(*((volatile unsigned short *)address));//0x83400000
    return (temp);
}


uint16  ReadFromNet(uint8 ADDR_16)
{
  uint16 temp;
uint32 address;
address= (NET_BASE_ADDR+(uint32)ADDR_16);
temp=(*((volatile unsigned short *)address));//0x83400000
    return (temp);
}

这样试验一下,我没看汇编出来的代码。。。

使用特权

评论回复
6
wlsui| | 2007-9-11 23:53 | 只看该作者

Re:


原涵数:
uint16  ReadFromNet(uint8 ADDR_16)
{
    uint16 temp;
temp=(*((volatile unsigned short *)(NET_BASE_ADDR+ADDR_16)));//0x83400000//注意NET_BASE_ADDR+ADDR_16加了()
    return (temp);
}
与下面应该是等价的:
uint16  ReadFromNet(uint8 ADDR_16)
{
  uint16 temp;
uint32 address;
address=NET_BASE_ADDR+ADDR_16;
temp=(*((volatile unsigned short *)address));//0x83400000
    return (temp);
}
 

使用特权

评论回复
7
sunny_jgp|  楼主 | 2007-9-12 09:18 | 只看该作者

我把各自汇编也贴上来了

uint16 readRegister(unsigned char address)                                                                                       
{  
 uint16 temp;
 uint32 addr;
 addr=(uint32)(c_rtl_address+address);
 temp=(*((volatile unsigned short *) addr));
 //temp=(*((volatile unsigned short *) c_rtl_address+address));//0x83400000
    return (temp);
 }

[0xe28004c0] * add      r0,r0,#0xc0000000
[0xe24005f3]   sub      r0,r0,#0x3cc00000
[0xe1d000b0]   ldrh     r0,[r0,#0]
[0xe1a0f00e]   mov      pc,r14

uint16 readRegister(unsigned char address)                                                                                       
{  
 uint16 temp;
 temp=(*((volatile unsigned short *) c_rtl_address+address));//0x83400000
    return (temp);
 }
 
[0xe59f17d8] * ldr      r1,0x80002654 ; = #0x83400000
[0xe1a0c080]   mov      r12,r0,lsl #1
[0xe19100bc]   ldrh     r0,[r1,r12]
[0xe1a0f00e]   mov      pc,r14

我是用AXD单步设置断点,考下汇编
c_rtl_address是个常数值:OX83400000;在汇编中看不出,可以肯定的说下面运行的结果是对的,上面是错的,我用串口监控了数据;
很感谢各位的回复,谢谢

使用特权

评论回复
8
dld2| | 2007-9-12 09:57 | 只看该作者

晕倒

一个常数加1,就是加1.
一个指针加一,地址加多少是由这个指针指向的类型决定的。
如果这个指针是指向short的指针,指针加一,地址是加二。

基础C语言啊。

使用特权

评论回复
9
sunny_jgp|  楼主 | 2007-9-12 10:08 | 只看该作者

THANKS

谢谢楼上提醒!
uint16 readRegister(unsigned char address)                                                                                       
{  
 uint16 temp;
 uint32 addr;
 addr=(c_rtl_address+address*2);
 temp=(*((volatile unsigned short *)addr));
 //temp=(*((volatile unsigned short *) c_rtl_address+address));//0x83400000
    return (temp);
 }
[0xe59f17d8] * ldr      r1,0x80002654 ; = #0x83400000
[0xe0810080]   add      r0,r1,r0,lsl #1
[0xe1d000b0]   ldrh     r0,[r0,#0]
[0xe1a0f00e]   mov      pc,r14


现在运行结果正确了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

33

帖子

1

粉丝