我有一些常量数据,我想存储在ROM中,因为它有相当数量,我正在使用内存受限的ARM7嵌入式设备.我试图使用看起来像这样的结构来做到这一点:
struct objdef
{
int x;
int y;
bool (*function_ptr)(int);
some_other_struct * const struct_array; // array of similar structures
const void* vp; // previously ommittted to shorten code
}
Run Code Online (Sandbox Code Playgroud)
然后我创建并初始化为全局变量:
const objdef def_instance = { 2, 3, function, array, NULL };
Run Code Online (Sandbox Code Playgroud)
然而,尽管const在开始时这会占用相当多的RAM .更具体地说,它显着增加了RW数据量,并最终导致设备在创建足够实例时锁定.
我正在使用uVision和ARM编译器,以及RTX实时内核.
有人知道为什么这不起作用或者知道在ROM中存储结构化异构数据的更好方法吗?
更新
谢谢大家的回答,并为不早点回复你们而道歉.所以这是迄今为止的分数和我的一些额外的观察.
可悲的是,__attribute__对RAM与ROM的影响为零,同样如此static const.我还没有时间尝试组装路线.
不过,我的同事和我发现了一些更不寻常的行为.
首先,我必须注意,为了简单起见,我没有提到我的objdef结构包含一个const void*字段.该字段有时会从定义为的字符串表中分配一个值
char const * const string_table [ROWS][COLS] =
{
{ "row1_1", "row1_2", "row1_3" },
{ "row2_1", "row2_2", "row2_3" },
...
}
const objdef def_instance = { 2, 3, function, array, NULL };//->ROM
const objdef def_instance = { 2, 3, function, array, string_table[0][0] };//->RAM
Run Code Online (Sandbox Code Playgroud)
string_table按预期在ROM中.这里是踢球者:objdef获取放入ROM的实例,直到将其中一个值string_table分配给该const void*字段.之后,struct实例被移动到RAM.
但什么时候string_table改为
char const string_table [ROWS][COLS][MAX_CHARS] =
{
{ "row1_1", "row1_2", "row1_3" },
{ "row2_1", "row2_2", "row2_3" },
...
}
const objdef def_instance = { 2, 3,function, array, NULL };//->ROM
const objdef def_instance = { 2, 3, function, array, string_table[0][0] };//->ROM
Run Code Online (Sandbox Code Playgroud)
objdef尽管有这种情况,这些实例仍被放入ROM中const void*.我不知道为什么这很重要.
我开始怀疑Dan是对的,而且我们的配置在某个地方搞砸了.
您始终可以尝试使用汇编语言。
使用语句放入信息DATA并公布(公开)数据的起始地址。
根据我的经验,大型只读数据在源文件中声明为static const. 源文件中的一个简单的全局函数将返回数据的地址。