目前在做一个项目,具有在线升级功能,具有boot区,boot_data区,APP区和上位机升级软件
(讲解APP,boot及上位机实现的,请看https://blog.csdn.net/wuhenyouyuyouyu/article/details/102851287)
。正常情况下是下载Boot程序,然后用上位机下载APP,考虑到生产上的效率能不能下载一个HEX就可以
了,经过查看资料是可行的,具体思路如下。
一、上位机实现
1、要能根据APP文件生成boot_data文件;
2、如果考虑加密,可以具有一些加密功能。
bin文件读写:出处https://blog.csdn.net/weixin_42287851/article/details/103759331
方法1:
(1)写bin文件
#include
#include
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
#include
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
#include
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(data), sizeof(data));
outF.close();
return 0;
}
(2)读bin文件
#include
#include
int main(){
float* data = new float[3*224*224];
//read
std::ifstream inF("test2.bin", std::ios::binary);
inF.read(reinterpret_cast(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文件
上面是从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烧写工具即可。