一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CM3加載到 ITCM中的固件是否正常

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-07-22 09:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前端時間回來了一塊板子,于是各個團隊都進入了緊張的 Bringup 工作中。

這塊板子上的主芯片是一顆 Arm Cortex M3 + DSP 的異構(gòu)芯片,結(jié)構(gòu)大概是這樣的:

ae4ccc36-06f8-11ed-ba43-dac502259ad0.png

CM3 和 DSP 的固件獨立存儲在 Flash 中,上電后 CM3 先啟動,然后 CM3 再把 DSP 的固件從 Flash 中加載到 Sram 中,最后再從 Sram 中拷貝到 DSP 的 ITCM 中,至于為什么不繞過 Sram 直接把 DSP 的固件從 Flash 中讀到 DSP 的 ITCM 中,我們這里先不討論。

Bringup 進行到第二天的時候,負責 DSP 的同學反饋說,DSP 的程序加載上去后,始終不能正常運行 —— 觀察不到任何正常啟動的現(xiàn)象。其實在 Bringup 剛開始階段,這種情況是經(jīng)常遇到的,我第一反應(yīng)就是,讓這位同學連上 DSP 的 JTAG 去單步調(diào)試,看到底發(fā)生了什么。

第三天的時候,我又找這位同學問了下,現(xiàn)在是什么情況了,這位同學一臉茫然的說:好奇怪,如果用 DSP 的 JTAG 直接下載固件到 ITCM,就能正常運行,通過 Cortex M3 去加載,就不能正常運行。聽到這個差別,我潛意識的問他:有沒有確認過 CM3 加載到 ITCM 中的固件是否正常?這位同學說應(yīng)該不會有問題,這套流程他們之前在其他平臺上都驗證過。他們還有一些其他的壞一點,準備優(yōu)先就他們的懷疑點做一些實驗排查,比如 DSP 的cache 啊,復(fù)位控制啊,PLL 頻率啊什么的。

因為 Bringup 階段事情比較多,我也就沒在追究去忙其他的事情了。

第四天,說所有懷疑的實驗都做完了,還是沒進展。我說確認下 CM3 拷貝到 ITCM 里面的固件是否正常吧 —— CM3 把固件拷貝到 ITCM 后,在用 JTAG 讀出來,然后對比。

實驗做完,這位同學蔫蔫的說,從 ITCM 中讀出來的固件數(shù)據(jù)和編譯出來的固件數(shù)據(jù)有一小部分對不上。而且這部分對上的數(shù)據(jù)位于固件尾巴上。

固件加載出錯,程序肯定無法正常運行!那就直接排查數(shù)據(jù)在哪個環(huán)節(jié)出錯的吧!

固件從 Flash 中加載到 Sram 中后,也用 JTAG 讀出來和原始數(shù)據(jù)對比,結(jié)果正常!

那就是從 Sram 到 ITCM 的這個環(huán)節(jié)處了問題!

查看這段拷貝的代碼,原來就是一個 rt_memcpy —— 我們在 Cortex M3 上運行的是 RT-Thread。

ae5818e8-06f8-11ed-ba43-dac502259ad0.jpg

這位同學用 JLink 單步跟蹤這段代碼發(fā)現(xiàn),每次程序運行到第二部分的時候,拷貝就異常了,能看到程序執(zhí)行了,但是數(shù)據(jù)就是沒拷貝過去!而第一段的拷貝都是正常的。

事出異常必有妖,我決定反匯編看看這段代碼后面藏了什么玄機。

ae657e48-06f8-11ed-ba43-dac502259ad0.jpg

果真有貓膩,第一段代碼,對于大塊的 4 字節(jié)對齊的數(shù)據(jù),CPU 是以 STR 這樣的指令超 ITCM 寫數(shù)據(jù),即以 Word 為單位訪問 ITCM,對于第二段,也就是一段數(shù)據(jù)的尾巴,剩下的那些零零散的不夠四字節(jié)的數(shù)據(jù),CPU 是以 STRB 這樣的指令超 ITCM 寫數(shù)據(jù),即以字節(jié)為單位訪問 ITCM。

memcpy 這樣寫是為了提高數(shù)據(jù)搬運的效率。對于按照 Word 對齊的數(shù)據(jù),以 Word 的模式搬運,對于剩下的非Word 對齊的數(shù)據(jù),以 Byte 模式搬運,一次搬運四字節(jié)肯定比一次搬運一字節(jié)要快。

但是我們這里踩了什么坑呢?以 Word 方式訪問 ITCM 就正常,以 Byte 的方式訪問就不成功?

為了進一步確認這個結(jié)論,我寫了一段測試代碼:

ae75cc3a-06f8-11ed-ba43-dac502259ad0.png

