jicheng0622

【学习笔记】Keil不能正确生成.bin文件的解决办法

0
阅读(8821)

    前段时间我写过如何利用CW、IAR和Keil生成image文件,效果还不错,有些用户反馈挺有帮助的,毕竟待项目开发到最后是需要生成image文件用来量产烧写,我们总不至于到最后使用调试下载吧(不过还别说,用量比较小的用户还真有可能用调试的方法来下载,当然这个只能说是小批量烧写,如果真是大批量烧写,这效率估计得把老板愁死,呵呵)。不过最近同事遇到了用keil生成bin文件时不能正确生成.bin文件而是生成.bin文件夹的问题,这个问题最开始感觉比较怪异,后来问题解决了还是豁然开朗了,Keil还是蛮有意思的,呵呵。

    其实这个问题顺藤摸瓜还是比较容易找到根结的(还是那句话,授之以鱼不如授之以渔才是俺的风格,问题解决只是结果,但是我更希望跟大家说明白解决问题的方法,结果是给老板看的,但对自己来说方法和过程很重要,学会了方法会让你在处理问题上游刃有余),既然问题出在生成文件上,那我们就只能找fromelf这个文件转换工具的麻烦了(啥?不知道啥叫fromelf,咳咳,先去面壁2小时然后百度一下吧,呵呵),打开keil IDE,然后打开help->uVison Help,搜索fromelf关键字如下图1:

image

    然后再进入到右下角的索引找到fromelf命令行的语法和选项,找到—bin的说明如下,如红色标注所说,正是症结所在,即如果链接文件中定义了多个加载段的话,fromelf会以目标文件名来创建一个文件夹并将每个加载段都生成一个相应的文件存放在该文件夹下,问题的原因是找到了,但是另外两个问题又来了(咳咳,问题咋这么多捏),一是我的工程为啥会有多个加载段,另一个问题是如果出现这种加载段我们怎么生成我们想要的bin文件呢,不要捉急,咱们一个一个聊。

image

第一个问题,我们打开Keil->Options->Linker选项卡如下图,可以看到本工程中没有使用Options->Target下选项卡对内存映射的配置,而是使用自己的.scf链接文件,打开该文件一看就明白了,其定义了很多个内存段因此造成上述情况的发生,如果使用Target Dialog应该不会出现此类问题(但是此时工程会编译错误,因为工程中某些原文件用了自定义.scf中某些段名)。

image

第二个问题,既然问题找到了,我们该使用哪种方法来正确生成想要的.bin二进制文件呢,通过查看fromelf所支持的命令集,终于找到了解决办法,即使用—bincombined命令可以实现将使用多加载段的工程生成真正的.bin文件,具体用法如下:

image

    好吧,终于写完了,本来一个简单的小问题貌似让我给写了如此长章节的内容啊,咳咳,自己真是有成为话唠的潜力啊。不过还是希望大家能坚持把它看完,理解俺写这篇文章的宗旨,额,自己是不是有点太高尚了,算了,不能太高调了,哈哈。关电脑,睡觉。。。差点忘记说了,未完待续啊,呼…呼…呼…