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

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

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

IAR下直接下載調(diào)試報(bào)錯(cuò)怎么解決

恩智浦MCU加油站 ? 來(lái)源:恩智浦MCU加油站 ? 作者:恩智浦MCU加油站 ? 2022-05-19 10:49 ? 次閱讀

分散鏈接與加載一直是嵌入式領(lǐng)域比較勸退新手的難題,在恩智浦i.MX RT系列為代表的多存儲(chǔ)器架構(gòu)的MCU上,分散鏈接問(wèn)題體現(xiàn)得尤為明顯,畢竟你在鏈接應(yīng)用程序各種段(section)時(shí)可能會(huì)面對(duì)包括內(nèi)部ITCM/DTCM/OCRAM和外部 Flash/SDRAM/PSRAM/HyperRAM等多種存儲(chǔ)器空間選擇。

雖然存儲(chǔ)器空間選擇很多,但是一個(gè)最終可離線啟動(dòng)的i.MX RT程序(即能被下載進(jìn)外部非易失存儲(chǔ)器,且能被BootROM加載啟動(dòng))其readonly段應(yīng)該是一段連續(xù)的數(shù)據(jù)(SREC/HEX格式鏡像文件里僅能包含一段空間地址),即要鏈接在一個(gè)主存儲(chǔ)器空間里,這也意味著其它鏈接在非主存儲(chǔ)器空間的 .text 段應(yīng)該使用重定向方法來(lái)實(shí)現(xiàn),不可直接原地鏈接,參考文章 《IAR下將源文件代碼重定向到任意RAM中的方法》。最近有一個(gè)i.MX RT1060客戶,他們就遇到了分散鏈接工程調(diào)試問(wèn)題,工程readonly段被直接分散鏈接到了兩個(gè)不同的外部存儲(chǔ)器空間,沒(méi)有用重定向方法,這雖然不符合離線啟動(dòng)要求,但是在IAR下直接下載調(diào)試也會(huì)報(bào)錯(cuò),這是怎么回事? 1. 客戶的問(wèn)題

我們?cè)龠M(jìn)一步描述客戶工程分散鏈接問(wèn)題,下圖包含了i.MX RT架構(gòu)下程序段的全部鏈接選擇,根據(jù)這些選擇組合,我們能產(chǎn)生多種不同的工程鏈接文件。

6bcbf7e6-d70b-11ec-bce3-dac502259ad0.png

先來(lái)看不涉及分散鏈接的簡(jiǎn)單情況,即readonly段全在Flash里,readwrite段在一個(gè)或多個(gè)RAM空間里,這種情況下IAR下載調(diào)試沒(méi)有什么特殊注意事項(xiàng),flashloader會(huì)負(fù)責(zé)外部Flash初始化,并將readonly段數(shù)據(jù)下載進(jìn)Flash,然后宏文件負(fù)責(zé)外部RAM初始化,在線調(diào)試一切正常。

Case1:APP readonly text/data1 + APP readwrite data2/3/4

再來(lái)看第二種情況,這里開(kāi)始涉及分散鏈接,readonly段分散在多個(gè)RAM空間,readwrite段在一個(gè)或多個(gè)RAM空間里。這種情況下因?yàn)闆](méi)有鏈接在Flash空間,因此無(wú)需flashloader,完全由宏文件將相關(guān)外部RAM初始化好,多個(gè)readonly段都能正常下載,在線調(diào)試一切正常。

Case2:APP readonly text/data2/3/4 + APP readonly text/data2/3/4 + APP readwritedata2/3/4

第三種情況再?gòu)?fù)雜一點(diǎn),readonly段除了在Flash空間外,還有一部分放在了內(nèi)部RAM里,然后readwrite段依然在一個(gè)或多個(gè)RAM空間里。這種情況下IAR下載調(diào)試感覺(jué)上應(yīng)該沒(méi)問(wèn)題,因?yàn)閮?nèi)部RAM無(wú)需初始化可直接訪問(wèn),兩個(gè)不連續(xù)readonly段原則上可以下載,但是很遺憾,IAR會(huì)報(bào)錯(cuò),其flashloader無(wú)法處理放在內(nèi)部RAM的readonly段,調(diào)試無(wú)法進(jìn)行。

Case3:APP readonly text/data1 + APP readonly text/data2 + APP readwrite data2/3/4

