技术标签: C/C++
从学习单片机以来,在Keil下的烧写都是把.hex文件烧写到单片机内部Flash,对于.hex文件的格式和烧写流程都没有深究。直到需要了解IAP(In Application Programming,即脱离JLink等烧写器进行在线升级)的时候,才发现.hex文件不能作为被直接下载的文件格式,只能用.bin文件代替。下面简单说下这两个文件之间的关联。
这里参考了另一篇文章的内容。
Hex文件打开后每一行称为一个“记录(record)”,每行记录按照同样的结构包含了5个域(且每行以冒号开头):
根据以上图片知道,一个hex文件最后一行中的记录类型应该是’01’、表示文件结束。
为此写了个简单的程序并用VSCode打开生成的hex:
可以看到最后一行的记录类型域是’01’、表示文件结束。
这里插一句:第一行的记录类型域是’04’,表示“扩展线性地址记录”;倒数第二行的’05’表示“线性地址开始记录”,现在还不懂是什么意思…
bin文件是最干净、没有地址信息等额外信息的文件,直接就是可以跑在单片机中机器码(包括程序和数据)。从下面可以看到C源码中**“A char string for see how ASCII char stored in hex and bin”**和另外的字符串被直接放在bin文件的最后(左边白色是bin文件的数据、右边是部分对应的ASCII码,其中控制字符和非ASCII码都显示为"."):
这个简单的程序生成的hex比bin大一倍多(3KB vs 1KB)。
因为hex包含很多额外信息(从截图来看,一行记录最多只能包含16字节的有效数据,也就是hex文件要给bin文件中每16字节增加5字节的信息和1字节的冒号…咦?那不至于两倍多?可能还有别的占存储空间的地方?不清楚…)。
编译另外一个程序得到的结果也是如此(22KB vs 8KB):
对于hex比bin大很多的原因,这篇文章提到(但这个理解是错误的!):
该作者的意思是“hex文件把C源码中的每个十六进制数的都当做字符串来处理”——但实际并不是如此,下图可以看出我C源码中的int数组,每个int元素都直接存进了hex文件,它们并没有转化为这些数字对应的ASCII码(如’23’对应的ASCII码应该是’32 33’):
还是引用这里的描述
Hex文件和Bin文件的存在价值:
从上面的介绍中,我们发现Hex文件中每行的内容,就像我们发送串口数据的数据帧,并且最后一行还指示出文件结束了。我们得出hex文件的两个优点:
1. 使用ASCII文本保存固件信息,方便查看一些固件内容;
2. 通过文件每行的校验和与最后一行的文件结束标志,在文件的传输与保存过程中能够发现固件是否完整。
Hex文件有更好的可读性,最重要的是hex文件能够保证固件在保存与传输时的完整性。因此hex文件更适用于保存与传输。而Bin文件是纯二进制文件,内部只包含程序编译后的机器码和变量数据。当文件损坏时,我们也无法知道文件已损坏。不过Bin文件作为固件的最终形式,在使用串口下载程序或者远程升级时,是不可替代的。
最后有一个很好的问题:既然hex和bin在内容上相差了一些额外的信息、而且bin的数据才是单片机最终可见的数据,那hex的额外信息什么时候去掉的呢?
答案是:是在使用JLink或者SWD烧录器给烧录代码时。烧录器上的程序把这些信息去除的。那么可以这样说:烧录hex文件仅在有烧录器的情况使用,否则如果是通过串口或普通的通讯接口,则只能使用bin文件。
\begin{figure*}\end{figure*}来破栏,因为好多paper的格式是双栏的,所以有时候放图片可以破栏放置。当然图片属性还有如下的格式\begin{figure}[hbtp]\end{figure}在这里补充说一下浮动图形figure环境, 它能自动调整图形在页面中出现的位置:\begin{figure}[位置]\caption{图的标题}\end{figure}这里[位置]可以是h(当前位置),t(页顶),b(页底),p(另页),如果前面加了个!(感叹号),那么则是_\subfigure显示图片,在双栏里一行显示
原文出处:http://cmsblogs.com/ 『chenssy』我们知道线程Thread可以调用setPriority(int newPriority)来设置优先级的,线程优先级高的线程先执行,优先级低的后执行。而前面介绍的ArrayBlockingQueue、LinkedBlockingQueue都是采用FIFO原则来确定线程执行的先后顺序,那么有没有一个队列可以支持优先级呢? Pr..._消息队列中有没有支持priorityblockingqueue的
从Jao的Programming Musing 看到的:Babar Kazar 整理了一堆经典论文。Jao强烈建议每个严肃的程序员读每篇论文,说它们都或多或少有意思。粗粗扫了一下,很多论文都没读过。挑了些俺多少知道一点的介绍。· An axiomatic basis for computer programming C. A. R. HoareTony Hoare名下的公理化语义(Axioma
系统还原功能是一个很好的功能,可惜Windows Server操作系统上并没有这个功能。使用计划任务执行以下命令(创建还原点)-ExecutionPolicy Bypass -Command "Checkpoint-Computer -Description “Startup RestorePoint " -RestorePointType “MODIFY_SETTINGS””或者直接使用po..._win2019系统恢复
extern "C" {#include "uboot_env.h" }说明:uboot_env.h里面通过extern引入有uboot_env.c(c语言文件)的函数,如果recovery.cpp(c++)要调用该函数,则需要按照以上方式include头文件。简单说就是被extern “C”修饰的函数或者变量是按照C语言方式编译和链接的,所以可以用一句话来概括extern “C”的真实目..._mrs添加新的源文件和头文件
springboot项目,随着时间的推移,启动耗时逐步增加,从几分钟慢慢的达到30多分钟,有点恐怖!项目中用到技术:hibernate、redis、kafka、线程池等,启动慢的环境使用的是mysql数据库!1.最开始查看的启动日志,是在输出:org.hibernate.id.UUIDHexGenerator : HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 4..._以前一个sping boot 应用启动时需要30s,现在需要30分钟
springboot异常处理,全局异常处理_springboot抛出异常给前端
uniapp 拨打电话apiuni.makePhoneCall({ phoneNumber: 'xxxxx',});当phoneNumber的值含有空格时(例如:“123 456 789”),安卓手机不受影响可以顺利调起拨打电话,苹果手机则会显示api调起失败,参数无效。将phoneNumber的值得空格去掉(如:123456789),安卓和苹果手机都可以顺利调起拨打电话。..._支付宝小程序拨打电话api
目录 ORM Hibernate,JPA和SpringDataJpa JPA入门案列 JPA的API介绍 getOne和findOne的比较 JPQL的基本使用(★)基本概述 jpql的查询方式 jpql : jpa query language (jpq查询语言) 特点: 1. 语法或关键字和sql语句类似 2. 查询的是类和类中的属性 3. 需要将JPQL语句配置到接口方法上 1).特有的查询:需要在dao接口上配_springdatajpa jpql
接收参数为json类型时,前端要处理json,改成json的字符串,请求格式设置为application/jsondata : JSON.stringify(json_data),contentType : 'application/json;charset=utf-8'//中文需要加上charset=utf-8才正确接收到的json需要转化为实体类,使用Gson方法GSON使用详见 https..._controller会参数类型转换实体
Vsftpd出自Ubuntu中文vsftpd,ftp服务端 目录[隐藏]1stand alone和super daemon2安装3文件结构4运行4.1standalone4.2super daemon5/etc/vsftpd.conf6匿名用户6.1上传文件6.2重命名、删除文件7仅能上传,无法下载8认证FTP配置9Chroot9.1限制所有9.2开放所有,限制特定9.3限制所有,开放特定10账号登录10.1/etc/ftpusers文件10.2userlist_file 文件10.3限制一切,_vsftp 的官方文档
用学校的账户联网后自动弹出http://go.microsoft.com/fwlink/?LinkID=219472&clcid=0x409,之后就转到bing页面。网上似乎有很多人有同样的问题,都是拨号后自动弹出的,也没有插件、病毒什么的。网站上有一些解决办法,比如http://answers.microsoft.com/zh-hans/windows/forum/windows_8-s