微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR 单片机与GCC 编程之存储器操作

AVR 单片机与GCC 编程之存储器操作

时间:11-19 来源:互联网 点击:
d a horrible death!”;
struct point pt={1,1};
可以将.data 在SRAM 内的开始地址指定给连接器,这是通过给avr-gcc 命令行添加
-Wl,-Tdata,addr 选项来实现的,其中addr 必须是0X800000 加SRAM 实际地址。例如 要将.data 段从0x1100 开始,则addr 要给出0X801100。

三..bss 段

没有被初始化的RAM 区全局或静态变量被分配到此段,在应用程序被执行前的startup过程中这些变量被清零。
另外,.bss 段有一个子段 .noinit , 若变量被指定到.noinit 段中则在startup 过程中不会被清零。将变量指定到.noinit 段的方法如下:
int foo __attribute__ ((section (“.noinit”)));
由于指定到了.noinit 段中,所以不能赋初值,如同以下代码在编译时产生错误:
int fol __attribute__((section(“.noinit”)))=0x00ff;
四..EEPROM 段
此段存储EEPROM变量。
Static unsigned char eep_buffer[3] __attribute__((section(“.EEPROM”)))={1,2,3};
在链接选项中可指定段的开始地址,如下的选项将.noinit 段指定位到RAM存储器
0X2000 地址处。
avr-gcc ... -Wl,--section-start=.noinit=0x802000
要注意的是,在编译时Avr-gcc 将FLASH、RAM 和EEPROM内的段在一个统一的地址空间内处理,flash存储器被定位到0 地址开始处,RAM存储器被定位到0x800000 开始处,EEPROM存储器被定位到0X810000 处。所以在指定段开始地址时若是RAM 内的段或EEPROM内的段时要在实际存储器地址前分别加上0x800000 和0X810000。

除上述四个段外,自定义段因需要而可被定义。由于编译器不知道这类段的开始地址,又称它们为未定义段。必需在链接选项中指定自定义段的开始地址。如下例:
void MySection(void) __attribute__((section(".mysection")));
void MySection(void)
{
printf("hello avr!");
}
链接选项:
avr-gcc ... -Wl,--section-start=.mysection=0x001c00
这样函数MySection 被定位到了FLASH存储器0X1C00 处。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top