在Keil魔术棒中通过以下方式生成bin文件时,看提示命令执行成功,却生成了一个*.bin文件夹,文件夹内部是两个bin文件,当时感觉很奇怪,第一次遇到这种情况。

使用的命令:fromelf.exe --bin -o ./firmware/@L.bin ./output/@L.axf

刚开始怀疑是Keil配置问题,查了一遍,没发现问题,和以前生成bin文件正常的keil工程做了对比,也没发现有什么问题。排除了这种可能。

没有别的思路,网上搜了一下,找到一篇类似文章,提到是“attribute” 等命令来指定某些变量到指定的ROM地址,而这个地址不是工程程序所在的ROM地址区域导致的。按照这个说法试了一下果然有效。还是网友厉害!给大神点赞!!!

下面是结合实际开发环境和代码,来记录和还原整个结果过程。

环境是:HC32系列单片机,Keil5集成开发环境。

单片机内部Flash为2M,其中bootloader和配置存储占用地址为0~256K,其余是APP。APP起始地址为0x40000。

按照网上说法,在代码里面搜索“attribute”,发现HC库文件hc32_ll_icg.c中有一处使用的变量是指定ROM地址,并且ROM地址不在APP使用的ROM地址中。

代码中ICG_START_ADDR对应的地址0x400,确实不在APP使用的ROM区域中。看了下u32ICGValue的调用关系,发现程序中并没有调用u32ICGValue的地方,所以先不编译这个文件,重新编译工程,果然生成了bin文件,而不是*bin文件夹了。

那么问题来了,这个0x400地址是干什么用的?在HC用户手册中0x400这个地址是初始化配置相关的,描述如下:

根据手册描述来看,这个地址是固定的,按照项目对Flash的分区,这个地址应该在bootloader分区中,那么问题又来了,bootloader分区中这部分内容会不会被bootloader的bin内容覆盖掉从而影响程序的正常工作呢?带着这个疑问,打开bootloader的bin文件来看一看,发现这段区域并没有被bootloader的bin文件覆盖,应该是HC已经做了保护,我们不用担心了。

好了,0x400的ROM地址在bootloader的分区的ROM地址范围内的,生成bin文件是没有问题的了,而bootloader中系统上电复位解除后就自动做了0x400的ROM地址的初始化配置后,APP不再需要重复做了。

再看一下*bin文件夹中其中一个文件名为ER$$.ARM.__AT_0x00000400的内容:

和bootloader中ROM地址0x400~0x45F这段内容是一样的。

最后,再总结一下这个问题的原因和解决方法:

问题原因:程序里使用了 “attribute” 等命令来指定某些变量到指定的ROM地址中, 而这个地址不在工程程序所在的ROM地址区域。例如, 指定一个变量到0x00020000这个地址, 而程序的开始的地址是0x00060000, 此时编译器的编译时会将程序分段, 也就会生成上述的多个文件。

解决方法:将需要设置在ROM中的变量设置在本工程程序的ROM内, 即起始地址之后, 结束地址之前。对于我遇到的问题解决的方法就是在app中直接去掉就可以了,因为0x400的初始化配置是在bootloader的ROM区域内,在上电复位后bootloader中已经做过了。

