随着单片机功能的拓展,协议栈or算法因此变得越来越庞大,此时内部RAM是不能满足需求了,必须将变量定义在外部RAM(如SDRAM)。
那么如何将变量定义在外部RAM呢?
1.定义变量至外部存储区域
例
:定义一个数组比如buf[],让数组的首地址指向特定的SRAM地址,比如0XC0000000
方法1 直接定义
char buf[2048]__attribute__((at(0XC0000000)));
定义buf在起始地址为0xC0000000的连续区域
,这种方法简单高效,但是对于数量很多的变量,就麻烦不实用了。
额外使用补充:
如果指定的地址已经被其他变量占用,就会发生冲突。如果如果有冲突,keil会提示:
Error: L6971E: metering_module.o(.data) type RW incompatible with main.o(.ARM.__AT_0x20000000) type ZI in er RW_IRAM1.
对于这类报错,可以在xxx.map
中看RAM用到多少,哪里有空间。
例:
在最后地址0x20005f38后面再指定。
例如:uint8_t array[10] attribute((at(0x20006000)))
,这样就OK了
方法2 通过链接脚本定义
1.修改链接标本,定义一块区域
取消1处勾选,自定义链接脚本,点击2处编辑
定义一片区域,如上图(sdram_area)
2.定义宏定义
#define SDRAM_AREA_ATTRIBUTES __attribute__ ((section("sdram_area")))
3.定义变量
char buf[2048]SDRAM_AREA_ATTRIBUTES ;
char buf2[2048]SDRAM_AREA_ATTRIBUTES ;
此时变量已经定义至指定区域。相较于方法1,无需自己严格计算绝对地址,更加便捷
。