完善资料让更多小伙伴认识你,还能领取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 中的数据。 请注意,这些方法都需要您手动管理字符串常量的分配和释放。所以,请确保在代码中正确处理字符串常量,以避免内存泄漏和其他问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
220个成员聚集在这个小组
加入小组547 浏览 1 评论
2462 浏览 2 评论
为blufi_device设置自定义名称,但是无法修改,为什么?
476浏览 4评论
请问ESP32-S2-WROOM怎么获得ESP32-S2外接FLASH的唯一序列号?
252浏览 3评论
ESP-Jumpstart例程中第5个工程:5_cloud连接报错是哪里的问题?
267浏览 2评论
用AT+CIPSNTPCFG=1,8,\"cn.ntp.org.cn\",\"ntp.sjtu.edu.cn\"更新不了时间怎么处理?
702浏览 2评论
361浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-4-21 07:22 , Processed in 0.858267 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191