電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 35|回復(fù): 0
收起左側(cè)

IAR下如何將整個源文件代碼重定向到任意RAM中?

[復(fù)制鏈接]

302

主題

307

帖子

1896

積分

三級會員

Rank: 3Rank: 3

積分
1896
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-1-12 20:11:00 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是在IAR開發(fā)環(huán)境下將整個源文件代碼重定向到任意RAM中的方法。
3 h" ]0 R: m" ?) J  [$ r痞子衡舊文 《在IAR下將關(guān)鍵函數(shù)重定向到RAM中執(zhí)行的方法》 里介紹了三種關(guān)鍵函數(shù)重定向方法,不過這三種方法只是寫法形式不同,本質(zhì)上沒啥區(qū)別,都是利用 IAR 鏈接器特性將函數(shù)重定向到工程數(shù)據(jù)段(RW)所在 RAM 里。6 h# ^3 p) B4 q+ T
對于 i.MXRT 這種擁有多塊地址非連續(xù)的 RAM 的芯片,其實我們也可以單獨(dú)將這些重定向函數(shù)放到一個指定的 RAM 里,不一定非得跟數(shù)據(jù)段放在同一個 RAM 里。具體實現(xiàn)也很簡單,只需要在鏈接文件里額外加一句 place in 語句處理即可,恩智浦官方 SDK 包里就是這么做的。
+ H2 C6 U" j& k然而痞子衡最近在支持 i.MXRT1170 客戶過程中,不使用恩智浦 SDK 里那種自定義函數(shù)段處理的方法,而是在 IAR 鏈接文件里使用指定源文件 object 的方式將代碼重定向到 ITCM 竟然失效了,這是怎么回事?今天我們一起來看一下:) ?3 t4 O( L+ K4 o' T
  • Note 1:閱讀本文前需要對 《IAR鏈接文件(.icf)》、《IAR映射文件(.map)》 這兩種文件有所了解。
  • Note 2:本文使用的 IAR EWARM 軟件版本是 v9.10.2。一、回顧SDK里函數(shù)重定向做法我們以最經(jīng)典的 \SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm7\iar 例程來看,工程 Build 選擇 flexspi_nor_debug,即代碼段放在 Flash 里(0x30000000 - ),數(shù)據(jù)段放在 DTCM 里(0x20000000 - )。! f) t- T( y4 t( P& z: i9 S
    我們現(xiàn)在新建一個名為 ram_code.c 的源文件,在這個源文件里定義如下兩個 delay1/2() 函數(shù),然后將這個源文件添加進(jìn)工程使用。按照 SDK 里做法,如果我們想將這兩個函數(shù)重定向,需要加 AT_QUICKACCESS_SECTION_CODE 宏來修飾,其實就是將函數(shù)放到名為 CodeQuickAccess 的自定義段里。
    0 O4 r9 a# ]9 s3 T: l# d2 T#define AT_QUICKACCESS_SECTION_CODE(func) func @"CodeQuickAccess"8 z6 n& `$ P* U7 m+ B! H( N* ?5 M' e
    AT_QUICKACCESS_SECTION_CODE(void delay1(void));* o3 Y* r8 p8 F3 X
    void delay1(void)! b( C# S) I7 b& N0 N
    {. M/ r% l1 h) l6 i* o) r& ]
         __NOP();9 Q  Y4 S$ \, P( w% J) F9 W4 \. Z
    }
    " }2 m% {! u' f- w+ c, tAT_QUICKACCESS_SECTION_CODE(void delay2(void));
    : {1 {1 f0 K8 W7 Z  v7 t9 Tvoid delay2(void)6 Z8 H8 F! o* ?+ }2 ]
    {
    ) k2 G9 P1 W+ X4 \4 m% p    __NOP();
    # ?, v9 L! M; E: w* }6 N    __NOP();
    7 `5 ^* ~& U% [6 t, ]6 J}7 G2 ^( ^- U- r" t' y0 j
    然后工程鏈接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 里(僅摘錄部分),CodeQuickAccess 段單獨(dú)放在 ITCM 里(0x00000000 - ),這就是官方 SDK 里的實現(xiàn)。* w8 O3 b- {& ~# T
    define symbol m_data_start           = 0x20000000;4 h5 T7 @2 _- \1 Q
    define symbol m_data_end             = 0x2003FFFF;  Z( U; g! z; _0 y' Q0 D
    define symbol m_itcm_start           = 0x00000000;
    5 b- q6 L5 d. H2 Adefine symbol m_itcm_end             = 0x0003FFFF;
    - A0 w+ l0 t: E% H, q* {define region DATA_region   = mem:[from m_data_start to m_data_end-__size_cstack__];
    3 Q. Z5 E$ z6 u. f. Udefine region ITCM_region   = mem:[from m_itcm_start to m_itcm_end];- u: j2 Y1 |/ [
    define block RW            { first readwrite, section m_usb_dma_init_data };2 G9 F$ l- l: m( p) C* H2 e
    define block QACCESS_CODE  { section CodeQuickAccess };
    $ G2 V9 f- Z4 w8 k" |initialize by copy         { readwrite, section .textrw, section CodeQuickAccess };# l! s/ J4 U6 b' g1 R- \: {
    place in DATA_region                 { block RW };
    / F, s& ^; h3 [+ {place in ITCM_region                 { block QACCESS_CODE };7 F4 A* N( ]0 M
    編譯鏈接 hello_world_demo_cm7.ewp 工程,然后查看其映射文件(hello_world_demo_cm7.map)找到跟 delay1/2() 函數(shù)相關(guān)的內(nèi)容如下,顯然這是符合預(yù)期的。這里特別注意一下,CodeQuickAccess 的類別顯示的是 inited,表明其不是常見的 ro code,而是經(jīng)過重定向的,而且 delay1/2() 函數(shù)所在 ram_code.o 里包含了 10 個字節(jié)的 rw code。
    2 S$ ~: z1 s/ S# [6 I- u# S$ L2 q*******************************************************************************
    , {4 o1 I, c& P% O+ G* B8 Z*** PLACEMENT SUMMARY
    / w8 @( X0 d2 F4 X* x) a8 V2 Z( P***# H* W4 I) F0 K$ J5 \) V1 i
    define block QACCESS_CODE { section CodeQuickAccess };
    ' i' S7 M$ ^2 Y; c- A# j! K"P8":  place in [from 0x0 to 0x3'ffff] { block QACCESS_CODE };* n( i; N( `9 C. Y- ]" T0 A* R& E
      Section              Kind         Address      Size  Object% L  s' K/ O7 h. K
      -------              ----         -------      ----  ------  r; l3 d' ]: S( B! l6 }7 Q. E
    "P8":                                           0xc
    ) z: |* r5 `, P& r  QACCESS_CODE                          0x0     0xc  [B]# y* r  R1 p0 _! ]
        QACCESS_CODE-1                      0x0     0xa  [I]
    * K- p2 S3 R+ c* }      CodeQuickAccess  inited           0x0     0xa  ram_code.o [6]
    5 N" X! k8 w" l5 |                                      - 0xc     0xc: d, e" f. n; _( Q
    *******************************************************************************9 n# Z% d+ ]& j+ q/ O$ q' K( o2 l2 B) b
    *** MODULE SUMMARY
    & f; a* `3 l% u; q; v, F***
    $ \. S' v3 ^& h2 S! S    Module                              ro code  rw code  ro data  rw data
    ! \5 M  B5 ~/ z" f: o! y    ------                              -------  -------  -------  -------$ C- S  E, J0 O. }/ E
        ram_code.o                                        10       10* [3 ^5 ]: R/ q, |( H
    *******************************************************************************
    $ f0 G  A/ T7 n1 M8 n& F3 X: H*** ENTRY LIST
    ! C3 @3 J7 f% J$ b; e***0 ^: ?# I6 L" n1 m& T4 N4 T
        Entry                       Address   Size  Type      Object
    3 Z" u* |7 y7 s    ----                       -------   ----  ----      ------, O+ x/ [! [1 g2 e& V; A
        delay1                          0x1    0x4  Code  Gb  ram_code.o [6]
    " v, ], B5 V7 E! b    delay2                          0x5    0x6  Code  Gb  ram_code.o [6]- J: h5 o; C( v5 \: `2 ?
    如果你打開工程鏡像文件 hello_world_demo_cm7.srec 查看,這里也只有一段連續(xù)的 Flash 地址空間數(shù)據(jù),沒有 RAM 地址空間數(shù)據(jù),所以這個鏡像文件是符合獨(dú)立工具(比如 MCUBootUtility)下載以及 BootROM 啟動條件的。
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表