Keil MDK5生成bin文件时生成了*.bin文件夹相关推荐

  1. Linux下通过rm -f删除大量文件时提示-bash: /bin/rm: Argument list too long的解决方法...

    Linux下通过rm -f删除/var/spool/postfix/maildrop/中大量的小文件时提示: "-bash: /bin/rm: Argument list too long& ...

  2. CAD控件教程:网上打开dwg文件时,对dwg文件路径加密的功能

    软件名称: 看楼主头像... 1.增加控件状态栏文字,自定义功能, C++接口为 :   CStatusBarInformationReactor::CreateProgressBarText COM ...

  3. linux拷贝文件时如果想保留文件原有的时间属性,可以使用选项,Linux考试题完整版.doc...

    PAGE Linux基础知识 自测题 单选题(共计40题) 1. 查看命令cd的绝对路径,结果如下: # which cd /usr/bin/which: no cd in (/usr/kerbero ...

  4. python3文件的编码类型是_Python3.x环境创建Python脚本文件时,需要将文件编码格式设置为...

    Python3.x环境创建Python脚本文件时,需要将文件编码格式设置为 答:UTF-8 在黄种人群中有一种叫白化病的隐性遗传病,其致病原因是 答:表皮中的黑色素细胞缺乏酪氨酸酶: 注射用水可通过( ...

  5. SPSS Modeler导入excel文件时出现“无法读取文件列名”解决方法

    SPSS Modeler导入excel文件时出现"无法读取文件列名"解决方法 经过本人多次尝试,终于发现了原因 原因是:excel文件在后台打开了,因此spss modeler读取 ...

  6. gridview连接接SQL server .mdf文件时没有打开此文件的权限,请与文件所有者或管理员联系以获得相应权限

    gridview连接接SQL server .mdf文件时没有打开此文件的权限,请与文件所有者或管理员联系以获得相应权限 类似于 处理方法: 选中要打开的文件右键属性 - 安全-  高级 -添加- 选 ...

  7. sublime text3创建文件时生成头部注释

    在配置sublime text3编辑器在创建一个新的文件时,希望可以自动生成头部注释,在网上查了几个插件,主要有三个:DocBlokcr(https://packagecontrol.io/packa ...

  8. java解析xml文件失败,在Java中解析大型XML文件时找不到文件异常

    我使用SAX(Simple API for XML)来解析XML文档.该文档是一个巨大的XML文件(dblp.xml - 1.46 GB),我写了几行解析器并在小文件上测试它,它的工作原理. Samp ...

  9. php查看音频属性,PHP获取音频mp3文件时长或音频文件其它参数属性

    标签: 今天在开发项目中遇到一个问题,要获取到上传音频的时长,从而展示在前端页面 最后找到解决方案: 1.首先,我们需要先下载一份PHP类-getid3  https://codeload.githu ...

最新文章

  1. bitset类型, 标准库类型
  2. pb怎么连接dll_跑步学不会这项技术,谈何PB?
  3. 想学python有什么用-我们为什么要选择学习python?学习python有什么用?
  4. python中的散点图代码-绘制python中的线和散点图
  5. liu四声拼音怎么读_拼音是99%的西安孩子幼升小必备知识!附:幼小拼音学习计划...
  6. 大连富海计算机专修学校怎么样,大连富海计算机专修学校贴吧吧规(2018年版)...
  7. 英语口语-文章朗读Week10 Monday
  8. php tp写构造函数,tp5参数绑定到构造函数
  9. oracle 切割字符串加引号_oracle存储过程中单引号及字符串拼接处理
  10. arduino 蓝牙示例_Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车
  11. 【STM32F429】第5章 RTX5操作系统移植(MDK AC6)
  12. 在自己电脑上无法用Foxmail客户端登录126邮箱的解决办法
  13. 益聚星荣:如何有理有据地给元宇宙泼一盆冷水?
  14. 防止恶意调用API接口
  15. EFR32 资源汇总
  16. 微博朋友圈亿级Feed流如何轻松设计?
  17. Sybase建设上海社保卡数据仓库案例
  18. 使用Java建立一个公交管理系统,监督管理公交日常运营情况。
  19. python第二周day2
  20. DeDeCMS v5.7 SP2 前台任意用户密码修改漏洞复现

热门文章

  1. A Survey: Visual Place Recognition 视觉场景识别的一篇调研
  2. [附源码]Node.js计算机毕业设计高校运动会管理系统 Express
  3. vue3实现吸顶效果
  4. 大工19春计算机文化基础 在线测试,大工19春《计算机文化基础》在线测试123满分答案...
  5. python,pip,xlrd 安装
  6. 声音处理用什么软件?3款软件让你的作品出圈!
  7. 什么是uboot?uboot有什么用?
  8. Windows 10和Linux脚本启动jar包服务器,并设置开机启动
  9. 2020年煤矿安全监测监控试题及答案及煤矿安全监测监控复审考试
  10. java虚数复数计算_真实的虚数,不仅不是没用,而且还很实在