gpt4 book ai didi

c - 如何强制链接器将字符串数组的 const 数组存储到闪存中(而不是 RAM)

转载 作者:太空狗 更新时间:2023-10-29 15:49:54 24 4
gpt4 key购买 nike

最近我收到了一些有几个问题的遗留代码。在某些代码中,我注意到很多状态报告都存储为 3d 字符数组。更重要的是,这个空间中有很多实际上是未使用的。例如这个:

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...}
};

(没有60,但是有60个条目)。

然后使用声明上方的以下代码通过 QSPI 将此代码放入闪存

__attribute__((section(".ExtQSPIFlashSection")))

此部分在链接器中定义如下:

QSPI (rx)       : ORIGIN = 0x90000000, LENGTH = 64M
.ExtQSPIFlashSection : { *(.ExtQSPIFlashSection) } >QSPI

作为一种更有效的内存方法,我想这样重写它:

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...}
};

但是,现在数组(或任何正确的术语)被写入 RAM,这导致它溢出。

'._user_heap_stack' will not fit in region RAM  
region 'RAM' overflowed by 6888 bytes

这 6888 字节比删除节部分的原始方法少得多,但不是期望的结果。

我如何告诉(我认为)链接器也将字符串写入闪存?

一切在任何时候都是不可变的,永远不会发生任何变化,让它成为指针或它们指向的值。

编辑:我注意到我的标题可能不完美,请告知要将其更改为什么。

最佳答案

这是他们在 C 中发明了不必要的复杂语法的案例之一。

链接器需要知道指针表是只读的,而不仅仅是指向的字符串文字。否则,字符串文字会像往常一样在闪存中结束,但指针会在 RAM 中。

const char ** 表示(从右向左读),指向const char 的指针。但是为了将其放入闪存中,您需要指向指向 const char 的只读指针的只读指针。

要将指针本身设为只读,而不是指针指向的数据,您可以将 const 关键字放在 * 的右侧。即:

const char *const *const txt;.

同样,从右到左阅读:只读,指向只读指针的指针,指向 const char

查看您的 .map 文件,txt 现在应该位于段 .rodata 或类似段中。

关于c - 如何强制链接器将字符串数组的 const 数组存储到闪存中(而不是 RAM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54475573/

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