Keil MDK5生成bin文件时生成了*.bin文件夹
在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文件夹相关推荐
- Linux下通过rm -f删除大量文件时提示-bash: /bin/rm: Argument list too long的解决方法...
Linux下通过rm -f删除/var/spool/postfix/maildrop/中大量的小文件时提示: "-bash: /bin/rm: Argument list too long& ...
- CAD控件教程:网上打开dwg文件时,对dwg文件路径加密的功能
软件名称: 看楼主头像... 1.增加控件状态栏文字,自定义功能, C++接口为 : CStatusBarInformationReactor::CreateProgressBarText COM ...
- linux拷贝文件时如果想保留文件原有的时间属性,可以使用选项,Linux考试题完整版.doc...
PAGE Linux基础知识 自测题 单选题(共计40题) 1. 查看命令cd的绝对路径,结果如下: # which cd /usr/bin/which: no cd in (/usr/kerbero ...
- python3文件的编码类型是_Python3.x环境创建Python脚本文件时,需要将文件编码格式设置为...
Python3.x环境创建Python脚本文件时,需要将文件编码格式设置为 答:UTF-8 在黄种人群中有一种叫白化病的隐性遗传病,其致病原因是 答:表皮中的黑色素细胞缺乏酪氨酸酶: 注射用水可通过( ...
- SPSS Modeler导入excel文件时出现“无法读取文件列名”解决方法
SPSS Modeler导入excel文件时出现"无法读取文件列名"解决方法 经过本人多次尝试,终于发现了原因 原因是:excel文件在后台打开了,因此spss modeler读取 ...
- gridview连接接SQL server .mdf文件时没有打开此文件的权限,请与文件所有者或管理员联系以获得相应权限
gridview连接接SQL server .mdf文件时没有打开此文件的权限,请与文件所有者或管理员联系以获得相应权限 类似于 处理方法: 选中要打开的文件右键属性 - 安全- 高级 -添加- 选 ...
- sublime text3创建文件时生成头部注释
在配置sublime text3编辑器在创建一个新的文件时,希望可以自动生成头部注释,在网上查了几个插件,主要有三个:DocBlokcr(https://packagecontrol.io/packa ...
- java解析xml文件失败,在Java中解析大型XML文件时找不到文件异常
我使用SAX(Simple API for XML)来解析XML文档.该文档是一个巨大的XML文件(dblp.xml - 1.46 GB),我写了几行解析器并在小文件上测试它,它的工作原理. Samp ...
- php查看音频属性,PHP获取音频mp3文件时长或音频文件其它参数属性
标签: 今天在开发项目中遇到一个问题,要获取到上传音频的时长,从而展示在前端页面 最后找到解决方案: 1.首先,我们需要先下载一份PHP类-getid3 https://codeload.githu ...
最新文章
- bitset类型, 标准库类型
- pb怎么连接dll_跑步学不会这项技术,谈何PB?
- 想学python有什么用-我们为什么要选择学习python?学习python有什么用?
- python中的散点图代码-绘制python中的线和散点图
- liu四声拼音怎么读_拼音是99%的西安孩子幼升小必备知识!附:幼小拼音学习计划...
- 大连富海计算机专修学校怎么样,大连富海计算机专修学校贴吧吧规(2018年版)...
- 英语口语-文章朗读Week10 Monday
- php tp写构造函数,tp5参数绑定到构造函数
- oracle 切割字符串加引号_oracle存储过程中单引号及字符串拼接处理
- arduino 蓝牙示例_Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车
- 【STM32F429】第5章 RTX5操作系统移植(MDK AC6)
- 在自己电脑上无法用Foxmail客户端登录126邮箱的解决办法
- 益聚星荣:如何有理有据地给元宇宙泼一盆冷水?
- 防止恶意调用API接口
- EFR32 资源汇总
- 微博朋友圈亿级Feed流如何轻松设计?
- Sybase建设上海社保卡数据仓库案例
- 使用Java建立一个公交管理系统,监督管理公交日常运营情况。
- python第二周day2
- DeDeCMS v5.7 SP2 前台任意用户密码修改漏洞复现
热门文章
- A Survey: Visual Place Recognition 视觉场景识别的一篇调研
- [附源码]Node.js计算机毕业设计高校运动会管理系统 Express
- vue3实现吸顶效果
- 大工19春计算机文化基础 在线测试,大工19春《计算机文化基础》在线测试123满分答案...
- python,pip,xlrd 安装
- 声音处理用什么软件?3款软件让你的作品出圈!
- 什么是uboot?uboot有什么用?
- Windows 10和Linux脚本启动jar包服务器,并设置开机启动
- 2020年煤矿安全监测监控试题及答案及煤矿安全监测监控复审考试
- java虚数复数计算_真实的虚数,不仅不是没用,而且还很实在