目前我正在为一个嵌入式系统工作,我们正在使用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
答案 0 :(得分:4)
你做不到;根据定义,存储在寄存器中的值没有地址。这就是重点,你要通过篮球来实现目标。
C99标准草案在§6.5.3.2中说:
一元
&
运算符的操作数应该是函数指示符,结果 一个[]
或一元*
运算符,或一个指定不是一个对象的左值 位字段,不使用register
存储类说明符声明。
如果我们剥离特定于编译器的内容,我很确定__regvar
以某种方式暗示register
。