2014-04-02 45 views
0

目前我正在研究一个使用AVR ATMega8微处理器的嵌入式系统的工作。由于它有一个非常小的内存区域,我试图使用__regvar命令将一些全局变量存储到寄存器中。获取C_变量__regvar的地址

我需要从多个文件访问这些变量,而不是使所有这些变量都是外部的,我曾考虑过只使用外部指针指向第一个指针,并通过偏移量修改所有变量。

例如:

全球1 - > $的Reg4 全球2 - > $ REG5 全球3 - > $ REG6 全球4 - > $ REG7

指针= AddressOfGlobal1

有了这样我就可以通过添加1(1字节)修改所有寄存器

的问题是,我不能让这个变量的地址:

__no_init __regvar unsigned char [email protected] 4; 
__no_init __regvar unsigned char [email protected] 5; 
__no_init __regvar unsigned char [email protected] 6; 
__no_init __regvar unsigned char [email protected] 7; 


int myfunction(){ 


unsigned char* pointer  = 0; 

    pointer = &ms_flags; 
}  

得到以下输出:

错误[Pe513]:“*无符号字符__regvar”不能被分配给类型的实体类型的值“无符号字符*” C:\用户\亚历克斯\ Desktop \ CentroStirling \ Progreso \ MSUIAR \ app \ init.c 39

+2

我不太了解这个编译器,但是...如果变量总是存储在一个寄存器中,它怎么能有一个地址? – rodrigo

+0

哦......非常愚蠢的问题。对不起,我有点困惑 – Aldridge1991

回答

4

你不能这样做;根据定义,存储在寄存器中的值没有地址。这就是关键,你要通过篮球来实现。

草案C99标准说,在§6.5.3.2:

一元&操作者的操作数应是一个功能指示器,其结果一个[]或一元*操作者的 ,或左值它指定一个不是 位字段的对象,并且不用register存储类说明符声明。

如果我们剥离编译器的细节,我敢肯定__regvar不知何故意味着register

+0

是的,这是完全正确的。 – Aldridge1991