将结构存储在ARM设备的ROM中

dan*_*n78 5 c++ memory arm

我有一些常量数据,我想存储在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是对的,而且我们的配置在某个地方搞砸了.

Tho*_*ews 1

您始终可以尝试使用汇编语言。

使用语句放入信息DATA并公布(公开)数据的起始地址。

根据我的经验,大型只读数据在源文件中声明为static const. 源文件中的一个简单的全局函数将返回数据的地址。