我有一些恒定的数据,我想存储在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
}然后我将其创建并初始化为globals:
const objdef def_instance = { 2, 3, function, array, NULL };然而,这占用了相当多的内存,尽管const在一开始。更具体地说,它显着地增加了RW数据量,并最终导致设备在创建足够多的实例时锁定。
我使用uVision和ARM编译器,以及RTX实时内核.
有人知道为什么这不工作,或知道更好的方法存储结构化的异构数据ROM?
更新
谢谢大家的回答,也很抱歉没有早点和你们联系。这是到目前为止的分数和我的一些额外的观察。
可悲的是,__attribute__对内存和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] };//->RAMstring_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] };//->ROMobjdef的这些实例被放置在ROM中,尽管const void*进行了访问。我不知道这有什么关系。
我开始怀疑Dan是对的,我们的配置在某个地方搞砸了。
发布于 2011-02-10 21:53:44
我假设您有一个分散文件,它将您的RAM和ROM部分分开。您想要做的是指定您的结构,并为它将要放置的部分指定一个属性,或者将其放置在它自己的对象文件中,然后在您希望它位于散文件的部分中指定它。
__attribute__((section("ROM"))) const objdef def_instance = { 2, 3, function, array };C " const“关键字并不真正导致编译器将某些内容放入文本或const部分。它只允许编译器警告您修改它的尝试。获得指向const对象的指针、将其转换为非const并写入它是完全有效的,编译器需要支持这一点。
发布于 2011-02-11 13:05:07
你的想法是正确和合理的。我用过Keil / uVision (这可能是3年前的v3?)它总是按照您的预期工作,即它将const数据放入闪存/ROM中。
,我怀疑您的链接器配置/脚本。,我将尝试回到我以前的工作,看看我是如何配置它的。我不需要添加#pragma或__attribute__指令,我只是让它将.const & .text放在flash/ROM中。我很久以前就设置了链接器配置/内存映射,因此不幸的是,我的召回并不新鲜。
(我对那些谈论演员和演员的人有点困惑,等等.你什么都没问&你似乎明白"const“是如何工作的。您希望将初始化的数据放在闪存/ROM中以保存RAM (而不是ROM->RAM副本),更不用说在启动时稍微加速了,对吗?你不是在问是否有可能改变它或者什么的.)
编辑/更新:
我刚刚注意到(const)结构中的最后一个字段是some_other_struct * const (指向some_other_struct的常量指针)。您可能需要尝试将其设置为指向常量some_other_struct some_other_struct const * const的(常量)指针。在这种情况下,它可能只是起作用。我不记得具体的细节(见这里的主题?),但这似乎是熟悉的。即使您的指针目标不是const项,并且您最终无法做到这一点,也请尝试更改struct定义&将其初始化为const的w/ a指针,并查看是否将其放到ROM中。即使您将它作为一个const指针,并且一旦构建了结构,它也不会改变,我似乎还记得一些地方,如果目标也不是const,链接器认为它不能在链接时完全初始化&将初始化推迟到执行C运行时启动代码时,包括。已初始化的RW存储器的ROM到RAM副本。
发布于 2011-02-10 21:27:01
您可以尝试使用汇编语言。
使用DATA语句输入信息,并发布(公开)数据的起始地址。
在我的经验中,大型只读数据在源文件中声明为static const。源文件中的一个简单的全局函数将返回数据的地址。
https://stackoverflow.com/questions/4962788
复制相似问题