ushe0874 发表于 2009-7-4 00:15:31

绝对存储器访问

C编程语言并不支持明确地提定一个静态或全部变量的存储位置。有三种方法可以明确地参考存储器位置:
(1)绝对存储器访问宏
(2)连接器位置控制
(3)关键字_at_
Absolute Memory Access Macros
可以使用作为Cx51库一部分的绝对存储器访问宏。使用以下宏可以直接访问存储器区
CBYTE      DBYTE      PBYTE      XBYTE      CWORDDWORD
PWORDXWORD
CBYTE的宏定义为:
#define CBYTE ((unsigned char volatile code *)0)
可以这样使用:
rval = CBYTE ;
读出地下地0002h中的字节内容
DBYTE的定义为:
#define DBYTE ((unsigned char volatile idata *) 0)
可以这样使用:
rval = DBYTE ;
DBYTE = 5;
(其他定义及用法的见附)
Linker Location Controls
第二种方法是在一个独立的C模块中声明这些变量,并且使用BL51连接器/定位器的定位指令来指定绝对地址。
在以下例子中,假定有一个结构体名字为alarm_control,要把它定位到xdata区的地址2000h。首先在一个源文件ALMCTRL.C中声明这个结构体:
struct alarm_st {
unsigned int alarm_number;
unsigned char enable flag;
unsigned int time_delay;
unsigned char status;
};
xdata struct alarm_st alarm_control;
Cx51编译器为ALMCTRL.C生成一个目标文件,并且包含了一放在xdata存储区的变量段。因为它在这个模块中只有一个变量,那么alarmcontrl是这个段中仅有的变量,这个段名字为?XD?ALMCTRL.
BL51连接器/定位器允许使用定位指令指定任意一个段的基地址。则可以通过以下指令指定变量的位置:
BL51 … almctrl.obj XDATA(?XD?ALMCTRL(2000h))
将变量定位于code, xdata, pdata, idata和data区域的指令见附录
The _at_ Keyword
第三种方法是在声明变量时使用关键字_at_。以下是例示:
struct link {
struct link idata *next;
char code *test;
};
idata struct link list   _at_ 0x40;    /* list at idata 0x40 */
xdata char text      _at_ 0xE000; /* array at xdata 0xE000 */
xdata int i1             _at_ 0x8000; /* int at xdata 0x8000 */
void main ( void ) {
link.next = (void *) 0;
i1         = 0x1234;
text    = a
}
Debugging
缺省的,Cx51编译器使用Intel目标格式(OMF-51)做为目标文件的格式并生成全部的符号信息。所有兼容的调试器都可以用来进行程序调试。DEBUG控制指令地目标文件中嵌入调试信息。而且,OBJECTEXTEND控制指令在目标文件中嵌入附加的变量类型信息。这个目标文件允许在使用特定的调试器的时候变量和结构体的类型显示
Cx51使用OMF-2目标文件格式。当使用OMF2指令,C51编译器也使用OMF2格式。OMF2格式需要使用扩展的LX51边接器/定位器,而不能使用BL51连接器/定位器。OMF2目标文件格式提供了精确的调试信息,μVision2调试器和其他一些调试器都支持这一格式
页: [1]
查看完整版本: 绝对存储器访问