找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2751|回復(fù): 0
收起左側(cè)

基于KEIL的合并boot.bin&app.bin的腳本文件

[復(fù)制鏈接]
ID:151861 發(fā)表于 2021-9-18 11:07 | 顯示全部樓層 |閱讀模式
在設(shè)計(jì)一個(gè)項(xiàng)目或者系統(tǒng)時(shí),一般為了此項(xiàng)目在正式運(yùn)行階段不需要拆機(jī)甚至不允許拆機(jī)的情況下,很有必要設(shè)計(jì)項(xiàng)目可以進(jìn)行遠(yuǎn)程升級(jí),
所以項(xiàng)目工程一般設(shè)計(jì)boot和app,讓boot能夠?qū)pp升級(jí)達(dá)到更新或者修復(fù)bug功能。

一開(kāi)始需要燒錄boot.bin,再升級(jí)app時(shí)經(jīng)常需要編譯生成app.bin文件作為升級(jí)的文件,但是在工廠燒錄階段一般使用一個(gè)bin文件燒錄,
分兩次燒錄太麻煩,而每次都需要使用工具一步一步的升級(jí),本文介紹一種編譯自動(dòng)生成的方法,默認(rèn)讀者已經(jīng)了解新建工程和升級(jí)相關(guān)的
知識(shí)。

步驟:
1 具有boot&app的升級(jí)工程,其中在keil工程中可以將app和boot放在一個(gè)工作空間中以便查看工程代碼和工程設(shè)置。

1.png
具體如下:
      1)項(xiàng)目工程中包含app、boot工程。output文件夾為合并工具自動(dòng)生成的。
2.png

      2)app的工程目錄如下:主要涉及到obj文件夾,user文件夾,其他不是必須,根據(jù)項(xiàng)目裁剪。
3.png
      3)在E:\我的資料\appbootproject\APP\User中有合并工具M(jìn)ergeTool.bat,此文件工具為批處理文件,需要放在user文件夾中。

      4)obj文件夾中放置編譯自動(dòng)生成的工程bin文件,具體生成bin文件的方法可自行查詢,本文在后面有提到(fromelf.exe --bin -o "$L@L.bin" "#L")生成。
4.png

      5) 為了統(tǒng)一工程的目錄結(jié)構(gòu)建議設(shè)計(jì)好app目錄后復(fù)制一份作為boot的目錄。boot的user和obj中也與上面app一樣的結(jié)構(gòu)。



2 在E:\我的資料\appbootproject\APP\User 中放置MergeTool.bat文件,并根據(jù)工程設(shè)置修改MergeTool.bat文件。打開(kāi)此文件可
以看到一開(kāi)始就有簡(jiǎn)單的使用步驟和輸出的文件(output文件夾)目錄。

5.png

在下面的BootFlashSize = 20中修改20,本文設(shè)計(jì)boot占用20Kbit所以此處為20,其他的修改讀者可以在了解腳本文件后自行設(shè)置參數(shù)。

5.png

在第一個(gè)圖將輸出的bin文件修改成對(duì)應(yīng)的工程output選項(xiàng)中的輸出文件名,第二個(gè)圖為app輸出的名稱,第三個(gè)圖為boot的名稱,第四個(gè)圖為需要
輸出的合成后的輸出名稱。
6.png


第一圖
7.png

第二圖app

8.png
第三圖boot
11.png
第四圖output


設(shè)置好后再在keil中設(shè)置編譯時(shí)調(diào)用此工具(boot中不需要設(shè)置與此工具有關(guān)的操作,只需要生成的boot.bin放在boot的obj文件夾中),
下面的run#1為編譯時(shí)生成bin文件的命令,run#2調(diào)用$PMergeTool.Bat命令。選擇在編譯成功后調(diào)用。


9.png

完成以上步驟后即可編譯boot工程生成boot.bin,然后編譯appg工程生成ap.bin文件,生成后自動(dòng)調(diào)用工具進(jìn)行合并。

10.png

出現(xiàn)       Merger success!合并并生成Bin文件成功  即合并成功。讀者可以自行使用比對(duì)工具將原始的bin文件與合并后的bin文件進(jìn)行比對(duì)校驗(yàn)是否成功合并。


如需要交流或者討論的請(qǐng)回帖與作者聯(lián)系


最后附上原始代碼MergeTool.bat

:: 開(kāi)/關(guān)顯示cli信息
@echo off

echo ---------------------------------------------------------------
echo                        合并bin工具M(jìn)ergeTool.Bat文件            
echo 使用步驟:
echo 【1】 該文件需要放在APP的項(xiàng)目工程文件夾目錄下。
echo 【2】 在keil的options選項(xiàng)的user中After Build里填寫$PMergeTool.BAT并勾選Run#2。
echo 【3】 在MergeTool.Bat文件中修改app和boot的實(shí)際路徑
echo 【4】 在MergeTool.Bat文件中填寫具體的boot大小"BootFlashSize",單位Kb。
echo 【5】 如有需要可以編輯MergeTool.Bat文件,修改部分參數(shù)以適應(yīng)工程需求。
echo          Data: 2017-09-09
echo ---------------------------------------------------------------

::文件夾目錄結(jié)構(gòu)示意圖:
::┆
::┞┈Project
::   └┈┈┈┈┈┈OutField
::                └┈┈┈┈┈┈DataField-01
::                              ┝┈┈┈┈┈┈BootFirmwareField
::                              ┝┈┈┈┈┈┈ServerFirmwareField
::                              └┈┈┈┈┈┈MergeFirmwareField
::                └┈┈┈┈┈┈DataField-02
::                              ┝┈┈┈┈┈┈BootFirmwareField
::                              ┝┈┈┈┈┈┈ServerFirmwareField
::                              └┈┈┈┈┈┈MergeFirmwareField

::<-----獲取本.bat文件所在目錄并截取上兩級(jí)的目錄----->
if %cd%==%cd:~,3% echo 當(dāng)前目錄已經(jīng)是%cd:~,1%盤的根目錄!&goto end
cd..
set "ProjectPath0=%cd%"
cd..
set "ProjectPath=%cd%"
if "%ProjectPath%"=="%ProjectPath0%" (echo 上一級(jí)目錄是: %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

::<-----定義自動(dòng)生成由時(shí)間組成的文件夾名稱字段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=服務(wù)器升級(jí)固件
set MergeFirmwareField=生產(chǎn)燒錄固件

::<-----定義Merge為最終生成的生產(chǎn)固件字段----->
set MergeFile="%ProjectPath%\%OutField%\%DataField%\%MergeFirmwareField%\%MergeName%"

::<-----打印出AppFile、BootFile、MergeFile字段(調(diào)試使用)----->
:: echo %AppFile%
:: echo %BootFile%
:: echo %MergeFile%

echo 【二、 創(chuàng)建文件夾】
::<-----創(chuàng)建目標(biāo)文件夾Output,包含創(chuàng)建服務(wù)器、生產(chǎn)、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 【三、 復(fù)制文件】
::<-----將工程下的boot和app的bin文件分別復(fù)制到對(duì)應(yīng)的文件夾----->
copy %AppFile% "%ProjectPath%\%OutField%\%DataField%\%ServerFirmwareField%"
copy %BootFile% "%ProjectPath%\%OutField%\%DataField%\%BootFirmwareField%"

::<-----準(zhǔn)備boot文件 空bin文件撐開(kāi)不需要寫部分,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 【五、 刪除臨時(shí)文件】
::<-----刪除臨時(shí)文件----->
del temp.bin
del boot.bin

::<-----檢查執(zhí)行成功與否----->
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

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表