AVR单片机如何把变量定义在指定的地址或地址空间?
编译环境:ICCAVR例如,我想把变量i定义在0x1000这个地址应该怎么实现?又如,我想把数组array[100]定义在0x1002起始的地址,应该如何实现?请高手帮帮...
编译环境:ICCAVR
例如,我想把变量i定义在0x1000这个地址应该怎么实现?
又如,我想把数组array[100]定义在0x1002起始的地址,应该如何实现?
请高手帮帮忙,谢了。 展开
例如,我想把变量i定义在0x1000这个地址应该怎么实现?
又如,我想把数组array[100]定义在0x1002起始的地址,应该如何实现?
请高手帮帮忙,谢了。 展开
展开全部
第一种办法,通常用来定义寄存器:
const volatile unsigned char *p = (unsigned char *)0x1000;
其实你把p指向0x1002就好了。指针本身就可以作为数组的头,你完全可以用p[0]~p[100]来访问这100个数据。
第一种办法有一个毛病,就是你虽然把指针指向了绝对地址,但是这个地址是不受保护的,编译器可以将其他变量也安排到那个地址上,导致你的变量内容随时可能被篡改。好处就是,你可以用这种办法随时给寄存器改个名字,或者其他变量也指向同一段内存,在两个函数之间通过这段共享内存来传递信息。
第二种办法:
用#pragma编译指令。
#pragma abs_address:0x1002
unsigned char array[100];
#pragma end_abs_address
前面的pragma abs_address高速编译器,下面的变量或者函数不要随便分配存储器,要把它们安排在我指定的位置,就是0x1002开始的内存区域。后面的end_abs_address告诉编译器,好了,剩下的内存由你来分配好了,我不做特殊要求。这样,你的变量是被保护起来的,其他的程序段无法访问。但是这段存储器也无法作为共享内存来在程序之间传递信息,因为这段存储器已经被“保护”起来了。只能通过数组array来访问,在array作用域之外的地方是访问不到的。
注意,我这个冒号用的是中文的冒号,在程序里要把它换成英文的。在网上英文冒号看不清楚。
const volatile unsigned char *p = (unsigned char *)0x1000;
其实你把p指向0x1002就好了。指针本身就可以作为数组的头,你完全可以用p[0]~p[100]来访问这100个数据。
第一种办法有一个毛病,就是你虽然把指针指向了绝对地址,但是这个地址是不受保护的,编译器可以将其他变量也安排到那个地址上,导致你的变量内容随时可能被篡改。好处就是,你可以用这种办法随时给寄存器改个名字,或者其他变量也指向同一段内存,在两个函数之间通过这段共享内存来传递信息。
第二种办法:
用#pragma编译指令。
#pragma abs_address:0x1002
unsigned char array[100];
#pragma end_abs_address
前面的pragma abs_address高速编译器,下面的变量或者函数不要随便分配存储器,要把它们安排在我指定的位置,就是0x1002开始的内存区域。后面的end_abs_address告诉编译器,好了,剩下的内存由你来分配好了,我不做特殊要求。这样,你的变量是被保护起来的,其他的程序段无法访问。但是这段存储器也无法作为共享内存来在程序之间传递信息,因为这段存储器已经被“保护”起来了。只能通过数组array来访问,在array作用域之外的地方是访问不到的。
注意,我这个冒号用的是中文的冒号,在程序里要把它换成英文的。在网上英文冒号看不清楚。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询