在嵌入式C程序中定义数百个双(64位浮点)常量的内存效率最高的方法是什么?请注意,此应用程序受内存限制,我需要尽可能多地保存RAM。
Atmel AVR具有2048B RAM,时钟频率为8MHz。 32K闪光灯。
答案 0 :(得分:2)
在很大程度上,让常量不使用内存的方法是将它们存储在一个文件中并根据需要读取它们。
如果你不能这样做,那么常量必须构成程序的一部分,它们将以某种方式占用内存,无论是在数据段中还是作为指令中的中介。
如果不需要完全精确,您可以将数据减少到float
而不是double
。
一些处理器体系结构提供了在指令中编码简单浮点常量的功能。如果您的目标是此类处理器,则应研究其文档以了解支持的常量。这对于一般数据不太可能有用。
如果数据有某种模式,您可以使用它来根据需要生成部分作为运行时。 (这包括各种形式的压缩和解压缩,这取决于数据中的模式。)显然,这取决于您未在问题中包含的数据的性质。
应该考虑的另一种可能性是您的程序是否需要它使用的所有原始数据,或者是否可以提前执行某些部分工作以减少所需的数据。
否则,总的来说,数据就是数据,它需要占用的空间。
答案 1 :(得分:2)
期待您使用AVRStudio:
如果只想将变量放入闪存,可以使用
#include <avr/pgmspace.h>
const char myString[] PROGMEM = "AT\r";
const float myFloat PROGMEM = 3.1415926535f;
有关放置和阅读(AVR)的更多信息,请参阅 Data in Program Space
不存在一般解决方案,它取决于平台(冯诺依曼或哈佛)和工具链。
有些编译器使用
__attribute__(section(".myFlashSection"))
其他一些人使用像
#pragma SET_CONST_PAGE(ConstArea)
。
还有一些奇怪的事情,比如
#pragma define_section flash_table ".myFlashTable.text" RW
#pragma section flash_table begin
其他人总是将const数据移动到flash部分。
答案 2 :(得分:1)
将其声明为const double array_name[] = { ... };
并期望链接器仅将其存储在闪存中。
请注意,您必须检查地图文件,以确保没有对该ram进行任何复制。