IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> bin文件合并实用小程序 -> 正文阅读

[嵌入式]bin文件合并实用小程序

? ? ? ? 做为嵌入式行业从业者,我想大家对bin文件肯定是不陌生的。从嵌入式程序来看,它就是我们实际的代码数据。当然我们还经常用到另外一种格式,hex文件。使用过keil的朋友肯定非常熟悉啦。一般我们使用stlink等下载工具用的就是这种格式。它们之间有什么区别呢?网上介绍的资料非常多,这不是我这篇文章要讨论的话题,不过我还是简单说一下,hex文件比bin文件大,前者包含了地址相关信息,存储的是ASCII格式内容,后者就是只包含程序数据,存储的是二进制格式内容。

? ? ? ? 不知道大家有没有做过在线升级的功能,俗称IAP;具体一点,IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。我在项目中用到的还是比较多的,这里就会涉及bootloader程序和app程序两个,当我们准备好了这两个程序的时候,要一起烧入到mcu里面去,当然你也可以先烧入bootloader程序,在通过相关接口(比如串口等)去烧入app程序。我们就以第一种情况为例来讨论(当然实际也有很多其他情况需要用到)。假如我们要发两个程序去烧入,你可以是两个hex文件,不过这里我们讨论都是bin文件,那么你就要提供app的偏移地址数据,那有时候我们不想提供,有没有什么办法把两个bin合成一个bin在发过去烧入呢,肯定有,网上也有一些小软件可以下载。不过这种功能咱们自己是不是可以写个小工具自己去实现呢,是否更有意思?这里我提供一个小的代码供大家参考,大家可以在源码里添加更多的功能满足自己的需求。源码非常简洁不需要过多的解释,直接上代码。

#include<stdio.h>

int getFileLength(char const * filename)
{
    FILE * fp = NULL;
    int length = 0;
    fp = fopen(filename,"r");
    if(fp == NULL){
        printf("open error");
        return -1;
    }
    fseek(fp,0,SEEK_END);
    length = ftell(fp);
    fclose(fp);
    return length;
}

int main(void)
{
    int i = 0;
    int ret = 0;
    FILE *fp = NULL;
    unsigned char buff[100*1024];
    int filesize1 = getFileLength("bootloader.bin");
    int filesize2 = getFileLength("app.bin");
    int offset = 0;
    /*输入并获取偏移地址,十六进制模式*/
    printf("please input offset addr:");
    scanf("%x",&offset);
    /*获取BootLoader数据*/
    fp = fopen("bootloader.bin","r");
    if(fp == NULL){
        printf("open error");
        return 0;
    }
    ret = fread(buff,1,filesize1,fp);
    if(ret != filesize1){
        printf("read error");
    }
    fclose(fp);
    /*获取app数据*/
    fp = fopen("app.bin","r");
    if(fp == NULL){
        printf("open error");
        return 0;
    }
    ret = fread(buff+filesize1+offset,1,filesize2,fp);
    if(ret != filesize2){
        printf("read error");
    }
    fclose(fp);
    /*合并写入新的bin文件*/
    fp = fopen("merge.bin","w");
    if(fp == NULL){
        printf("open error");
        return 0;
    }
    ret = fwrite(buff,1,filesize1+offset+filesize2,fp);
    if(ret != filesize1+offset+filesize2){
        printf("write error");
    }
    fclose(fp);

    return 0;
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-23 16:51:02  更:2021-08-23 16:52:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 21:17:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码