我知道我可以通过声明“const”将数组强制转换为ARM中的FLASH。但这并不是真正的一系列内容:我希望能够定期写信给它。我有三个大型阵列占据了我所拥有的128kB SRAM中的大约50k,但是我的闪存比我需要的多了一个数量级。如何在不声明const的情况下强制将这三个数组强制转换为FLASH?使用IAR,BTW。
尝试使用__no_init关键字;根据链接器映射文件,这没有任何影响。
答案 0 :(得分:5)
要回答原始问题,您可以编写链接描述来强制任何变量驻留在预定的内存区域(声明它们const
不强制编译器把它放在FLASH中,它只是一个强烈的建议)。
另一方面,过多的FLASH本身并不是将非const
数组保留在flash中的好理由。原因之一是:1)根据芯片的不同,对FLASH存储器的访问速度可能比RAM访问速度慢得多(特别是对于写入)2)FLASH只能重写有限次数:偶尔不会出现问题重写,但如果你的代码不断重写FLASH内存,你可以相当快速地毁掉它。 3)有一些特殊的程序可以写入FLASH(ARM很容易,但它仍然不像写入RAM那么简单)。
答案 1 :(得分:2)
C语言,编译器等无法生成芯片/电路板特定的闪存例程。如果您希望使用闪存页来存储读/写数据,您将必须至少拥有一个页面值和一些读/写例程。您需要有很多这些变量来克服ram的成本和将主副本保存在flash中所需的执行时间。通常,每次将值写入闪存时,都需要读出整个页面,擦除页面,然后在更改了一个项目的同时写回整个页面。现在,如果你知道你的闪存是如何工作的(一般是擦除为1并写入零)你可以读取先前版本,比较差异,如果不需要擦除,那么写一个项目。
如果你没有几十个变量,那么就不要这么做了,不要打扰。您可能希望为此闪存中的每个变量声明一个const偏移量并具有读/写例程
const unsigned int off_items=0x000;
const unsigned int off_dollars=0x004;
...
unsigned int flash_read_nv ( unsigned int offset );
void flash_write_nv ( unsigned int offset, unsigned int data);
所以这段代码使用.data:
items++;
dollars=items*5;
使用您希望将变量保留在闪存中的愿望变为:
unsigned int ra,rb;
ra= flash_read_nv(off_items);
rb= flash_read_nv(off_dollars);
ra++;
rb=ra*5;
flash_write_nv(off_items,ra);
flash_write_nv(off_dollars,ra);
当然,闪存写入需要数百到数千个时钟周期才能执行。另外,根据闪存页面大小,需要64,128或256字节的RAM(或更多)。
答案 2 :(得分:1)
信不信由你,在查看如何使用AVR ARM编译器在闪存中存储数据时,此页面是最好的东西。
在手册的第359页(编译器的v7.50附带的那个)中,确实将其显示为将数据放入flash中的方法:
#define FLASH _Pragma("location=\"FLASH\"")
然而,在手册的第332页,它说:
"声明为const的静态和全局对象在ROM中分配。"
我测试了它,似乎IAR编译器不需要编译指示,因为指定const已经将它放入flash中(如原始问题中所述)。
从其他答案来看,OP似乎并不真的想使用闪存。如果像我这样的人来到这个页面来弄清楚如何使用AVR ARM编译器在闪存中存储数据,我希望我的答案可以节省一些时间。
答案 3 :(得分:0)
在IAR中,您可以按如下方式声明数组:
__root __no_init const uint8_t myVect[50000] @0x12345678
当然,0x12345678是FLASH中的地址。