Nos*_*Nos 3 c embedded linker arm stm32
最近我收到了一些有一些问题的遗留代码.在一些代码中,我注意到许多状态报告存储为3d char数组.踢球者是很多这个空间实际上是未使用过的.例如:
const char txt[<60>][6][150] =
{
{"This is a very very long string of text", "The others are empty", "", "", "", ""},
{"The text is different, but similarly a lot of unused space", etc...}
};
Run Code Online (Sandbox Code Playgroud)
(60不存在,但有60个条目).
然后使用以上声明通过QSPI将此代码放入闪存中
__attribute__((section(".ExtQSPIFlashSection")))
Run Code Online (Sandbox Code Playgroud)
此部分在链接器中定义如下:
QSPI (rx) : ORIGIN = 0x90000000, LENGTH = 64M
.ExtQSPIFlashSection : { *(.ExtQSPIFlashSection) } >QSPI
Run Code Online (Sandbox Code Playgroud)
作为一种更有效的内存方法,我想重写它:
const char **txt[] =
{
(const char*[]) {"This is a very very long string of text", "The others are empty", "", "", "", ""},
(const char*[]){"The text is different, but similarly a lot of unused space", etc...}
};
Run Code Online (Sandbox Code Playgroud)
但是,现在将数组(或任何正确的术语)写入RAM,这会导致它溢出.
'._user_heap_stack' will not fit in region RAM
region 'RAM' overflowed by 6888 bytes
Run Code Online (Sandbox Code Playgroud)
这个6888字节比删除部分部分的原始方法更少,但不是所需的结果.
我如何告诉(我认为)链接器还将字符串写入闪存?
一切都是永恒不变的,不会做任何改变,让它成为指针或指向的值.
编辑:我注意到我的标题可能不完美,请告诉我要改变它的内容.
这是C中的一个案例,他们发明了不必要的复杂语法.
链接器需要知道指针表是只读的,而不仅仅是指向的字符串文字.否则,字符串文字像往常一样在闪存中结束,但RAM中的指针.
const char **意味着(从右到左阅读),指向指针的指针const char.但是为了让这个内部闪存,你需要只读指针指向只读指针 const char.
要将指针本身作为只读而不是指向的数据,请将const关键字放在... 的右侧*.那是:
const char *const *const txt;.
再次,从右向左阅读:只读,指向只读指针的指针const char.
查看.map文件,txt现在应该是段.rodata或类似的.