因为原5310片子内存不够,所以将平台换为FR6989系列。其解决的问题是:在程序运行过程中使用一个超级大数组(50KB)。第一次分配我们是这么干的:
1,将FRAM中的50KB(0x10040-23FFF)地址分配成内存使用:在.xcl文件里(.xcl文件在IAR的配置文件中)将-Z(DATA)DATA20_I,DATA20_Z,DATA20_N移出内存分配区域至FRAM分配命令区域,并改为-Z(DATA)DATA20_I,DATA20_Z,DATA20_N=10040-23FFF.
2,在代码中,大区域数组定义为__data20 int a[];
3,上述两步的意思是,将地址为20位的全局数据放置在0x10040-23FFF的位置,并作为内存使用。
结果是:编译通过,但分配失败,将分配区域改为0x10040-16FFF即可使用,但数组大小只能为1KB。
百思不得其解,求助于国内某代理商技术支持部,总算搞定,解决方法如下:
1,不需要修改.xcl文件内存部分的分配,而需要在FRAM设置中添加如下地址:
Read/write data in FRAM
//
-Z(CONST)DATA16_P,DATA20_P=4400-FF7F,10040-1C800
-Z(DATA)DATA16_HEAP+_DATA16_HEAP_SIZE
-Z(DATA)DATA20_HEAP+_DATA20_HEAP_SIZE
2,将大区域数组使用写入固定地址的方式(@或#pragma location)存入指定的FRAM。
#pragma location = 0x10040
__no_init VSampleBuf sampAcBuf;
其思想是:FRAM铁电存储本身就具备了类似SRAM的特性,所以直接往该区域写大数据即可,在程序当中将其直接作为内存使用。
原文:http://www.cnblogs.com/dida-zzy/p/5161233.html