大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是開啟 CRC 完整性校驗(yàn)的 IAR 工程生成 .out 和 .bin 文件先后順序問題。
痞子衡之前寫了一篇 《在 IAR 開發(fā)環(huán)境下為工程開啟 CRC 完整性校驗(yàn)功能的方法》,有同事在使用 CRC 校驗(yàn)功能時(shí)遇到了關(guān)于 .out/.bin 文件先后生成順序的問題。我們?cè)诰€調(diào)試 IAR 工程時(shí),調(diào)試器下載的其實(shí)是可執(zhí)行文件(.out),CRC 校驗(yàn)功能在 .out 文件里沒有任何歧義,但是更多時(shí)候我們會(huì)使用鏡像文件(.bin)來(lái)下載量產(chǎn),有時(shí)候 CRC 校驗(yàn)功能在 .bin 文件里卻沒有正常開啟,這是怎么回事?痞子衡為你解惑:
一、使用 IAR 生成鏡像文件
拋開 CRC 完整性校驗(yàn)功能,以一個(gè)正常嵌入式工程來(lái)說(shuō),比如 SDK_2.8.2_FRDM-K64Fboardsfrdmk64fdemo_appshello_worldiar,這個(gè)工程正常編譯鏈接后一定會(huì)生成 .out 可執(zhí)行文件(其實(shí)就是標(biāo)準(zhǔn) .elf 文件)。如果我們希望同時(shí)能生成一個(gè) .bin 鏡像文件,需要借助工程選項(xiàng) Output Converter:
?
在 Output Converter 可以指定生成鏡像文件格式,常見的鏡像格式(.bin/hex/.s19)都支持。如果你了解 IAR 你應(yīng)該知道這個(gè)功能其實(shí)是調(diào)用 IAR SystemsEmbedded Workbench 8.50.6armbinielftool.exe 工具實(shí)現(xiàn)的:
ielftool --bin sourceFile.out destinationFile.bin
ielftool --ihex sourceFile.out destinationFile.hex
ielftool --srec sourceFile.out destinationFile.s19
我們編譯工程看一下編譯信息,從日志輸出順序來(lái)看,首先生成了 hello_world.out(藍(lán)色框標(biāo)出),然后調(diào)用了 ielftool 工具執(zhí)行轉(zhuǎn)換命令(綠色框標(biāo)出),最后生成了 hello_world.bin(紅色框標(biāo)出):
?
二、比較兩種 CRC 校驗(yàn)開啟方法
《在 IAR 開發(fā)環(huán)境下為工程開啟 CRC 完整性校驗(yàn)功能的方法》 一文中介紹了兩種開啟 CRC 完整性校驗(yàn)功能的方法,我們從生成 .out/.bin 文件順序的角度來(lái)分析一次結(jié)果:
2.1 基于 Checksum 功能
分析開啟 Checksum 功能的工程編譯結(jié)果,可以發(fā)現(xiàn)日志輸出順序如下:
1. 調(diào)用 ielftool 實(shí)現(xiàn)添加 CRC 校驗(yàn)功能(藍(lán)色框)
2. 生成了包含正確 CRC 校驗(yàn)值的 .out 文件(綠色框)
3. 調(diào)用 ielftool 實(shí)現(xiàn)文件格式轉(zhuǎn)換(紅色框)
4. 生成了包含正確 CRC 校驗(yàn)值的 .bin 文件(黃色框)
這種情況下,.out 文件和 .bin 文件雖然生成先后順序不同,但都包含了正確的 CRC 校驗(yàn)值,因此在 CRC 驗(yàn)證使用上是一致的。
2.2 基于 Post-build 功能
再來(lái)分析開啟 Post-build 功能的工程編譯結(jié)果,可以發(fā)現(xiàn)日志輸出順序如下:
1. 生成了默認(rèn) CRC 校驗(yàn)值的 .out 文件(藍(lán)色框)
2. 調(diào)用 ielftool 實(shí)現(xiàn)文件格式轉(zhuǎn)換(綠色框)
3. 生成了包含默認(rèn) CRC 校驗(yàn)值的 .bin 文件(紅色框)
4. 調(diào)用 ielftool 實(shí)現(xiàn)添加 CRC 校驗(yàn)功能(黃色框)
5. 生成了包含正確 CRC 校驗(yàn)值的 .out 文件(紫色框)
這種情況下,.out 文件和 .bin 文件生成先后順序不同,但是 .bin 里只是默認(rèn)的 CRC 校驗(yàn)值(全 0),并不是期望的正確 CRC 校驗(yàn)值,因此無(wú)法用于后面的 CRC 驗(yàn)證,這也是我同事遇到的問題。
三、解決 Post-build 下 .bin/.out 一致性問題
現(xiàn)在讓我們來(lái)解決我同事遇到的 Post-build 下 .bin 和 .out 里 CRC 校驗(yàn)值不一致問題,顯然無(wú)法直接使用工程選項(xiàng) Output Converter 功能了,因?yàn)樗?IAR 里執(zhí)行順序沒法改變。
我們需要額外寫一個(gè)如下 post-build.bat 腳本,在 bat 腳本里實(shí)現(xiàn) CRC 校驗(yàn)功能添加以及文件格式轉(zhuǎn)換,這樣我們就能控制文件生成順序。
set?OUT=%1.out
set?BIN=%1.bin
ielftool?--fill="0xFF;__checksum_begin-__checksum_end"?--checksum="__checksum:4,crc32:p,0xffffffff;__checksum_begin-__checksum_end"?--verbose?%OUT%?%OUT%
ielftool?--bin?--verbose?%OUT%?%BIN%
將 post-build.bat 腳本放到工程文件同路徑下,并重新使用 Post-build 來(lái)執(zhí)行這個(gè)腳本,傳入腳本的參數(shù)是,即不含工程目標(biāo)文件后綴的全路徑,再次編譯工程后就可以得到包含正確 CRC 校驗(yàn)值的 .bin 文件了,問題解決,大功告成!
?
備注:post-build.bat 腳本正常執(zhí)行的前提是,ielftool 工具的路徑需要在系統(tǒng)環(huán)境變量里。
至此,開啟 CRC 完整性校驗(yàn)的 IAR 工程生成 .out 和 .bin 文件先后順序問題痞子衡便介紹完畢了,掌聲在哪里~~~