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

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

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

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

[復制鏈接]

302

主題

307

帖子

1896

積分

三級會員

Rank: 3Rank: 3

積分
1896
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-1-12 20:11:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大家好,我是痞子衡,是正經(jīng)搞技術的痞子。今天痞子衡給大家分享的是在IAR開發(fā)環(huán)境下將整個源文件代碼重定向到任意RAM中的方法
- a- |) e0 v. \* j9 Q# p6 Y( y痞子衡舊文 《在IAR下將關鍵函數(shù)重定向到RAM中執(zhí)行的方法》 里介紹了三種關鍵函數(shù)重定向方法,不過這三種方法只是寫法形式不同,本質(zhì)上沒啥區(qū)別,都是利用 IAR 鏈接器特性將函數(shù)重定向到工程數(shù)據(jù)段(RW)所在 RAM 里。3 Y2 y0 `9 Q8 @% y2 k; D. [( n
對于 i.MXRT 這種擁有多塊地址非連續(xù)的 RAM 的芯片,其實我們也可以單獨將這些重定向函數(shù)放到一個指定的 RAM 里,不一定非得跟數(shù)據(jù)段放在同一個 RAM 里。具體實現(xiàn)也很簡單,只需要在鏈接文件里額外加一句 place in 語句處理即可,恩智浦官方 SDK 包里就是這么做的。& i+ p4 L2 \8 Y' ~' K
然而痞子衡最近在支持 i.MXRT1170 客戶過程中,不使用恩智浦 SDK 里那種自定義函數(shù)段處理的方法,而是在 IAR 鏈接文件里使用指定源文件 object 的方式將代碼重定向到 ITCM 竟然失效了,這是怎么回事?今天我們一起來看一下:
5 B+ `9 t, X- o
  • 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 - )。
    / v- j9 u7 e/ ^$ i5 {; o我們現(xiàn)在新建一個名為 ram_code.c 的源文件,在這個源文件里定義如下兩個 delay1/2() 函數(shù),然后將這個源文件添加進工程使用。按照 SDK 里做法,如果我們想將這兩個函數(shù)重定向,需要加 AT_QUICKACCESS_SECTION_CODE 宏來修飾,其實就是將函數(shù)放到名為 CodeQuickAccess 的自定義段里。
    - I  j7 A' c  }& w; ?: x( N3 Y#define AT_QUICKACCESS_SECTION_CODE(func) func @"CodeQuickAccess"- L' V6 I$ }% V: c& @, d" }! |/ x
    AT_QUICKACCESS_SECTION_CODE(void delay1(void));
    ' y9 g: v0 E8 A. W, B) a- K& R: z& cvoid delay1(void)5 {; L! w/ u; b; N+ q1 x+ h
    {! ?% o# C+ E5 [+ X9 B
         __NOP();
    & ?6 ?0 q" L& `  c7 T* f}9 d* C/ C0 e" J! h( i' b
    AT_QUICKACCESS_SECTION_CODE(void delay2(void));/ H, l! y: J( p5 f1 b% v
    void delay2(void)
    ! v. M/ O% u/ C: C5 ]: C{
    8 {  a, {; I  G5 A! b    __NOP();( G8 x/ ^. q$ k" h% D
        __NOP();. e, y& G4 O# d% }2 r
    }" J1 L; C8 Q# S: o8 u6 b
    然后工程鏈接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 里(僅摘錄部分),CodeQuickAccess 段單獨放在 ITCM 里(0x00000000 - ),這就是官方 SDK 里的實現(xiàn)。6 x7 f! u$ s/ M7 y& H. |( Q6 Y
    define symbol m_data_start           = 0x20000000;
    ! y4 n$ d( F6 w( a& q' E: M1 hdefine symbol m_data_end             = 0x2003FFFF;
    ; W& k( C, F1 R9 o8 R8 ^( F8 adefine symbol m_itcm_start           = 0x00000000;" Q. P; M! T3 l# H  G6 {* b+ R
    define symbol m_itcm_end             = 0x0003FFFF;1 J# Z! V% D8 Z% L  \7 H+ {
    define region DATA_region   = mem:[from m_data_start to m_data_end-__size_cstack__];
    - s$ @8 A# k0 A% L1 h- gdefine region ITCM_region   = mem:[from m_itcm_start to m_itcm_end];
      R! t9 ]% E* T( hdefine block RW            { first readwrite, section m_usb_dma_init_data };# r) K) B" H$ L6 O9 `7 }
    define block QACCESS_CODE  { section CodeQuickAccess };6 I: u5 |( i- e/ l: i! U' k# H3 E
    initialize by copy         { readwrite, section .textrw, section CodeQuickAccess };+ U2 D+ k- n, h. a6 M. x
    place in DATA_region                 { block RW };
    : ]- i5 G  s* _& X( F# D+ u$ eplace in ITCM_region                 { block QACCESS_CODE };  R* y5 n0 d( m+ c) b2 `
    編譯鏈接 hello_world_demo_cm7.ewp 工程,然后查看其映射文件(hello_world_demo_cm7.map)找到跟 delay1/2() 函數(shù)相關的內(nèi)容如下,顯然這是符合預期的。這里特別注意一下,CodeQuickAccess 的類別顯示的是 inited,表明其不是常見的 ro code,而是經(jīng)過重定向的,而且 delay1/2() 函數(shù)所在 ram_code.o 里包含了 10 個字節(jié)的 rw code。
    ( t! ~4 J$ ^6 a( `+ ]+ _' n  W9 t*******************************************************************************
      u: m: r1 P! B, q*** PLACEMENT SUMMARY: Y+ w2 X2 t; ]8 [( j$ k
    ***
    % F% U( Q$ s5 qdefine block QACCESS_CODE { section CodeQuickAccess };7 ^% \& X) Q8 U1 n7 R3 v7 W+ i
    "P8":  place in [from 0x0 to 0x3'ffff] { block QACCESS_CODE };
    ) E  r! w" ]7 }: t/ X& m. S  Section              Kind         Address      Size  Object, p+ J( O- L# Q8 z- T. i, F0 v
      -------              ----         -------      ----  ------
    1 t* O$ o* B& l8 t/ D% ]"P8":                                           0xc! G* H; `$ C$ {! q% r3 l2 O
      QACCESS_CODE                          0x0     0xc  [B]$ H; g7 M2 r. D2 w. H
        QACCESS_CODE-1                      0x0     0xa  [I]  S- ^' o6 T9 m7 ]2 `, F
          CodeQuickAccess  inited           0x0     0xa  ram_code.o [6]+ ^7 j4 _& q0 T- O9 _. Z+ p' g
                                          - 0xc     0xc
    : U5 b: k9 Z, B$ \( C; c*******************************************************************************
    - S$ S3 S2 T$ P# ?' u2 W*** MODULE SUMMARY
    + ]* y& _* p  |! T  n# w***; ~$ C; n* o4 C7 {; T
        Module                              ro code  rw code  ro data  rw data. i0 ^$ y9 G4 ?% }1 R' t& b
        ------                              -------  -------  -------  -------
    ) B7 Q  b% n7 T! D, k" f1 o    ram_code.o                                        10       10
    * x0 _) O0 M0 i*******************************************************************************
    ) m9 b/ W  }/ T7 `  P% ^*** ENTRY LIST- B$ c  T1 i& [
    ***) I- f- L" h1 h( n3 E" i: ]( V! l
        Entry                       Address   Size  Type      Object' d# T# h) C! X; b
        ----                       -------   ----  ----      ------. m" b6 F- q3 v9 y2 R9 s) \
        delay1                          0x1    0x4  Code  Gb  ram_code.o [6]
    5 [9 z* N: A# K$ D: m6 l9 S, {/ D1 W    delay2                          0x5    0x6  Code  Gb  ram_code.o [6]* i6 G3 [7 ?1 A- j5 j* q
    如果你打開工程鏡像文件 hello_world_demo_cm7.srec 查看,這里也只有一段連續(xù)的 Flash 地址空間數(shù)據(jù),沒有 RAM 地址空間數(shù)據(jù),所以這個鏡像文件是符合獨立工具(比如 MCUBootUtility)下載以及 BootROM 啟動條件的。
  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


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