前端時(shí)間回來(lái)了一塊板子,于是各個(gè)團(tuán)隊(duì)都進(jìn)入了緊張的 Bringup 工作中。
這塊板子上的主芯片是一顆 Arm Cortex M3 + DSP 的異構(gòu)芯片,結(jié)構(gòu)大概是這樣的:
CM3 和 DSP 的固件獨(dú)立存儲(chǔ)在 Flash 中,上電后 CM3 先啟動(dòng),然后 CM3 再把 DSP 的固件從 Flash 中加載到 Sram 中,最后再?gòu)?Sram 中拷貝到 DSP 的 ITCM 中,至于為什么不繞過(guò) Sram 直接把 DSP 的固件從 Flash 中讀到 DSP 的 ITCM 中,我們這里先不討論。
Bringup 進(jìn)行到第二天的時(shí)候,負(fù)責(zé) DSP 的同學(xué)反饋說(shuō),DSP 的程序加載上去后,始終不能正常運(yùn)行 —— 觀(guān)察不到任何正常啟動(dòng)的現(xiàn)象。其實(shí)在 Bringup 剛開(kāi)始階段,這種情況是經(jīng)常遇到的,我第一反應(yīng)就是,讓這位同學(xué)連上 DSP 的 JTAG 去單步調(diào)試,看到底發(fā)生了什么。
第三天的時(shí)候,我又找這位同學(xué)問(wèn)了下,現(xiàn)在是什么情況了,這位同學(xué)一臉茫然的說(shuō):好奇怪,如果用 DSP 的 JTAG 直接下載固件到 ITCM,就能正常運(yùn)行,通過(guò) Cortex M3 去加載,就不能正常運(yùn)行。聽(tīng)到這個(gè)差別,我潛意識(shí)的問(wèn)他:有沒(méi)有確認(rèn)過(guò) CM3 加載到 ITCM 中的固件是否正常?這位同學(xué)說(shuō)應(yīng)該不會(huì)有問(wèn)題,這套流程他們之前在其他平臺(tái)上都驗(yàn)證過(guò)。他們還有一些其他的壞一點(diǎn),準(zhǔn)備優(yōu)先就他們的懷疑點(diǎn)做一些實(shí)驗(yàn)排查,比如 DSP 的cache 啊,復(fù)位控制啊,PLL 頻率啊什么的。
因?yàn)?Bringup 階段事情比較多,我也就沒(méi)在追究去忙其他的事情了。
第四天,說(shuō)所有懷疑的實(shí)驗(yàn)都做完了,還是沒(méi)進(jìn)展。我說(shuō)確認(rèn)下 CM3 拷貝到 ITCM 里面的固件是否正常吧 —— CM3 把固件拷貝到 ITCM 后,在用 JTAG 讀出來(lái),然后對(duì)比。
實(shí)驗(yàn)做完,這位同學(xué)蔫蔫的說(shuō),從 ITCM 中讀出來(lái)的固件數(shù)據(jù)和編譯出來(lái)的固件數(shù)據(jù)有一小部分對(duì)不上。而且這部分對(duì)上的數(shù)據(jù)位于固件尾巴上。
固件加載出錯(cuò),程序肯定無(wú)法正常運(yùn)行!那就直接排查數(shù)據(jù)在哪個(gè)環(huán)節(jié)出錯(cuò)的吧!
固件從 Flash 中加載到 Sram 中后,也用 JTAG 讀出來(lái)和原始數(shù)據(jù)對(duì)比,結(jié)果正常!
那就是從 Sram 到 ITCM 的這個(gè)環(huán)節(jié)處了問(wèn)題!
查看這段拷貝的代碼,原來(lái)就是一個(gè) rt_memcpy —— 我們?cè)?Cortex M3 上運(yùn)行的是 RT-Thread。
這位同學(xué)用 JLink 單步跟蹤這段代碼發(fā)現(xiàn),每次程序運(yùn)行到第二部分的時(shí)候,拷貝就異常了,能看到程序執(zhí)行了,但是數(shù)據(jù)就是沒(méi)拷貝過(guò)去!而第一段的拷貝都是正常的。
事出異常必有妖,我決定反匯編看看這段代碼后面藏了什么玄機(jī)。
果真有貓膩,第一段代碼,對(duì)于大塊的 4 字節(jié)對(duì)齊的數(shù)據(jù),CPU 是以 STR 這樣的指令超 ITCM 寫(xiě)數(shù)據(jù),即以 Word 為單位訪(fǎng)問(wèn) ITCM,對(duì)于第二段,也就是一段數(shù)據(jù)的尾巴,剩下的那些零零散的不夠四字節(jié)的數(shù)據(jù),CPU 是以 STRB 這樣的指令超 ITCM 寫(xiě)數(shù)據(jù),即以字節(jié)為單位訪(fǎng)問(wèn) ITCM。
memcpy 這樣寫(xiě)是為了提高數(shù)據(jù)搬運(yùn)的效率。對(duì)于按照 Word 對(duì)齊的數(shù)據(jù),以 Word 的模式搬運(yùn),對(duì)于剩下的非Word 對(duì)齊的數(shù)據(jù),以 Byte 模式搬運(yùn),一次搬運(yùn)四字節(jié)肯定比一次搬運(yùn)一字節(jié)要快。
但是我們這里踩了什么坑呢?以 Word 方式訪(fǎng)問(wèn) ITCM 就正常,以 Byte 的方式訪(fǎng)問(wèn)就不成功?
為了進(jìn)一步確認(rèn)這個(gè)結(jié)論,我寫(xiě)了一段測(cè)試代碼:
這段測(cè)試代碼構(gòu)造了一個(gè) memcpy 命令,我可以在命令行通過(guò) memcpy cnt value 來(lái)控制每次超 ITCM 搬運(yùn)不同長(zhǎng)度的數(shù)據(jù),下面就開(kāi)始測(cè)試:
一次寫(xiě) 16 字節(jié)的 1 到 ITCM,然后通過(guò) Jlink 可以看到 ITCM 這片區(qū)域被成功的寫(xiě)入了 16 字節(jié)的 1。因?yàn)?16 是 4 個(gè) 4 字節(jié),所以這次的 memcpy 是通過(guò) STR 指令進(jìn)行的。
一次 copy 17 字節(jié)的 2 到 ITCM, 通過(guò) JLink 觀(guān)察右下角的 ITCM,發(fā)現(xiàn)只寫(xiě)進(jìn)去了 16 字節(jié)。根據(jù) memcpy 算法,前 16 字節(jié) 是以 Word 的形式通過(guò) STR 指令寫(xiě)入 ITCM 的,剩下的 一 字節(jié) 是以 STRB 的形式寫(xiě)入 ITCM 的。
一次 Copy 18 字節(jié),同樣發(fā)現(xiàn)只寫(xiě)進(jìn)去了 16 字節(jié)。
一次 Copy 19 字節(jié),還是只寫(xiě)進(jìn)去了 16 字節(jié)!
一次 Copy 20 字節(jié),全部寫(xiě)入成功了!按照 memcpy 算法,20 字節(jié)是以 五次 STR 指令,以 Word 模式拷貝過(guò)去的。
一次 Copy 21 字節(jié),發(fā)現(xiàn)還是只寫(xiě)入了 20 字節(jié)!
一次 Copy 24 字節(jié),全部拷貝成功!
到這里,我基本確認(rèn) Cortex M3 以 Byte 模式訪(fǎng)問(wèn) ITCM 會(huì)失敗!
然后聯(lián)系 IC 設(shè)計(jì)方,確認(rèn)是什么原因。IC 設(shè)計(jì)方回復(fù)說(shuō):Cortex M3 確實(shí)無(wú)法以 Byte 模式訪(fǎng)問(wèn) ITCM,這是總線(xiàn)設(shè)計(jì)上限制的!
艾瑪呀!忽然有種想打人的沖動(dòng),你文檔上根本沒(méi)提有這個(gè)限制?。?/p>
后來(lái)想想,在無(wú)數(shù)次的 Bringup 過(guò)程中,類(lèi)似這種固件拷貝不完整的情況,似乎坑過(guò)我好幾次,有一次 Linux 內(nèi)核起來(lái)后,很多驅(qū)動(dòng)都加載失敗,我一路從 Linux Kernel 查找到 U-Boot,再查到下載,最后確認(rèn)是固件下載工具有問(wèn)題,DTB 沒(méi)有下載完整,而且這尼瑪也是因?yàn)?flash 扇區(qū)對(duì)齊的問(wèn)題導(dǎo)致的!還有一次從 U-Boot SPL 跳到 Arm turst firmware 后,總是卡死固定的位置,然后 Dump 發(fā)現(xiàn) ATF 固件加載不完整,最后確認(rèn)是 CLK 驅(qū)動(dòng)問(wèn)題引起 eMMC 工作異常導(dǎo)致的。
-
dsp
+關(guān)注
關(guān)注
556文章
8157瀏覽量
357413 -
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4531瀏覽量
87437 -
固件
+關(guān)注
關(guān)注
10文章
566瀏覽量
23903
原文標(biāo)題:固件下下去,板子沒(méi)反應(yīng),我也很絕望啊
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
CX3無(wú)法將固件加載到SPI閃存如何解決?
無(wú)法將固件刻錄到PFlash的原因?怎么解決?
求助,CYBT-243053-02 EZ固件問(wèn)題求解
STM32IDE如何設(shè)定代碼到ITCM中運(yùn)行?
USB 3.0CX3中的輔助引導(dǎo)加載程序后無(wú)法識(shí)別怎么解決?
如何使用Keil將二進(jìn)制文件加載到外部SPI Flash中?
將指定文件下的函數(shù)加載到指定ram問(wèn)題
STM32H743對(duì)關(guān)鍵中斷函數(shù),使用ITCM搬至RAM運(yùn)行,仿真進(jìn)入HardFault_Handler報(bào)錯(cuò)怎么解決?
DLP4500-C350REF I2C燒錄固件異常的原因?
使用wavevison5軟件時(shí),F(xiàn)PGA中的程序是在線(xiàn)加載的,CY7C68013A中的固件也是在線(xiàn)加載的嗎?
Purepath studio生成的ASM文件有好幾個(gè) ,應(yīng)該選擇哪個(gè)文件加載到工程文件中?
如何測(cè)試光纖是否正常
如何判斷繼電器是否正常工作
MSPM0實(shí)時(shí)固件更新(LFU)引導(dǎo)加載程序?qū)嵤?/a>

評(píng)論