這段測試代碼構(gòu)造了一個 memcpy 命令,我可以在命令行通過 memcpy cnt value 來控制每次超 ITCM 搬運不同長度的數(shù)據(jù),下面就開始測試:

ae860c6c-06f8-11ed-ba43-dac502259ad0.jpg

一次寫 16 字節(jié)的 1 到 ITCM,然后通過 Jlink 可以看到 ITCM 這片區(qū)域被成功的寫入了 16 字節(jié)的 1。因為 16 是 4 個 4 字節(jié),所以這次的 memcpy 是通過 STR 指令進行的。

ae963010-06f8-11ed-ba43-dac502259ad0.jpg

一次 copy 17 字節(jié)的 2 到 ITCM, 通過 JLink 觀察右下角的 ITCM,發(fā)現(xiàn)只寫進去了 16 字節(jié)。根據(jù) memcpy 算法,前 16 字節(jié) 是以 Word 的形式通過 STR 指令寫入 ITCM 的,剩下的 一 字節(jié) 是以 STRB 的形式寫入 ITCM 的。

aea7b628-06f8-11ed-ba43-dac502259ad0.jpg

一次 Copy 18 字節(jié),同樣發(fā)現(xiàn)只寫進去了 16 字節(jié)。

aeb47a2a-06f8-11ed-ba43-dac502259ad0.jpg

一次 Copy 19 字節(jié),還是只寫進去了 16 字節(jié)!

aec132c4-06f8-11ed-ba43-dac502259ad0.jpg

一次 Copy 20 字節(jié),全部寫入成功了!按照 memcpy 算法,20 字節(jié)是以 五次 STR 指令,以 Word 模式拷貝過去的。

aece75e2-06f8-11ed-ba43-dac502259ad0.jpg

一次 Copy 21 字節(jié),發(fā)現(xiàn)還是只寫入了 20 字節(jié)!

aed88a14-06f8-11ed-ba43-dac502259ad0.jpg

一次 Copy 24 字節(jié),全部拷貝成功!

到這里,我基本確認 Cortex M3 以 Byte 模式訪問 ITCM 會失??!

然后聯(lián)系 IC 設(shè)計方,確認是什么原因。IC 設(shè)計方回復(fù)說:Cortex M3 確實無法以 Byte 模式訪問 ITCM,這是總線設(shè)計上限制的!

艾瑪呀!忽然有種想打人的沖動,你文檔上根本沒提有這個限制??!

后來想想,在無數(shù)次的 Bringup 過程中,類似這種固件拷貝不完整的情況,似乎坑過我好幾次,有一次 Linux 內(nèi)核起來后,很多驅(qū)動都加載失敗,我一路從 Linux Kernel 查找到 U-Boot,再查到下載,最后確認是固件下載工具有問題,DTB 沒有下載完整,而且這尼瑪也是因為 flash 扇區(qū)對齊的問題導(dǎo)致的!還有一次從 U-Boot SPL 跳到 Arm turst firmware 后,總是卡死固定的位置,然后 Dump 發(fā)現(xiàn) ATF 固件加載不完整,最后確認是 CLK 驅(qū)動問題引起 eMMC 工作異常導(dǎo)致的。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • dsp
    dsp
    +關(guān)注

    關(guān)注

    556

    文章

    8158

    瀏覽量

    357631
  • 存儲
    +關(guān)注

    關(guān)注

    13

    文章

    4533

    瀏覽量

    87466
  • 固件
    +關(guān)注

    關(guān)注

    10

    文章

    566

    瀏覽量

    23917

