在C中获取__regvar变量的地址

时间:2014-04-02 07:38:45

标签: c pointers cpu-registers iar

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

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

例如:

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

Pointer = AddressOfGlobal1

我可以通过添加1(1个字节)来修改所有寄存器

问题在于我无法获取该变量的地址:

__no_init __regvar unsigned char ms_flags@ 4; 
__no_init __regvar unsigned char tb_flags@ 5; 
__no_init __regvar unsigned char st_flags@ 6; 
__no_init __regvar unsigned char dp_flags@ 7; 


int myfunction(){


 unsigned char* pointer     = 0;

    pointer = &ms_flags;
}    

获得以下输出:

错误[Pe513]:类型为“unsigned char __regvar *”的值无法分配给“unsigned char *”类型的实体C:\ Users \ Alex \ Desktop \ CentroStirling \ Progreso \ MSUIAR \ app \ init。 c 39

1 个答案:

答案 0 :(得分:4)

你做不到;根据定义,存储在寄存器中的值没有地址。这就是重点,你要通过篮球来实现目标。

C99标准草案在§6.5.3.2中说:

  

一元&运算符的操作数应该是函数指示符,结果   一个[]或一元*运算符,或一个指定不是一个对象的左值   位字段,不使用register存储类说明符声明。

如果我们剥离特定于编译器的内容,我很确定__regvar以某种方式暗示register