gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:56 25 4
gpt4 key购买 nike

我有一些常量数据要存储在 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
}

然后我将其创建并初始化为全局变量:

const objdef def_instance = { 2, 3, function, array, NULL };

然而,尽管开头有 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

string_table 按预期在 ROM 中。关键在于:objdef 的实例被放入 ROM 中,直到 string_table 中的一个值被分配给 const void* 字段。之后结构实例被移动到 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

尽管有 const void* 赋值,但 objdef 的那些实例仍被放置在 ROM 中。我不知道为什么这很重要。

我开始怀疑 Dan 是对的,我们的配置在某处搞砸了。

最佳答案

我假设您有一个将 RAM 和 ROM 部分分开的分散文件。您想要做的是使用属性指定您的结构将放置在哪个部分,或者将其放置在它自己的目标文件中,然后在您希望它位于分散文件中的部分中指定。

__attribute__((section("ROM"))) const objdef def_instance = { 2, 3, function, array };

C 的“const”关键字并不会真正导致编译器将某些内容放入文本或 const 部分。它只允许编译器警告您试图修改它。获取指向 const 对象的指针、将其转换为非 const 对象并写入是完全有效的,并且编译器需要支持这一点。

关于c++ - 将结构存储在 ARM 设备的 ROM 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4962788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com