原文標題:固件下下去,板子沒反應(yīng),我也很絕望啊

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何將源地址 FCANFDx FiF 0 加載到 DMA 線的 SRC 寄存器?

    您能否提供一個示例,說明如何將源地址 FCANFDx FiF 0 加載到 DMA 線的 SRC 寄存器? 我不想使用固定地址加載,例如: cy_stc_dma_descriptor_t
    發(fā)表于 07-18 08:06

    CX3無法將固件加載到SPI閃存如何解決?

    我無法將固件加載到 SPI 閃存。 步驟如下: 1. 開機,運行 USB 控制中心, 2.點擊boot loader,點擊FX3,然后選擇“SPI flash”。然后USB控制中心顯示“未找到
    發(fā)表于 07-16 07:37

    無法將固件刻錄到PFlash的原因?怎么解決?

    。 據(jù)我所見,加載到 RAM 部分工作正常,當它開始閃存操作時,設(shè)備會凍結(jié)并需要電源循環(huán),并且通常需要通過 miniwiggler 重新編程??啼洐C功能通過鏈接腳本存儲在 RAM ,以允許成功編程
    發(fā)表于 07-15 07:39

    求助,CYBT-243053-02 EZ固件問題求解

    編程器將 EZ 固件加載到 CYBT-243053-02-EVAL,但該主板未列入其套件/探針清單。 請建議正確的方法來對電路板進行編程。 2)。 據(jù)說EZ固件支持的最大MTU為128,我們可以通過軟件增加它嗎。
    發(fā)表于 07-04 07:50

    STM32IDE如何設(shè)定代碼到ITCM運行?

    近期使用STM32MUX生成STM32IDE的代碼(MCU是STM32H743),目前希望可以將部分代碼定位到ITCM運行,加快處理速度,關(guān)于代碼的.id鏈接文件,該部分資料比較少,目前我只
    發(fā)表于 06-24 06:45

    如何使用Keil將二進制文件加載到外部SPI Flash?

    我想知道是否有辦法使用 Keil 將隨機二進制文件加載到外部 SPI 閃存。二進制文件將通過 LPC54102(OM13077 EVK 板)。我知道一些用于 FPGA 的 ISE 允許您執(zhí)行此作
    發(fā)表于 03-17 06:37

    將指定文件下的函數(shù)加載到指定ram問題

    問題:mcuxpresso環(huán)境,xip模式下我需要使用flexspi將norflash的一部分作為文件系統(tǒng),將flex以及fatfs相關(guān)函數(shù)全部加載到ram,發(fā)現(xiàn)rodata仍然在flash地址
    發(fā)表于 03-12 17:02

    STM32H743對關(guān)鍵中斷函數(shù),使用ITCM搬至RAM運行,仿真進入HardFault_Handler報錯怎么解決?

    ,CubeIDE編譯能正常通過,且map文件,對已搬至ITCM RAM區(qū)域運行的中斷函數(shù)的地址是OK的。只要上電一仿真運行就會進入HardFault_Handler函數(shù),MCU主頻是480MHz,不知
    發(fā)表于 03-07 08:04

    DLP4500-C350REF I2C燒錄固件異常的原因?

    測試,無論固件大小是否大于16MB,均可正常燒錄,正常投影。 請協(xié)助分析下原因,并提供下解決思路?。?問題2: 根據(jù)DLPC350手冊,DLPC350內(nèi)部存在2個24bit的buff
    發(fā)表于 02-18 07:11

    使用wavevison5軟件時,F(xiàn)PGA的程序是在線加載的,CY7C68013A固件也是在線加載的嗎?

    我現(xiàn)在沒有使用Wavevison5軟件,而是用JTAG接口把snar019文件夾的FPGA程序直接下載到FPGA,下載之后為什么指示燈顯示的有點不正常,PII_LD和DCLK_L
    發(fā)表于 12-27 08:11

    Purepath studio生成的ASM文件有好幾個 ,應(yīng)該選擇哪個文件加載到工程文件?

    Purepath studio生成的ASM文件有好幾個 ,應(yīng)該選擇哪個文件加載到工程文件? 還有C文件工程如何嵌入這個ASM文件?
    發(fā)表于 10-25 12:40

    如何測試光纖是否正常

    測試光纖是否正常,可以通過多種方法進行,以下是一些常用的測試步驟和方法: 一、觀察指示燈 檢查設(shè)備指示燈 :如果你使用的是帶有指示燈的設(shè)備(如交換機、光模塊、光纖收發(fā)器等),首先觀察指示燈的狀態(tài)
    的頭像 發(fā)表于 09-24 09:35 ?4977次閱讀

    如何判斷繼電器是否正常工作

    判斷繼電器是否正常工作是一個涉及多個方面的過程,主要包括外觀檢查、電氣性能測試以及實際應(yīng)用的表現(xiàn)等。以下將從這些方面詳細闡述如何判斷繼電器是否正常
    的頭像 發(fā)表于 09-10 11:06 ?1912次閱讀

    MSPM0實時固件更新(LFU)引導(dǎo)加載程序?qū)嵤?/a>

    電子發(fā)燒友網(wǎng)站提供《MSPM0實時固件更新(LFU)引導(dǎo)加載程序?qū)嵤?pdf》資料免費下載
    發(fā)表于 08-29 09:58 ?0次下載
    MSPM0實時<b class='flag-5'>固件</b>更新(LFU)引導(dǎo)<b class='flag-5'>加載</b>程序?qū)嵤? />    </a>
</div>                              <div   id=

    如果SPI啟動失敗,如何創(chuàng)建可通過USB啟動的兩階段啟動加載程序?

    ) ------------------------------------------- 你好,我想創(chuàng)建一個引導(dǎo)加載程序,在 SPI 啟動失敗時通過 USB 啟動。 如果閃存固件不正確,設(shè)備應(yīng)能通過 USB
    發(fā)表于 08-01 08:13