最后一種分散鏈接的情況最復(fù)雜,也是客戶的問(wèn)題所在,readonly段除了在Flash空間外,還有一部分放在了外部RAM,然后readwrite段在一個(gè)或多個(gè)RAM空間里。這種情況下IAR下載調(diào)試一定會(huì)出問(wèn)題,默認(rèn)flashloader只做了Flash初始化,并不負(fù)責(zé)初始化外部RAM,因此部分readonly段往外部RAM下載時(shí)會(huì)報(bào)錯(cuò),工程宏文件雖然負(fù)責(zé)初始化外部RAM,但其執(zhí)行階段在flashloader作用之后,鞭長(zhǎng)莫及。

Case4:APP readonly text/data1 + APP readonly text/data3/4 + APP readwrite data2/3/4

2. 復(fù)現(xiàn)客戶問(wèn)題

我們?cè)诙髦瞧止俜組IMXRT1060-EVK板上復(fù)現(xiàn)一下客戶問(wèn)題,使用SDK_2.11.0_EVK-MIMXRT1060oardsevkmimxrt1060demo_appshello_worldiar工程,原工程有很多Build,我們就選用flexspi_nor_sdram build,它用到了兩塊外部存儲(chǔ)器,符合客戶場(chǎng)景。

在這個(gè)build里readonly段都鏈在外部Flash里,readwrite段都鏈接在外部SDRAM里,顯然這個(gè)情況屬于第一節(jié)介紹的case1:

  1. Flash初始化工作:IARSystemsEmbedded Workbench9.10.2armconfigflashloaderNXPFlashIMXRT1060_FlexSPI.out

  2. SDRAM初始化工作:SDK_2.11.0_EVK-MIMXRT1060oardsevkmimxrt1060demo_appshello_worldiarevkmimxrt1060_sdram_init.mac

6c16d446-d70b-11ec-bce3-dac502259ad0.png

我們現(xiàn)在要將工程稍微改動(dòng)一下,在工程源文件里定義一個(gè)sw_delay()函數(shù)(記得要在main函數(shù)里調(diào)用一下),并且將其指定在自定義.sdramCodeSection段里:

#pragma default_function_attributes = @ ".sdramCodeSection"
void sw_delay(void)
{
     __NOP();
}
#pragma default_function_attributes =

然后在工程鏈接文件里將這個(gè)自定義.sdramCodeSection段放到SDRAM空間里,這樣我們?cè)谕獠縁lash和SDRAM空間里就都有readonly段了,跟客戶情況一致了。

place in DATA3_region { section .sdramCodeSection };

板卡上電,直接用板載DAP-Link調(diào)試器在線下載工程(為了減少對(duì)板子設(shè)置的依賴,我們將調(diào)試器復(fù)位類型改為Core),下載過(guò)程中IAR果然一直在報(bào)錯(cuò),如果你忽略錯(cuò)誤繼續(xù)調(diào)試,雖然斷點(diǎn)會(huì)停在main函數(shù),但是只要單步進(jìn)放到SDRAM空間的函數(shù)里時(shí),程序就會(huì)跑飛進(jìn)hardfault,因?yàn)镾DRAM中根本就沒(méi)有正確的.sdramCodeSection段數(shù)據(jù)。

6c6974e4-d70b-11ec-bce3-dac502259ad0.png

3. 僅借助宏文件(.mac)解決問(wèn)題

分析到這里,其實(shí)你應(yīng)該知道問(wèn)題出在哪里了,工程配套宏文件evkmimxrt1060_sdram_init.mac本應(yīng)負(fù)責(zé)SDRAM初始化,但是其執(zhí)行順序在 FlashIMXRT1060_FlexSPI.out作用之后,所以沒(méi)有產(chǎn)生其該有的效果,這個(gè)具體可見(jiàn)舊文 《IAR內(nèi)部C-SPY調(diào)試組件配套宏文件(.mac)用法介紹》 3.1 小節(jié),有非常詳細(xì)的解釋。

現(xiàn)在的解決思路就是,如何讓evkmimxrt1060_sdram_init.mac里的SDRAM初始化語(yǔ)句在flashloader作用之前生效,所以我們很自然地想在flashloader配套的宏文件FlashIMXRT1060_FlexSPI.mac里的execUserFlashInit()接口里將SDRAM初始化語(yǔ)句都加上,但是很遺憾,這招不奏效,其實(shí)在第一節(jié)介紹的case3里就應(yīng)該認(rèn)清現(xiàn)實(shí)了,內(nèi)部RAM無(wú)需初始化IAR也無(wú)法正常下載。

6cb0bd90-d70b-11ec-bce3-dac502259ad0.png

4. 借助雙Flashloader解決問(wèn)題

其實(shí)IAR軟件設(shè)計(jì)里,對(duì)于兩個(gè)readonly段,只要其中有一個(gè)段被放入了Flash里(即需要flashloader),那么另外一個(gè)段不管是不是放在Flash里也需要有相應(yīng)flashloader,這里痞子衡要吐槽下IAR的設(shè)計(jì),有點(diǎn)呆板了。

