博客專欄

        EEPW首頁 > 博客 > CRC校驗 | 程序如何檢查自身完整性?(2)

        CRC校驗 | 程序如何檢查自身完整性?(2)

        發布人:魚鷹談單片機 時間:2021-08-12 來源:工程師 發布文章

        這樣可以保證,一定能夠正確下載 HEX 文件,而不是下載默認的 axf 文件。

        否則,下載的默認 axf 文件會因為 CRC 未修改,程序將不斷重啟。

        完整的修改(可以自行對比官方例程文件):

        @echo off
        ECHO Computing CRC
        ECHO -------------------------------------
        REM Batch script for generating CRC in KEIL project
        REM Must be placed at MDK-ARM folder (project folder)
        REM Path configuration
        SET SREC_PATH=C:\SREC
        SET MAP_NAME=STM3210C_EVAL
        SET MAP_PATH=STM3210C_EVAL
        SET TARGET_NAME=STM3210C_EVAL
        SET TARGET_PATH=STM3210C_EVAL
        SET BYTE_SWAP=1
        SET COMPARE_HEX=1
        SET CRC_ADDR_FROM_MAP=1
        REM Not used when CRC_ADDR_FROM_MAP=1
        SET CRC_ADDR=0x08007ce0
        REM Derived configuration
        SET HEX_ADRR=0x08000000
        SET MAP_FILE=%MAP_PATH%\%MAP_NAME%.map
        SET AXF_FILE=%TARGET_PATH%\%MAP_NAME%.axf
        SET INPUT_HEX=%TARGET_PATH%\%TARGET_NAME%.hex
        SET OUTPUT_HEX=%TARGET_PATH%\%TARGET_NAME%_CRC.hex
        SET OUTPUT_BIN=.\%TARGET_NAME%_CRC.bin
        SET TMP_FILE=crc_tmp_file.txt
        if not exist %SREC_PATH%\srec_cat.exe (
            echo %SREC_PATH% is not exit, exit
            echo ----------------------------------------del %INPUT_HEX% -- %AXF_FILE% ---------------
            del %INPUT_HEX% %AXF_FILE%
            exit
        )
        IF NOT "%CRC_ADDR_FROM_MAP%"=="1" goto:end_of_map_extraction
        REM Extract CRC address from MAP file
        REM -----------------------------------------------------------
        REM Load line with checksum location to crc_search variable
        ECHO Extracting CRC address from MAP file
        FINDSTR /R /C:"^  *CHECKSUM" %MAP_FILE%>%TMP_FILE%
        SET /p crc_search=<%TMP_FILE%
        DEL %TMP_FILE%
        REM remove '(' character and string after, which causes errors
        for /f "tokens=1 delims=(" %%a in ("%crc_search%") do set crc_search=%%a
        REM remove CHECKSUM string from variable
        SET crc_search=%crc_search:CHECKSUM=%
        REM get first word at line, which should be CRC address in HEX format
        for /f "tokens=1 delims= " %%a in ("%crc_search%") do set CRC_ADDR=%%a
        REM -----------------------------------------------------------
        REM End of CRC address extraction
        :end_of_map_extraction
        REM Compute CRC and store it to new HEX file
        ECHO CRC address: %CRC_ADDR%
        if "%BYTE_SWAP%"=="1" (
        REM ECHO to see what is going on
        ECHO %SREC_PATH%\srec_cat.exe ^
          %INPUT_HEX% -intel ^
          -crop %HEX_ADRR% %CRC_ADDR% ^
          -byte_swap 4 ^
          -stm32-b-e %CRC_ADDR% ^
          -byte_swap 4 ^
          -o %TMP_FILE% -intel  
        %SREC_PATH%\srec_cat.exe ^
          %INPUT_HEX% -intel ^
          -crop %HEX_ADRR% %CRC_ADDR% ^
          -byte_swap 4 ^
          -stm32-b-e %CRC_ADDR% ^
          -byte_swap 4 ^
          -o %TMP_FILE% -intel  
        ) else (
        REM ECHO to see what is going on
        ECHO %SREC_PATH%\srec_cat.exe ^
          %INPUT_HEX% -intel ^
          -crop %HEX_ADRR% %CRC_ADDR% ^
          -stm32-l-e %CRC_ADDR% ^
          -o %TMP_FILE% -intel
        %SREC_PATH%\srec_cat.exe ^
          %INPUT_HEX% -intel ^
          -crop %HEX_ADRR% %CRC_ADDR% ^
          -stm32-l-e %CRC_ADDR% ^
          -o %TMP_FILE% -intel
        )
        ECHO %SREC_PATH%\srec_cat.exe ^
          %INPUT_HEX% -intel -exclude -within %TMP_FILE% -intel ^
          %TMP_FILE% -intel ^
          -o %OUTPUT_HEX% -intel
        %SREC_PATH%\srec_cat.exe ^
          %INPUT_HEX% -intel -exclude -within %TMP_FILE% -intel ^
          %TMP_FILE% -intel ^
          -o %OUTPUT_HEX% -intel
        REM Delete temporary file
        DEL %TMP_FILE%
        ECHO Modified HEX file with CRC stored at %OUTPUT_HEX%
        REM Compare input HEX file with output HEX file
        if "%COMPARE_HEX%"=="1" (
        ECHO Comparing %INPUT_HEX% with %OUTPUT_HEX%
        %SREC_PATH%\srec_cmp.exe ^
          %INPUT_HEX% -intel %OUTPUT_HEX% -intel -v
        )
        del %INPUT_HEX%
        ECHO %SREC_PATH%\srec_cat.exe ^
          %OUTPUT_HEX% -intel -offset -%HEX_ADRR% -o %OUTPUT_BIN% -binary
        %SREC_PATH%\srec_cat.exe ^
          %OUTPUT_HEX% -intel -offset -%HEX_ADRR% -o %OUTPUT_BIN% -binary
        ECHO -------------------------------------

        3、 CRC 計算部分代碼(摘自官方例程)

        完整計算

        7.png

        分小塊計算

        8.png

        需要注意的是,每次全部檢查完之后得復位一下 CRC 外設,否則會繼續用之前的結果繼續計算。

        4、工程配置

        準備好前面的內容后,即可進行工程配置。

        生成 HEX

        9.png

        使用 debug 按鈕時下載的文件:

        crc_load.ini (需要根據自己的工程自行修改)

        10.png

        特別注意里面的雙反斜杠,沒有它,將找不到正確路徑。這里以工程文件(.uvprojx)所在路徑為相對路徑。

        11.png

        使用 load 按鈕時下載配置:

        12.png

        不然你下載(點擊 load)的時候,就會下載默認的 axf 文件,而 axf 里面的 CRC 值也是默認的,并沒有被修改,所以這一步也是必須的。

        使用修改的分散加載文件,這可以保證我們的 CRC 存放位置在代碼最后面。

        13.png

        最后一步,當編譯完成后,讓工具幫我們自動計算 CRC 值,并將值修改到 HEX 文件里面。

        添加我們前面的批處理文件:

        14.png

        這樣所有的工程配置就完成了。

        效果

        我們可以看看效果。

        首先,我們并沒有添加工具,我們可以看到,腳本自動退出了,并且刪除了 hex 文件和 axf 文件,這樣就不會下載錯誤的 HEX 文件了(點擊下載會發現找不到 axf 文件)。

        15.png16.png

        當我們在 C 盤添加工具后編譯:

        17.png

        從這里我們可以得到幾點信息:

        1、計算范圍 0x08000000 ~ 0x08007640。

        2、CRC 存放位置在 0x08007640,四個字節

        3、可以使用 srec_cmp.exe 比較兩個 HEX 文件的區別(修改前和修改后)。這里的區別在 0x08007640 ~ 0x8007643。

        4、生成的 bin 文件和 hex 文件相對存放路徑。

        18.png

        大功告成!

        工具命令解釋

        現在我們可以從這里了解到三個命令。

        C:\SREC\srec_cat.exe   STM3210C_EVAL\STM3210C_EVAL.hex -intel   -crop 0x08000000 0x08007640   -byte_swap 4   -stm32-b-e 0x08007640   -byte_swap 4   -o crc_tmp_file.txt -intel

        這個命令用于截取 0x08000000~0x08007640 的內容并計算 CRC 值,并且在 0x08007640 位置處寫入 CRC 值。0x08007640 由 map 文件得出,即 __Check_Sum 的地址。

        19.png

        C:\SREC\srec_cat.exe STM3210C_EVAL\STM3210C_EVAL.hex -intel -exclude -within crc_tmp_file.txt -intel   crc_tmp_file.txt -intel -o STM3210C_EVAL\STM3210C_EVAL_CRC.hex -intel

        該命令用于將兩個 HEX 文件合并,如果以 crc_tmp_file.txt 文件為基準,即同一個地址的值如果不同,則保留 crc_tmp_file.txt 里面的(里面有正確的 CRC),-intel 代表 HEX 文件類型。

        C:\SREC\srec_cmp.exe   STM3210C_EVAL\STM3210C_EVAL.hex -intel STM3210C_EVAL\STM3210C_EVAL_CRC.hex -intel -v

        終于搞定啦,可以放下這個了。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

        斷路器相關文章:斷路器原理


        高壓真空斷路器相關文章:高壓真空斷路器原理
        漏電斷路器相關文章:漏電斷路器原理


        關鍵詞: 單片機

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 江陵县| 阳东县| 政和县| 海淀区| 宕昌县| 巢湖市| 砀山县| 成武县| 邓州市| 内黄县| 封丘县| 柘城县| 镇平县| 安溪县| 将乐县| 手机| 香格里拉县| 南漳县| 靖宇县| 乳源| 安多县| 禹城市| 鸡西市| 金川县| 灵璧县| 江口县| 嵊泗县| 九龙坡区| 阜阳市| 义马市| 陇南市| 邢台县| 凤凰县| 安顺市| 土默特左旗| 分宜县| 舞阳县| 周宁县| 绥宁县| 郁南县| 临沂市|