d1d2前辈 你给的例子有个小问题

[复制链接]
2596|4
 楼主| biehoff 发表于 2008-11-29 11:44 | 显示全部楼层 |阅读模式
这样COMMONCALC.O的RO部分在链接时定位在SRAM中。<br />但是这部分代码还需要程序拷贝到SRAM才能执行。下面是main中的部分代码:<br /><br />extern&nbsp;char&nbsp;Load$$SRAM$$Base[];<br />extern&nbsp;char&nbsp;Image$$SRAM$$Base[];<br />extern&nbsp;unsigned&nbsp;int&nbsp;Image$$SRAM$$Length;<br />extern&nbsp;char&nbsp;Image$$SRAM$$Limit[];<br /><br /><br />为什么是&nbsp;声明一个数组呢<br />而不是直接<br />extern&nbsp;char&nbsp;Image$$SRAM$$Base;<br />我知道&nbsp;Image$$SRAM$$Base其实是代表一个地址<br /><br />我用过&nbsp;extern&nbsp;unsigned&nbsp;int&nbsp;Image$$SRAM$$Base<br />然后<br />unsigned&nbsp;int&nbsp;a;<br />a=(unsigned&nbsp;int)Image$$SRAM$$Base;<br /><br />我设置的Image$$SRAM$$Base的值是&nbsp;0x0c008000;<br />最后得到的&nbsp;a&nbsp;不是&nbsp;0x0c008000&nbsp;而是&nbsp;0x0c008000地址处的内容;<br />靠&nbsp;!&nbsp;强制类型转换也没用啊&nbsp;&nbsp;ADS编译器一定要把&nbsp;Image$$SRAM$$Base当指针用&nbsp;改都改不过来<br /><br />当然&nbsp;声明改成<br />extern&nbsp;unsigned&nbsp;int&nbsp;Image$$SRAM$$Base[]<br />unsigned&nbsp;int&nbsp;a;<br />a=(unsigned&nbsp;int)Image$$SRAM$$Base;<br />a就得到值&nbsp;0x0c008000了<br /><br />这个是编译器问题呢&nbsp;还是我C学的不好呢····&nbsp;前辈帮看看<br />
 楼主| biehoff 发表于 2008-11-29 12:14 | 显示全部楼层

RE

我验证过&nbsp;取指针本身值&nbsp;和&nbsp;取指针内容的两种程序<br />unsigned&nbsp;int&nbsp;image[10]={0};&nbsp;&nbsp;这个数组被固定在&nbsp;0x0c008000&nbsp;这点是确定的<br />unsigned&nbsp;int&nbsp;a;<br />unsigned&nbsp;int&nbsp;*p;<br />a=*p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a得到的值是0;<br />a=(unsigned&nbsp;int)p;&nbsp;&nbsp;&nbsp;&nbsp;a得到的值是0x0c008000;<br /><br />怎么用到&nbsp;Image$$SRAM$$Base&nbsp;&nbsp;符号就不行了呢?
 楼主| biehoff 发表于 2008-11-29 12:16 | 显示全部楼层

程序少COPY了一句

unsigned&nbsp;int&nbsp;image[10]={0};&nbsp;&nbsp;这个数组被固定在&nbsp;0x0c008000&nbsp;这点是确定的<br />unsigned&nbsp;int&nbsp;a;<br />unsigned&nbsp;int&nbsp;*p;<br />p=(unsigned&nbsp;int&nbsp;*)image;<br />a=*p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a得到的值是0;<br />a=(unsigned&nbsp;int)p;&nbsp;&nbsp;&nbsp;&nbsp;a得到的值是0x0c008000;<br />
dld2 发表于 2008-11-30 09:01 | 显示全部楼层

回bieh0ff同学

<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;b[10];<br />以上是两个全局变量。编译器设置它们的符号属性:<br />&nbsp;&nbsp;&nbsp;&nbsp;符号名称a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;长度4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;段.bss<br />&nbsp;&nbsp;&nbsp;&nbsp;符号名称b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;长度40&nbsp;&nbsp;&nbsp;&nbsp;段.bss<br />连接器根据以上内容,为符号a和b分配具体的值。<br />&nbsp;&nbsp;&nbsp;&nbsp;对变量a来说,这个值是a的存储地址。<br />&nbsp;&nbsp;&nbsp;&nbsp;对数组b来说,这个值是数组的起始地址。<br />在如下代码中:<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;(unsigned&nbsp;int)a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//编译器把a当作整型变量,把符号a对应的地址下的内容给c。<br />&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;(unsigned&nbsp;int)b;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//编译器把b当作指针变量,把符号b的值给c。<br />可见:<br />&nbsp;&nbsp;&nbsp;&nbsp;是编译器对不同类型的变量进行了不同处理。<br /><br /><br />猜想:<br />&nbsp;&nbsp;&nbsp;&nbsp;Load$$SRAM$$Base是连接器产生的符号。对编译器来说是外部符号。<br />&nbsp;&nbsp;&nbsp;&nbsp;程序中声明Load$$SRAM$$Base变量的方式,决定了编译器处理它的方式。
 楼主| biehoff 发表于 2008-11-30 18:57 | 显示全部楼层

谢谢

<br />谢谢前辈讲解&nbsp;看了看这个图我就明白&nbsp;&nbsp;那个符号该怎么引用了<br />&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;a;<br />&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;b[10];<br />引用&nbsp;a和b&nbsp;的区别&nbsp;&nbsp;&nbsp;一个会得到内容&nbsp;一个会得到地址&nbsp;<br />还是怪我C语言太烂了····
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

138

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部