所以本文案例里解決問(wèn)題的關(guān)鍵就是為SDRAM也設(shè)計(jì)一個(gè)flashloader,具體制作方法可以參考舊文《串行NOR Flash下載算法(IAR EWARM篇)》。因?yàn)镾DRAM擦寫其實(shí)也不需要什么特殊命令時(shí)序,就是單純AHB方式地寫就行了,所以這個(gè)SDRAM版本的flashloader就是個(gè)傀儡flashloader而已。

為了讓這個(gè)傀儡flashloader更通用一些,是按如下方式實(shí)現(xiàn)三個(gè)主要flashloaderAPI的,其中FlashInit()函數(shù)里故意沒(méi)有加SEMC模塊初始化代碼,就是為了讓這個(gè)flashloader適用所有類型的RAM(ITCM/DTCM/OCRAM/SDRAM/PSRAM/HyperRAM),外設(shè)初始化工作放在傀儡 flashloader配套宏文件里去完成。

FlashInit() - 什么都不做,直接返回

FlashWrite() - 用memcpy 函數(shù)實(shí)現(xiàn)

FlashErase() - 用memset 函數(shù)實(shí)現(xiàn)

最終RAM型通用flashloader源碼工程地址如下:

https://github.com/JayHeng/imxrt-tool-flash-algo/tree/master/boards/nxp_evkmimxrt1060_rev.a1/ram_algo/IAR

我們把新生成的SDRAM flashloader相關(guān)的所有文件(.out/.flash/.mac)放到對(duì)應(yīng)IAR系統(tǒng)目錄下,并且修改原來(lái)的FlashIMXRT1060_EVK_FlexSPI.board 文件,加入SDRAM 相關(guān)的部分:

  1. FlashIMXRT1060_SEMC.mac文件基本沿用evkmimxrt1060_sdram_init.mac文件,只是setup宏函數(shù)從execUserPreload換到execUserFlashInit

  2. FlashIMXRT1060_SEMC.flash文件內(nèi)容按FlashIMXRT1060_FlexSPI1.flash寫即可,注意文件后綴一定要是 .flash,IAR只認(rèn)這個(gè)后綴。

6cfb0e4a-d70b-11ec-bce3-dac502259ad0.png

現(xiàn)在再去下載調(diào)試,就一切正常了,說(shuō)明雙Flashloader解決方案生效了。

本例是以IAR flashloader為例的,如果用J-Link flashloader也是可以的,一樣的原理制作兩個(gè)Flashloader即可。

6d5a1cd2-d70b-11ec-bce3-dac502259ad0.png

原文標(biāo)題:IAR環(huán)境下無(wú)法直接下載調(diào)試i.MX RT分散鏈接工程的解決方案

文章出處:【微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

    關(guān)注

    146

    文章

    16888

    瀏覽量

    349929
  • 恩智浦
    +關(guān)注

    關(guān)注

    14

    文章

    5817

    瀏覽量

    106335
  • IAR
    IAR
    +關(guān)注

    關(guān)注

    5

    文章

    344

    瀏覽量

    36596
  • 下載調(diào)試
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    6502

原文標(biāo)題:IAR環(huán)境下無(wú)法直接下載調(diào)試i.MX RT分散鏈接工程的解決方案

