完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在开发一个有很多常量字符串的应用程序。例如:
char *hello = "hello world"; 或者 if (strncmp(hello, "greeting") == 0) { ... 我似乎发现字符串被放置在一个特殊的链接器“部分”中,因此我们可以识别它们。但是,当我链接我的应用程序时,我的理解是字符串(在运行时)被放置在宝贵的 RAM 中。是否有任何意义/概念/技术将这些引导到闪存中,以便在运行时,我们将节省一些 RAM 以供操作。 |
|
相关推荐
1个回答
|
|
是的,有一些方法可以将字符串常量放入闪存中,以节省 RAM。
一种方法是使用链接器脚本,将您的字符串显式地放置在闪存中的特定位置。您可以在链接器脚本中定义一个新的区域,然后将字符串常量显式地放置在该区域中。例如: MEMORY { ... FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K MY_STRINGS (rx) : ORIGIN = 0x08040000, LENGTH = 8K ... } SECTIONS { ... .my_strings : { *(.my_strings*) } > MY_STRINGS ... } 在上面的脚本中,我们定义了一个名为 MY_STRINGS 的新区域,并将其放置在闪存地址 0x08040000 处,长度为 8K。然后,我们使用一个名为 .my_strings 的链接器部分将所有名为 my_strings* 的符号分配给 MY_STRINGS 区域。这意味着所有以 my_strings 开头的符号(如 my_strings_hello)都将被放置在此区域中。 另一种方法是使用常量字符串池技术。在这种方法中,您可以定义一个名为 .rodata 的链接器部分,并将所有字符串常量分配给该部分。然后,在程序运行时,您可以通过包含一个名为 __flash 的特殊修饰符来引用该部分中的字符串。例如: const char __flash *hello = "hello world"; 在上面的例子中,我们定义了名为 hello 的指向常量字符的指针,该常量字符被分配到 .rodata 部分中。我们还使用 __flash 修饰符,它告诉编译器将指针指向的数据视为闪存中的数据,而不是 RAM 中的数据。因此,当我们引用 hello 指针时,它将指向闪存中的数据,而不是 RAM 中的数据。 请注意,这些方法都需要您手动管理字符串常量的分配和释放。所以,请确保在代码中正确处理字符串常量,以避免内存泄漏和其他问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
1143 浏览 1 评论
578浏览 6评论
479浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
463浏览 5评论
464浏览 4评论
440浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 03:36 , Processed in 0.895185 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号