bin文件操作

bin文件操作目前在做一个项目,具有在线升级功能,具有boot区,boot_data区,APP区和上位机升级软件(讲解APP,boot及上位机实现的,请看https://blog.csdn.net/wuhenyouyuyouyu/article/details/102851287)。正常情况下是下载Boot程序,然后用上位机下载APP,考虑到生产上的效率能不能下载一个HEX就可以了,经过查看资料是可行的,具体思路如下。一、上位机实现1、要能根据APP文件生成boot_data文件;2、如果考虑加密

目前在做一个项目,具有在线升级功能,程序有boot区、boot_data区,APP区,同时有上位机升级软件

(讲解APP,boot及上位机实现的,请看Cortex-M3单片机的IAP在线升级上位机和下位机_无痕幽雨的博客-CSDN博客

。正常情况下是下载Boot程序,然后用上位机下载APP,考虑到生产上的效率能不能下载一个HEX就可以

了,经过查看资料是可行的,具体思路如下。

一、上位机实现

1、要能根据APP文件生成boot_data文件;

2、如果考虑加密,可以具有一些加密功能。

bin文件操作

bin文件读写:出处C++读/写bin文件_灰灰灰灰灰发的博客-CSDN博客_c++读取bin

bin文件操作

方法1:

(1)写bin文件

#include <iostream>
#include <fstream>
 
int main(){
 
    float data[224*224*3];
    for(int i=0; i<224*224*3; ++i){
        data[i] = i/2.0;
    }
 
    // save
    FILE *fp = fopen("test.bin", "w");
    fwrite(data, sizeof(float), sizeof(data), fp);
    fclose(fp);
 
    return 0;
}

(2)读bin文件

#include <iostream>
#include <fstream>
 
int main(){
    float* data = new float[3*224*224];
 
    //read
    std::ifstream inF("test.bin", std::ios::binary);
    inF.read((char*)data, sizeof(float) * (3*224*224));
    inF.close();
 
    std::cout << "read bin file" << std::endl;
    for(int i=0; i<10; i++){
        std::cout << i << ": "<< data[i] << std::endl;
    }
    for(int i=224*224*3-10; i<224*224*3; i++){
        std::cout << i << ": "<< data[i] << std::endl;
    }
 
    return 0;
}

方法2:

(1)写bin文件

#include <iostream>
#include <fstream>
 
int main(){
 
    float data[224*224*3];
    for(int i=0; i<224*224*3; ++i){
        data[i] = i/2.0;
    }
 
    // save
    std::ofstream outF("test2.bin", std::ios::binary);
    outF.write(reinterpret_cast<char*>(data), sizeof(data));
 
    outF.close();
 
    return 0;
}

(2)读bin文件

#include <iostream>
#include <fstream>
 
int main(){
    float* data = new float[3*224*224];
 
    //read
    std::ifstream inF("test2.bin", std::ios::binary);
    inF.read(reinterpret_cast<char*>(data), sizeof(float) * (3*224*224));
    inF.close();
 
    std::cout << "read bin file" << std::endl;
    for(int i=0; i<10; i++){
        std::cout << i << ": "<< data[i] << std::endl;
    }
    for(int i=224*224*3-10; i<224*224*3; i++){
        std::cout << i << ": "<< data[i] << std::endl;
    }
 
    return 0;
}

二、下位机实现

1、boot实现

具体实现过程不说了,这里说下注意点,起始地址和大小设置好,然后编译输出bootBin文件。

2、APP实现

具体实现过程不说了,这里说下注意点,起始地址和大小设置好,然后编译输出APPBin文件。

3、用上位机生成bootConfig文件

bin文件操作

上面是从Flash读出的配置,下面是生成的配置。

4、合成bin

1)打开 J-Flash,File->open data file,输入boot地址;

2)打开File->merge data file,输入配置地址;

3)打开File->merge data file,输入APP地址;

4)打开File->save data file as,选择HEX格式;

5)用HEX烧写工具即可。

2022.08.31

以上方法是利用J-Flash工具,手动把boot.bin,bootcfg.bin,app.bin(也可以有appcfg.bin)合成一个hex文件,这里需要有上位机生产bootcfg.bin、appcfg.bin工具,同时合成时候,需要手动输入每个文件的起始地址,由于人工操作很容易出错,于是又做个一个批处理工具,自动生成生产的Hex,请参考:批处理多个文件合成一个HEX

今天的文章bin文件操作分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/31480.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注