论坛风格切换切换到宽版
  • 4714阅读
  • 21回复

请问:如何确定c语言中的变量或常量的位置? [复制链接]

上一主题 下一主题
离线BG4ABM
 
发帖
1139
只看楼主 倒序阅读 0楼 发表于: 2006-10-14
以前用汇编时寄存器的位置都在书上查得到,现在刚学c,碰到这么个问题:在程序中定义了变量或常量后,无法确定它们在单片机中位置,哪位知道如何确定吗?
离线loverslcn
发帖
621
只看该作者 1楼 发表于: 2006-10-14
if(compiler == keil51) {
  use("*.src");
}
else{
  printf( downstaire(1) );
}
离线BG4ABM
发帖
1139
只看该作者 2楼 发表于: 2006-10-14
楼上说的我不明白,我是说想在keil软件中查看这些变量或常量的值,但不知道它们的地址。
离线BG6AGB
发帖
915
只看该作者 3楼 发表于: 2006-10-14
简单的就是debug的时候把鼠标悬停在你想看的变量上面

要同时监视多个就在开始debug后选择view   watch&call stack window
在里面添加你想监视的变量名
离线子规
发帖
46
只看该作者 4楼 发表于: 2006-10-14
如图所示,在指令行输入变量名字后回车即可查看,也可给变量赋值
离线BG4ABM
发帖
1139
只看该作者 5楼 发表于: 2006-10-14
再请问:在c语言中,这些变量和常量的位置是系统自己确定的吗?可以人为指定吗?
离线子规
发帖
46
只看该作者 6楼 发表于: 2006-10-14
是自动分配的,这就是高级语言的优势之一,不用人为指定
用c语言不要用汇编的那套思维逻辑
在线BG4UVR
发帖
11288
只看该作者 7楼 发表于: 2006-10-14
'
再请问:在c语言中,这些变量和常量的位置是系统自己确定的吗?可以人为指定吗?
'

可以人为指定,但没有必要。
离线BG4ABM
发帖
1139
只看该作者 8楼 发表于: 2006-10-14
在c中是不是有这样的规定:如果定义了一个常量,就会分配到rom中,而定义了一个变量,就会分配在ram中?
在线BG4UVR
发帖
11288
只看该作者 9楼 发表于: 2006-10-14
'
在c中是不是有这样的规定:如果定义了一个常量,就会分配到rom中,而定义了一个变量,就会分配在ram中?
'

也不算是规定,只是结果实际上一般的确是这样的。
离线BG4ABM
发帖
1139
只看该作者 10楼 发表于: 2006-10-15
我今天用c写了个小程序,用4楼和5楼所说的方法查看了变量,结果发现看到的都是变量的值,而不是变量的地址,我本来是想问大家如何才能看到变量或常量的地址,现在继续请教。
离线BG6AGB
发帖
915
只看该作者 11楼 发表于: 2006-10-16
keil怎么直接得到我好像没试过,不过可以用程序通过指针的方式获得.
定义一个unsigned long point;

如果定义的量是单个的,如定义了temp;
则用   point=&temp;得到temp的地址,
如果定义的量是数组,如定义了temp[];
则用   point=temp;得到数组的首地址.

注意截取其低2个字节.注意是在ram空间还是rom空间.

另外,对于c语言,你知道变量或常量的地址有什么必要么?高级语言的好处就是不用考虑这些东西了啊~
离线bg5baw
发帖
698
只看该作者 12楼 发表于: 2006-10-16
在51中好象不好准确定义,在pic单片机的c中就可以把自己需要的寄存器定义在ram的一个地址上。如:static volatile bit      a111      @ (unsigned)&abc*8+6;
static volatile bit      a112      @ (unsigned)&abc*8+5;
static volatile bit a113 @ (unsigned)&abc*8+4;
static volatile bit      a114      @ (unsigned)&abc*8+3;
static volatile bit a115      @ (unsigned)&abc*8+2;
static volatile bit a116      @ (unsigned)&abc*8+1;
static volatile bit      a117      @ (unsigned)&abc*8+0;
在线BG4UVR
发帖
11288
只看该作者 13楼 发表于: 2006-10-16
'
在51中好象不好准确定义,在pic单片机的c中就可以把自己需要的寄存器定义在ram的一个地址上。如:static volatile bit      a111      @ (unsigned)&abc*8+6;
static volatile bit      a112      @ (unsigned)&abc*8+5;
static volatile bit a113 @ (unsigned)&abc*8+4;
static volatile bit      a114      @ (unsigned)&abc*8+3;
static volatile bit a115      @ (unsigned)&abc*8+2;
static volatile bit a116      @ (unsigned)&abc*8+1;
static volatile bit      a117      @ (unsigned)&abc*8+0;
'

51也可以

unsigned char test _at_ 0x30;

不过,这没啥用啊
离线BG6AGB
发帖
915
只看该作者 14楼 发表于: 2006-10-16
the _at_ keyword
the third method of accessing absolute memory locations is to use the _at_
keyword when you declare variables in your c source files. the following
example demonstrates how to locate several different variable types using the
_at_ keyword.
struct link {
struct link idata *next;
char code *test;
};
struct link list idata _at_ 0x40; /* list at idata 0x40 */
char xdata text[256] _at_ 0xe000; /* array at xdata 0xe000 */
int xdata i1 _at_ 0x8000; /* int at xdata 0x8000 */
void main ( void ) {
link.next = (void *) 0;
i1 = 0x1234;
text [0] = 'a'
}
refer to “absolute variable location” on page 104 for more information about
the _at_ keyword.
note
if you use the _at_ keyword to declare a variable that accesses an xdata
peripheral, you may require the volatile keyword to ensure that the c compiler
does not optimize out necessary memory accesses.

上面是cx51 compiler
optimizing c compiler and library reference
for classic and extended 8051 microcontrollers
里面关于_at_的说明

应该是可以用于总线外扩方式下某些特殊器件的寻址.
虽然我从来没有实际使用过这种方式.不知道说的对不对
哪位有这种方式的例程,发上来看看啊~
看实际运用中使怎么用的~~~
在线BG4UVR
发帖
11288
只看该作者 15楼 发表于: 2006-10-16
xdata xxx _at_ 确实可以用于外部设备寻址。
离线BD0AAI
发帖
3050
只看该作者 16楼 发表于: 2006-10-16
有什么必要知道变量的地址?
离线BG4ABM
发帖
1139
只看该作者 17楼 发表于: 2006-10-16
'
有什么必要知道变量的地址?
'
我初学c语言,特别想知道编译后这些变量或常量的位置是否和资料上说的一样,比如,资料上说用code就会定义在rom中,如果不知道地址到哪里去找啊?
离线BG6AGB
发帖
915
只看该作者 18楼 发表于: 2006-10-16
'
我初学c语言,特别想知道编译后这些变量或常量的位置是否和资料上说的一样,比如,资料上说用code就会定义在rom中,如果不知道地址到哪里去找啊?
'

360度后空翻晕倒,天哪,你可以看 build之后的输出信息啊,
类似于这样子:
program size: data=83.7 xdata=27 code=7619
creating hex file from "test_project"...

上面data 就是片内ram区,xdata就是片内扩展的ram区,code就是rom区

调试的时候把定义语句注释掉,或者改动一下定义,然后看编译的结果,不就知道定义的对不对了~
离线BG4ABM
发帖
1139
只看该作者 19楼 发表于: 2006-10-16
终于在一本书上找到了怎样查看变量和常量地址的方法了:在编译后的文件中有一个后缀.m51的文件,只要打开这个文件就可以看到所有的变量和常量的地址了。