Keil MDK5生成bin文件时生成了*.bin文件夹

2023-11-16

在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中已经做过了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keil MDK5生成bin文件时生成了*.bin文件夹 的相关文章

  • 剑指Offer 62 -- 圆圈中最后剩下的数字

    剑指Offer 62 圆圈中最后剩下的数字 题目 0 1 n 1这n个数字排成一个圆圈 从数字0开始 每次从这个圆圈里删除第m个数字 删除后从下一个数字开始计数 求出这个圆圈里剩下的最后一个数字 例如 0 1 2 3 4这5个数字组成一个圆
  • Python语言基础—if判断和循环总结

    系列文章目录 Python语言基础 注释的作用及分类 Python语言基础 常用运算符总结 Python语言基础 定义变量与数据类型 Python语言基础 if判断和循环总结 Python语言基础 理解面向对象 Python语言基础 集合的
  • 新专辑《AI秘籍》,你所感兴趣的一切

    Hi 大家好 我时茶桁 最近 我花了几天时间仔细思考了一下即将要开始写的专栏 AI秘籍 再根据自己的能力大概规划了一下 目前大致已经理出了一些相关信息可以分享给大家 专栏形式 本次专栏应该会以文章的形式先和大家见面 后续还会根据能力以原本的

随机推荐

  • 十四、使用Selector(多路复用器)实现Netty中Reactor单线程模型

    导论 前面几篇文章我们分别从 一 C10K问题经典问答 二 java nio ByteBuffer用法小结 三 Channel 通道 四 Selector选择器 五 Centos Linux安装nc 六 windows环境下netcat的安
  • C++ 类大小分析

    以下测试代码的运行环境 Ubuntu 16 04 4 LTS gcc version 4 8 5 x64 空类 单一继承的空类 多重继承的空类所占空间大小为 1 字节 实例在内存中都有一个独一无二的地址 为了达到这个目的 编译器往往会给一个
  • 编译原理-总概

    语言执行过程 代码 解释器编译器 机器代码 cpu执行 编译型语言 在程序在执行之前需要一个专门的编译过程 通过编译器把程序编译成为可执行文件 再由机器运行这个文件 运行时不需要重新翻译 直接使用编译的结果就行了 解释型语言 是一边执行一边
  • NFT 笔记:我的加密艺术品投资逻辑

    There really is no such things as Art There are only artists 没有大写的艺术这种东西 只有艺术家 贡布里希 艺术的故事 撰文 小毛哥 Mao 推特 porounclemao 每当身
  • 钉钉F1 RK3399 咸鱼80元板子使用记录

    1 简单介绍 12V电源 建议2A 默认插电不开机 有大佬找到金属罩下的焊盘 短接可上电开机 在usb旁边的旁边有个端子接口 短接就可以开机 建议找个一样大的接口接个开关 到目前为止还未测试需要哪种接口 其它接口暂时不知 谁舍得拆一个钉钉F
  • 谷粒商城高级篇(36)——商品上架之上传数据到Elasticsearch

    商品上架之上传数据到Elasticsearch 功能需求分析 分析 怎么设计存储结构来保存数据 空间换时间 时间换空间 最终方案 存储结构 关于 nested 类型 商品上架功能实现 guimall common pom xml com x
  • resnet50网络结构_轻量(高效)目标检测网络结构设计

    目标检测网络可以分成如图的5个部分 input image 输入图像的大小对整个网络推断耗时有最直接的影响 小的图像 自然整个网络推断时间就会大大减少 一般来说 输入图像大小与网络深度正相关 即 大图像需要更深的网络提取更好的特征 back
  • JS下setTimeout与setInterval二者的差异

    JS下setTimeout与setInterval二者的差异 很多人都觉得这两个方法差不多 但是 实际上 他们差的很远呢 因为setTimeout 表达式 延时时间 在执行时 是在载入后延迟指定时间后 去执行一次表达式 记住 次数是一次 而
  • Linux I2C 驱动实验

    一 I2C 驱动 本章同样以 I MX6U ALPHA 开发板上的 AP3216C 这个三合一环境光传感器为例 通过 AP3216C 讲解一下如何编写 Linux 下的 I2C 设备驱动程序 Linux 的驱动分离与分层的思想 因此 Lin
  • 数据库DML数据操作语言

    文章目录 DML 数据操作语言 1 插入数据 INSERT 1 1 语法 1 2 插入默认值 注意事项 1 3 全列插入 2 修改数据 UPDATE 2 1 语法 注意 2 2 修改指定记录 添加WHERE子句 1 WHERE子句中常用的条
  • 前端面试之开发中遇到的问题【建议收藏】

    N1 精度问题 0 1 0 2 0 3 使用math js或者big js解决问题致命 重视 N2 频繁请求问题 点击按钮发送请求 但是不能疯狂发请求 等到结果返回后可再次发送请求 可以定义一个flag待请求结束打开flag 1 代码习惯
  • 年底了,清空自己,让心归零!

    眨眼一年 荏苒半生 时光总是别样匆匆 其实这一生 不就是一年一年这样过着 转眼到中年 而后到老年 时间总是悄无声息 让你我措手不及 转眼就年底了 我们都该学会沉淀自己 把过往一键清零 让未来一切重头 年底了 做个总结吧 这一年以来 让你觉得
  • 为何出现Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes ...

    当在IDEA中连接Redis时出现 Java HotSpot 64 Bit Server VM warning Sharing is only supported for boot loader classes because bootst
  • 大数据技术之Zookeeper

    第1章 Zookeeper入门 1 1 概述 Zookeeper是一个开源的分布式的 为分布式框架提供协调服务的Apache项目 Zookeeper从设计模式角度来理解 是一个基于观察者模式设计的分布式服务管理框架 它负责存储和管理大家都关
  • 前端html通栏做法实践

    在前端通栏中也有很多种 今天给大家分享我做的一种 大家可以借鉴一下 虽然可能就一般 但是一般的通栏也就够用了 大家可以根据自己的需求来自行设计即可 这只是一个参考模板而已 下面的代码复制即可用 html代码
  • web worker API开启浏览器js多进程

    面试使人进步 在大厂佬们的碾压下接触到了目前工作中没有遇到的新api和新思路以及解决方案 今天就来说说这个新的api web Worker 以下是MDN原话 指的是一种可由脚本创建的后台任务 任务执行中可以向其创建者收发信息 要创建一个 W
  • 关于微信小程序海报画布绘制

    小程序需要关于用户点击分享时弹起画布海报分享朋友或者朋友圈 1 我们需要先要创建一个画布 然后需要在js里去初始化画布并且制作出想要的画布海报样式 到目前为止咱们的画布海报图已经可以出现了 接下来咱们可以将已生成的海报图片 保存到手机或者分
  • vue 计算属性 vs 方法, 过滤器

    vue 计算属性 vs 方法 过滤器 最近换项目了 终于重新开始 使用 vue 了 继续学习中 computed 计算属性将被混入到 Vue 实例中 所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例 变量
  • vue项目部署到nginx服务器

    相信很多刚学习vue的朋友都可以进行到将vue项目进行npm run build这部 对于将build后的结果部署到nginx服务器上却一知半解 作者刚开始的时候也是很迷惑 看到网上很多朋友在问 今天作者就将自己的部署过程记录下来 供大家参
  • Keil MDK5生成bin文件时生成了*.bin文件夹

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