
Keil中如何检查代码空间是否超限由.lds/.sct文件来实现。一、.lds/.sct文件的核心作用1、定义Falsh、ram空间边界在链接脚本中需明确指定Flash的起始地址ORIGIN和容量LENGTHMEMORY { 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 theres 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: Code29864, RO-data123592, RW-data60, ZI-data3900Flash占用公式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 / 免责声明:本文仅代表作者在撰写和修改时的个人观点不代表当前或未来立场。文中观点和内容未经学术机构或标准组织验证作者不对其准确性、完整性或可靠性作任何保证。请读者仅供参考并自行核实相关信息。本文旨在探索与经验分享因篇幅及作者水平所限难免存在疏漏欢迎批评指正。如有问题或交流建议请联系flourishinggardenoutlook.com。copyright / 版权声明:本文为作者原创。引用或转载需注明“转自或引用自 flourishinggardenoutlook.com”。 未经注明来源的擅自使用、抄袭或传播行为均被禁止。