Keil中如何检查代码空间是否超限,由.lds/.sct文件来实现。
一、.lds/.sct文件的核心作用
1、定义Falsh、ram空间边界
在链接脚本中需明确指定Flash的起始地址(ORIGIN)和容量(LENGTH)
MEMORY { LR_IROM1 (rwx) : ORIGIN = SRAM_BASE_ADDR, LENGTH = BOOT_VECTOR_AREA_SZ LR_IROM2 (rwx) : ORIGIN = SRAM_BASE_ADDR + BOOT_VECTOR_AREA_SZ, LENGTH = PATCH_TABLE_AREA_SZ LR_IROM3 (rwx) : ORIGIN = CODE_AREA_BASE, LENGTH = CODE_AREA_SIZE LR_RETAINED_RAM0 (rw) : ORIGIN = RET_MEM_BASE_ADDR, LENGTH = RET_MEM_SIZE /* After this there's only BLE Exchange Memory, externally defined by the __SCT_BLE_BASE address and with custom zeroing code in arch_rom.c */ /* Free area to be used by the application (free areas are zero initialized after reset) */ #if (CFG_MAX_TX_PACKET_LENGTH > 27) LR_FREE_AREA_AT_TX_CNTL_BUFFER (rwx) : ORIGIN = FREE_AREA_AT_TX_CNTL_BUFFER_BASE_ADDR, LENGTH = FREE_AREA_AT_TX_CNTL_BUFFER_SIZE LR_FREE_AREA_AT_TX_ADV_1_BUFFER (rwx) : ORIGIN = FREE_AREA_AT_TX_ADV_1_BUFFER_BASE_ADDR, LENGTH = FREE_AREA_AT_TX_ADV_1_BUFFER_SIZE LR_FREE_AREA_AT_TX_ADV_2_BUFFER (rwx) : ORIGIN = FREE_AREA_AT_TX_ADV_2_BUFFER_BASE_ADDR, LENGTH = FREE_AREA_AT_TX_ADV_2_BUFFER_SIZE LR_FREE_AREA_AT_TX_ADV_3_BUFFER (rwx) : ORIGIN = FREE_AREA_AT_TX_ADV_3_BUFFER_BASE_ADDR, LENGTH = FREE_AREA_AT_TX_ADV_3_BUFFER_SIZE #endif LR_FREE_AREA (rwx) : ORIGIN = FREE_AREA_BASE_ADDR, LENGTH = FREE_AREA_SIZE /* Fixed area used by TRNG */ LR_RETAINED_TRNG_STATE (rw) : ORIGIN = TRNG_STATE_BASE_ADDR, LENGTH = RET_DATA_UNINIT_TRNG_STATE_SIZE /* Fixed area used by CHACHA20 */ LR_RETAINED_CHACHA_STATE (rw) : ORIGIN = CHACHA_STATE_BASE_ADDR, LENGTH = RET_DATA_UNINIT_CHACHA_STATE_SIZE }如:LR_IROM3 (rwx) : ORIGIN = CODE_AREA_BASE, LENGTH = CODE_AREA_SIZE
这里限制了code存放起始地址和结束地址。当链接分配时间检查到超限,则立即报错。
这里可以建议大家使用Keil5_disp_size_bar等工具,编译后自动显示Flash/RAM占用百分比,直观识别超限风险。
2、控制段的地址分配
通过SECTIONS指令将代码段(.text)、常量(.rodata)等映射到Flash区域
ER_IROM3 CODE_AREA_BASE CODE_AREA_SIZE { *(InRoot$$Sections) ; All library sections that must be in a ; root region, for example, __main.o, ; __scatter*.o, __dc*.o, and * Region$$Table startup_Telink_TL3218.o (+RO) *(system_Telink_TL3218) .ANY(+RO) .ANY(+RW) }二、配合编译结果验证实际占用
仅靠.lds文件无法直接显示占用大小,必须结合以下输出信息:
1、 编译报告中的关键指标
Keil编译完成后输出:
Program Size: Code=29864, RO-data=123592, RW-data=60, ZI-data=3900
Flash占用公式:Code + RO-data + RW-data(单位:字节)。
例如:29864 + 123592 + 60 = 153516 Bytes ≈ 150KB,若Flash定义为128KB则超限。
2、.map文件分析
在工程目录的Listings文件夹中查看.map文件:
搜索Execution Region ROM(或自定义Flash区域名),检查各段地址范围是否在LENGTH范围内[[3]4。
重点关注Section Cross References部分,列出所有段的大小及地址。
总结:.lds文件通过硬件地址约束为Code超限提供基础防护,但需结合编译输出、.map文件分析及工具验证,才能完整覆盖存储溢出的检测需求。开发中建议始终保持.lds中的LENGTH与芯片实际Flash一致
Disclaimer / 免责声明:
本文仅代表作者在撰写和修改时的个人观点,不代表当前或未来立场。文中观点和内容未经学术机构或标准组织验证,作者不对其准确性、完整性或可靠性作任何保证。请读者仅供参考,并自行核实相关信息。本文旨在探索与经验分享,因篇幅及作者水平所限,难免存在疏漏,欢迎批评指正。如有问题或交流建议,请联系:flourishinggarden@outlook.com。
copyright / 版权声明:
本文为作者原创。引用或转载需注明“转自或引用自 flourishinggarden@outlook.com”。 未经注明来源的擅自使用、抄袭或传播行为均被禁止。