如何通过GNU编译工具链分组RAM变量以避免对齐填充?
问题
我们有一个基于ARM Cortex-M33处理器的大型嵌入式项目,采用约3万行C语言编写,使用GNU编译/链接工具链。项目包含自定义软件、开源库(如FatFS)及厂商专属库(如蓝牙协议栈),拥有约500个占用RAM的命名静态变量和数据结构,变量大小从1字节到数百字节不等,多数为1、2或4字节。
链接器会按单个文件的变量大小分组,在4字节与2字节变量组、2字节与1字节变量组切换时添加对齐字节,导致有限的RAM因对齐填充被浪费,目前丢失的RAM约占总可用内存的3%,项目内存即将耗尽。
我希望能指示编译器和链接器将所有1字节变量放入一个链接段、2字节变量放入另一个、4字节变量放入第三个,其余变量放入第四个,以此控制各段对齐方式,消除或最小化对齐填充;或者让链接器按大小排序分配内存地址。
查阅GNU编译器和链接器手册未找到相关方法,现寻求可行方案或部分解决思路。
2024年1月24日更新:最终解决方案
在链接控制文件中使用SORT_BY_ALIGNMENT关键字的建议效果显著,它会先按文件、再按对齐方式对变量排序。虽然这不是最理想的方案(理想状态是按对齐方式对所有RAM变量统一排序),但已经帮我们解决了大部分问题:最初约1KB的RAM因碎片化丢失,后续分析发现其中300字节是未统计的RAM重定位代码,剩余约320字节成功恢复为可用RAM,投入的工作量和收益匹配。感谢各位的帮助,尤其感谢首次提及该关键字的pmacfarlane。
内容的提问来源于stack exchange,提问作者user2246302
相关产品推荐
相关产品推荐

