0. 引言
在平时的Linux嵌入式开发中,我们常见的工作流程如下:
搭建交叉编译和开发环境--->模块开发--->build image--->release image
在最后一个阶段,即Image release阶段中,一般我们都是生成如下几个flash分区用的Image镜像文件,烧录进flash中对应的block中,如下图所示:
在开发阶段,不同的team或者开发人员就针对某一个block进行重复性的读写和调试,最后完成该模块的工作。
1. 问题产生
在Image releae的时候,或者要mass production的时候,就需要有一个完整的包含所有image的合并到一起的镜像文件一次性的烧录到board中,这时候就需要将所有的二进制镜像文件merge到一起了。
起初,这个工作是由硬件工程师将分块烧到flash的文件一次性通过硬件工具从flash中“吹”下来,然后拿着这个“吹”下来的文件再进行mass production的烧录工作。
有时候,没有这个条件的公司或者不方便“吹”flash时,就需要由软件工程师进行这个工作。
2. 解决问题
如图中所示,比如给kernel流出来1M的flash分区,这个分区一般实际生成的kernel image不会达到1M的大小。所以在合并文件时要在剩余的空间中用0xFF填充,这一点要特别注意。
2.1 方法一:
可以用Windows版本的二进制烧录工具,这个需要手工一个一个的添加上去,同时还要制定偏移量。可以在我提供的下载区域找到。
这种方法,稍嫌麻烦。虽然不是很慢。
2.2 方法二:
自己写程序,将这些镜像文件merged到一起。同时配合脚本,release的时候一起生成合并好的文件,毫无疑问,这种方法比较好。
3. 重点介绍自写程序(方法二)
附核心代码:
void append(FILE *dest, FILE *source,size_t total_len) { size_t bytes; size_t wrote_len=0; static char temp[BUF_SIZE]; /*write actural size of image*/ while ((bytes = fread(temp, sizeof(char),BUF_SIZE, source))>0) { fwrite(temp, sizeof(char), bytes, dest); wrote_len += bytes; } /*filled with oxff when space left after write image in one block of flash*/ if ( wrote_len <= total_len ) { char *tmpPad=(char *)malloc(sizeof(char)*(total_len-wrote_len)); memset(tmpPad,0x01,sizeof(tmpPad)); fwrite(tmpPad, sizeof(char), (total_len-wrote_len), dest); } }