1、 文档目标
在嵌入式开发中,生成符合特定需求的二进制文件(bin文件)是常见的任务之一。本文档旨在解决以下问题:如何在使用Keil MDK工具链时,生成指定大小的bin文件,并对未使用的内存区域进行自定义数据填充。这一需求在某些特定场景下尤为重要,例如芯片固件升级、调试过程中区分有效代码与空白区域等。
通过本文档,读者将掌握如何利用MDK的链接脚本(scatter file)和链接器选项实现上述功能,确保最终生成的bin文件满足特定的大小要求,并对空白区域进行可控的数据填充。
2、 问题场景
在实际开发中,客户提出了以下需求:
1. 当前工程编译生成的bin文件大小为200KB,但目标芯片的总存储空间为512KB。
2. 客户希望生成的bin文件能够扩展到512KB,以充分利用芯片的存储空间。
3. 对于未使用的空白内存区域,客户希望能够指定填充数据(例如0xFF),以便在后续分析或调试中区分有效代码与未初始化区域。
此类需求常见于以下场景:
● 固件升级:某些硬件平台要求固件文件必须达到特定大小,否则无法正确加载。
● 调试与验证:通过填充特定数据,可以更直观地识别有效代码范围和未使用区域,便于问题定位。
● 安全性考虑:未初始化的内存可能包含随机数据,这些数据可能会与程序中的预期值发生冲突,导致运行不稳定。通过填充固定值(如0xFF),可以有效避免此类问题。
3、软硬件环境
1)、软件版本:Keil MDK 5.38a
2)、电脑环境:Windows 11
3)、外设硬件:无
4、解决方法
1)、首先,想要达成目的,需要对于散步(.sct)文件进行自定义修改。想要修改散步(.sct)文件需要在options->Linker中取消勾选Use Memory Layout from Target Dialog选项,然后,scatter file的Edit选项会使用,点击就可以编辑散步(.sct)文件了。(如图4-1)

图4-1
2)、在散步(.sct)文件中使用Fixed关键字在接近内存区域的地址位置创建一个根区域。创建之后,对于地址之前的全部空的内存区域都会用“0x00”进行填充。(如图4-1)


图4-2
3)、如果想要对于空白区域的指定填充的数据的话,可以在option->Linker的Misc controls中输入参数“-pad=num”来指定(如图4-3)。建议指定0xff(注意:在某些情况下,未初始化的内存可能会包含随机数据,这些数据可能会与程序中的预期数据发生冲突,导致程序运行不稳定或出现错误。通过填充0xFF,可以避免这种情况的发生)

图4-3
4)、然后,去生成bin文件。文件的大小就变成的512K。(如图4-4)

图4-4