在设计一个项目或者系统时,一般为了此项目在正式运行阶段不需要拆机甚至不允许拆机的情况下,很有必要设计项目可以进行远程升级,
所以项目工程一般设计boot和app,让boot能够将app升级达到更新或者修复bug功能。
一开始需要烧录boot.bin,再升级app时经常需要编译生成app.bin文件作为升级的文件,但是在工厂烧录阶段一般使用一个bin文件烧录,
分两次烧录太麻烦,而每次都需要使用工具一步一步的升级,本文介绍一种编译自动生成的方法,默认读者已经了解新建工程和升级相关的
知识。
步骤:
1 具有boot&app的升级工程,其中在keil工程中可以将app和boot放在一个工作空间中以便查看工程代码和工程设置。
具体如下:
1)项目工程中包含app、boot工程。output文件夹为合并工具自动生成的。
2)app的工程目录如下:主要涉及到obj文件夹,user文件夹,其他不是必须,根据项目裁剪。
3)在E:\我的资料\appbootproject\APP\User中有合并工具MergeTool.bat,此文件工具为批处理文件,需要放在user文件夹中。
4)obj文件夹中放置编译自动生成的工程bin文件,具体生成bin文件的方法可自行查询,本文在后面有提到(fromelf.exe --bin -o "$L@L.bin" "#L")生成。
5) 为了统一工程的目录结构建议设计好app目录后复制一份作为boot的目录。boot的user和obj中也与上面app一样的结构。
2 在E:\我的资料\appbootproject\APP\User 中放置MergeTool.bat文件,并根据工程设置修改MergeTool.bat文件。打开此文件可
以看到一开始就有简单的使用步骤和输出的文件(output文件夹)目录。
在下面的BootFlashSize = 20中修改20,本文设计boot占用20Kbit所以此处为20,其他的修改读者可以在了解脚本文件后自行设置参数。
在第一个图将输出的bin文件修改成对应的工程output选项中的输出文件名,第二个图为app输出的名称,第三个图为boot的名称,第四个图为需要
输出的合成后的输出名称。
第一图
第二图app
第三图boot
第四图output
设置好后再在keil中设置编译时调用此工具(boot中不需要设置与此工具有关的操作,只需要生成的boot.bin放在boot的obj文件夹中),
下面的run#1为编译时生成bin文件的命令,run#2调用$PMergeTool.Bat命令。选择在编译成功后调用。
完成以上步骤后即可编译boot工程生成boot.bin,然后编译appg工程生成ap.bin文件,生成后自动调用工具进行合并。
出现 Merger success!合并并生成Bin文件成功 即合并成功。读者可以自行使用比对工具将原始的bin文件与合并后的bin文件进行比对校验是否成功合并。
如需要交流或者讨论的请回帖与作者联系
最后附上原始代码MergeTool.bat
:: 开/关显示cli信息
@echo off
echo ---------------------------------------------------------------
echo 合并bin工具MergeTool.Bat文件
echo 使用步骤:
echo 【1】 该文件需要放在APP的项目工程文件夹目录下。
echo 【2】 在keil的options选项的user中After Build里填写$PMergeTool.BAT并勾选Run#2。
echo 【3】 在MergeTool.Bat文件中修改app和boot的实际路径
echo 【4】 在MergeTool.Bat文件中填写具体的boot大小"BootFlashSize",单位Kb。
echo 【5】 如有需要可以编辑MergeTool.Bat文件,修改部分参数以适应工程需求。
echo Data: 2017-09-09
echo ---------------------------------------------------------------
::文件夹目录结构示意图:
::┆
::┞┈Project
:: └┈┈┈┈┈┈OutField
:: └┈┈┈┈┈┈DataField-01
:: ┝┈┈┈┈┈┈BootFirmwareField
:: ┝┈┈┈┈┈┈ServerFirmwareField
:: └┈┈┈┈┈┈MergeFirmwareField
:: └┈┈┈┈┈┈DataField-02
:: ┝┈┈┈┈┈┈BootFirmwareField
:: ┝┈┈┈┈┈┈ServerFirmwareField
:: └┈┈┈┈┈┈MergeFirmwareField
::<-----获取本.bat文件所在目录并截取上两级的目录----->
if %cd%==%cd:~,3% echo 当前目录已经是%cd:~,1%盘的根目录!&goto end
cd..
set "ProjectPath0=%cd%"
cd..
set "ProjectPath=%cd%"
if "%ProjectPath%"=="%ProjectPath0%" (echo 上一级目录是: %cd:~,1%盘的根目录!)
:end
::echo Project目录: %ProjectPath%
echo 【一、 定义变量】
::<-----定义指定工程下的app和boot的.bin文件路径----->
set AppFile=%ProjectPath%\APP\OBJ\A8-App.bin
set BootFile=%ProjectPath%\Boot\OBJ\Bootloader.bin
set MergeName=Merge-V1.0.bin
::<-----定义BootFlashSiz指定Boot所占的文件大小----->
set /a BootFlashSize = 20
::<-----定义自动生成由时间组成的文件夹名称字段DataField,列:2020-11-23-11-31-28----->
set DataField=%date:~0,4%-%date:~5,2%-%date:~8,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
::<-----定义文件夹名称字段OutField=Output----->
set OutField=Output
set BootFirmwareField=Boot烧录固件
set ServerFirmwareField=服务器升级固件
set MergeFirmwareField=生产烧录固件
::<-----定义Merge为最终生成的生产固件字段----->
set MergeFile="%ProjectPath%\%OutField%\%DataField%\%MergeFirmwareField%\%MergeName%"
::<-----打印出AppFile、BootFile、MergeFile字段(调试使用)----->
:: echo %AppFile%
:: echo %BootFile%
:: echo %MergeFile%
echo 【二、 创建文件夹】
::<-----创建目标文件夹Output,包含创建服务器、生产、Boot所需的文件夹----->
if not exist %ProjectPath%\%OutField% mkdir %ProjectPath%\%OutField%
if not exist %ProjectPath%\%OutField%\%DataField% mkdir "%ProjectPath%\%OutField%\%DataField%"
mkdir "%ProjectPath%\%OutField%\%DataField%\%ServerFirmwareField%"
mkdir "%ProjectPath%\%OutField%\%DataField%\%MergeFirmwareField%"
mkdir "%ProjectPath%\%OutField%\%DataField%\%BootFirmwareField%"
echo 【三、 复制文件】
::<-----将工程下的boot和app的bin文件分别复制到对应的文件夹----->
copy %AppFile% "%ProjectPath%\%OutField%\%DataField%\%ServerFirmwareField%"
copy %BootFile% "%ProjectPath%\%OutField%\%DataField%\%BootFirmwareField%"
::<-----准备boot文件 空bin文件撑开不需要写部分,size取决于app在flash起始地址之前的空间大小----->
set /a bootsize = %BootFlashSize%*1024
for %%a in (%BootFile%) do set /a size="%bootsize%"-%%~za
echo Boot文件大小:【%BootFlashSize% Kb】
fsutil file createnew temp.bin %size%
copy /b %BootFile% + temp.bin boot.bin
echo 【四、 合并文件】
::<-----生成合并文件----->
copy /b boot.bin + %AppFile% %MergeFile%
echo 【五、 删除临时文件】
::<-----删除临时文件----->
del temp.bin
del boot.bin
::<-----检查执行成功与否----->
if exist %MergeFile% (goto success) else goto failure
:success
echo ***************************************************
echo Merger success!合并并生成Bin文件成功
echo ***************************************************
::Pause
exit
:failure
echo ***************************************************
echo Merger failure!合并并生成Bin文件失败
echo ***************************************************
::Pause
exit
|