文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32CUBEIDE無(wú)法直接下載package包怎么解決?

    STM32CUBEIDE無(wú)法直接下載package包
    發(fā)表于 03-11 07:38

    STM32H750如何使用IAR調(diào)試運(yùn)行在外部SDRAM的程序?

    (.mac file)腳本,在程序下載前,運(yùn)行腳本初始化外部SDRAM,然后直接下載程序到外部SDRAM。 然后就要像在內(nèi)存中調(diào)試代碼一樣,可以直接
    發(fā)表于 04-01 07:40

    VSCODE可使用ESP32C3 USB接口直接下載嗎?

    1:現(xiàn)在可以通過(guò)ESP32C3 DOWNLOAD TOOL V3.9.2 下載,但是VSCODE 可使用ESP32C3 USB接口直接下載嗎? 2:VSCODE ESP32 C3有兩個(gè)選項(xiàng)
    發(fā)表于 06-18 07:33

    iar jlink連接am1808

    iar jlink 連接調(diào)試am1808時(shí)應(yīng)該怎配置iar啊,現(xiàn)在iar下載時(shí)老報(bào)錯(cuò),說(shuō)缺少i
    發(fā)表于 05-14 04:11

    IAR下對(duì)MSP430G2553程序下載調(diào)試

    。4、本文是針對(duì) MSP430G2553為基礎(chǔ)的,不多說(shuō),貼圖。 注意的點(diǎn)已經(jīng)說(shuō)了。關(guān)于IAR 下對(duì)MSP430G2553 程序下載調(diào)試(附圖).pdf (212.41 KB )
    發(fā)表于 04-16 06:35

    通過(guò)Linux命令直接下載nodejs

    我這里通過(guò)Linux命令直接下載nodejs,因?yàn)?b class='flag-5'>直接通過(guò)wget命令下載的話需要知道nodejs的下載地址。
    發(fā)表于 07-05 07:29

    IAR軟件下載程序報(bào)錯(cuò)怎么解決

    IAR軟件版本:7.12.1故障描述:IAR軟件下載程序報(bào)錯(cuò) 初始化失?。ㄟ@里忘記將報(bào)錯(cuò)內(nèi)容截圖了,下次遇到再補(bǔ)一下。)1.檢查是否通過(guò)
    發(fā)表于 01-27 07:59

    ESP32 C3 VSCODE USB接口可以直接下載嗎?

    1:現(xiàn)在可以通過(guò)ESP32C3 DOWNLOAD TOOL V3.9.2 下載,但是VSCODE 可使用ESP32C3 USB接口直接下載嗎?2:VSCODE ESP32 C3有兩個(gè)選項(xiàng)
    發(fā)表于 02-16 06:00

    IAR NUC130LE3CN下載程序報(bào)錯(cuò)怎么解決?

    IAR下NUC130LE3CN下載程序報(bào)錯(cuò)
    發(fā)表于 08-24 06:35

    基于PC機(jī)與HPI接口的DSP程序直接下載

    基于PC機(jī)與HPI接口的DSP程序直接下載
    發(fā)表于 10-19 11:43 ?6次下載
    基于PC機(jī)與HPI接口的DSP程序<b class='flag-5'>直接下載</b>法

    使用Ulink2直接下載Hex文件資料下載

    使用Keil5如何使用Ulink2直接下載現(xiàn)有的Hex文件
    發(fā)表于 03-09 11:36 ?1次下載

    IAR軟件下載程序出現(xiàn)彈窗報(bào)錯(cuò) “FATAL error:Failed to re-initialize Session aborted“初始化失敗的問(wèn)題總結(jié)

    IAR軟件版本:7.12.1故障描述:IAR軟件下載程序報(bào)錯(cuò) 初始化失?。ㄟ@里忘記將報(bào)錯(cuò)內(nèi)容截圖了,下次遇到再補(bǔ)一下。)1.檢查是否通過(guò)
    發(fā)表于 12-03 11:36 ?9次下載
    <b class='flag-5'>IAR</b>軟件<b class='flag-5'>下載</b>程序出現(xiàn)彈窗<b class='flag-5'>報(bào)錯(cuò)</b> “FATAL error:Failed to re-initialize Session aborted“初始化失敗的問(wèn)題總結(jié)

    IAR定位函數(shù)內(nèi)容時(shí)報(bào)錯(cuò)“包含錯(cuò)誤的路徑”

    IAR版本:7.12.1報(bào)錯(cuò):包含錯(cuò)誤的路徑XXXXX我經(jīng)常使用github在多臺(tái)電腦寫代碼,每次下載完更新過(guò)的代碼,定位函數(shù)就提示路徑錯(cuò)誤。這個(gè)問(wèn)題應(yīng)該是不同電腦上項(xiàng)目的存儲(chǔ)路徑不同導(dǎo)致的。以下
    發(fā)表于 12-03 12:06 ?11次下載
    <b class='flag-5'>IAR</b>定位函數(shù)內(nèi)容時(shí)<b class='flag-5'>報(bào)錯(cuò)</b>“包含錯(cuò)誤的路徑”

    基于IAR for arm9.30.1在VS Code調(diào)試仿真RA

    都能通用該方式實(shí)現(xiàn)VS Code編譯調(diào)試仿真。 1 預(yù)先需要安裝iar for arm 9.30.1,然后通過(guò)RASC生成基于IAR的工程。 2 VS code擴(kuò)展商城下載兩個(gè)擴(kuò)展插件
    的頭像 發(fā)表于 01-16 13:20 ?2434次閱讀

    基于IAR for arm9.30.1在VS Code調(diào)試仿真RA

    基于IAR for arm9.30.1在VS Code調(diào)試仿真RA
    的頭像 發(fā)表于 08-26 08:07 ?1000次閱讀
    基于<b class='flag-5'>IAR</b> for arm9.30.1在VS Code<b class='flag-5'>調(diào)試</b>仿真RA