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

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

搜索
查看: 33|回復: 0
收起左側

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

[復制鏈接]

302

主題

307

帖子

1896

積分

三級會員

Rank: 3Rank: 3

積分
1896
跳轉到指定樓層
樓主
發(fā)表于 2022-1-12 20:11:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大家好,我是痞子衡,是正經(jīng)搞技術的痞子。今天痞子衡給大家分享的是在IAR開發(fā)環(huán)境下將整個源文件代碼重定向到任意RAM中的方法。1 O. h  M! m  j8 _) R# H( V2 x
痞子衡舊文 《在IAR下將關鍵函數(shù)重定向到RAM中執(zhí)行的方法》 里介紹了三種關鍵函數(shù)重定向方法,不過這三種方法只是寫法形式不同,本質上沒啥區(qū)別,都是利用 IAR 鏈接器特性將函數(shù)重定向到工程數(shù)據(jù)段(RW)所在 RAM 里。
& f- _' X+ D% D  R, j" h) O' J; ]對于 i.MXRT 這種擁有多塊地址非連續(xù)的 RAM 的芯片,其實我們也可以單獨將這些重定向函數(shù)放到一個指定的 RAM 里,不一定非得跟數(shù)據(jù)段放在同一個 RAM 里。具體實現(xiàn)也很簡單,只需要在鏈接文件里額外加一句 place in 語句處理即可,恩智浦官方 SDK 包里就是這么做的。- o: S1 j, K9 w6 Z. c) g
然而痞子衡最近在支持 i.MXRT1170 客戶過程中,不使用恩智浦 SDK 里那種自定義函數(shù)段處理的方法,而是在 IAR 鏈接文件里使用指定源文件 object 的方式將代碼重定向到 ITCM 竟然失效了,這是怎么回事?今天我們一起來看一下:, x6 Z6 G, |8 _1 g
  • 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 - )。$ b& K1 R, m* q: B# l7 {$ n/ x
    我們現(xiàn)在新建一個名為 ram_code.c 的源文件,在這個源文件里定義如下兩個 delay1/2() 函數(shù),然后將這個源文件添加進工程使用。按照 SDK 里做法,如果我們想將這兩個函數(shù)重定向,需要加 AT_QUICKACCESS_SECTION_CODE 宏來修飾,其實就是將函數(shù)放到名為 CodeQuickAccess 的自定義段里。
    ( T) D" Z3 ]6 r$ n#define AT_QUICKACCESS_SECTION_CODE(func) func @"CodeQuickAccess"
    " y; N" @% h: o! ZAT_QUICKACCESS_SECTION_CODE(void delay1(void));5 Z9 O% m. \2 q3 G) e' f& ]. F
    void delay1(void)
    % K0 N# i3 J. h$ N# k* ^/ D{6 c1 P  F1 e+ |5 `; I* M
         __NOP();; A9 P# t7 d+ W/ {! ?
    }' a$ D$ g$ W/ c: L# e. O+ D9 |
    AT_QUICKACCESS_SECTION_CODE(void delay2(void));
    " n/ I& h' f) m8 W# Lvoid delay2(void)+ S/ g+ s+ A, Z% S2 F6 Y& I$ U$ c4 @
    {- C% y' G% q4 `- d3 b7 i% T
        __NOP();
    4 F+ I3 Q6 V* p" g1 c    __NOP();
    - b  w$ `! ^3 ]$ l}
    4 I: [1 ]' o2 p" R* s1 R然后工程鏈接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 里(僅摘錄部分),CodeQuickAccess 段單獨放在 ITCM 里(0x00000000 - ),這就是官方 SDK 里的實現(xiàn)。" t% [( a6 N; y1 X
    define symbol m_data_start           = 0x20000000;3 }$ i/ H. ^: ?- H
    define symbol m_data_end             = 0x2003FFFF;# G7 }5 t  E3 W# \
    define symbol m_itcm_start           = 0x00000000;3 v. {, n) Q# Z$ c/ C+ p
    define symbol m_itcm_end             = 0x0003FFFF;* z5 _+ k$ B$ Z; |* q
    define region DATA_region   = mem:[from m_data_start to m_data_end-__size_cstack__];( k7 f( t, F. F
    define region ITCM_region   = mem:[from m_itcm_start to m_itcm_end];
    5 w$ T( {1 @- i! bdefine block RW            { first readwrite, section m_usb_dma_init_data };
    3 q, T& G5 V( C5 p( M, g( y& Mdefine block QACCESS_CODE  { section CodeQuickAccess };
    6 {5 ^! G3 S2 T8 i. e" q3 xinitialize by copy         { readwrite, section .textrw, section CodeQuickAccess };
    " w; d1 @* ]2 Z- y( I7 gplace in DATA_region                 { block RW };
    $ f: H6 K: s2 \4 J0 bplace in ITCM_region                 { block QACCESS_CODE };0 r( L9 T- n2 O. m1 U4 p
    編譯鏈接 hello_world_demo_cm7.ewp 工程,然后查看其映射文件(hello_world_demo_cm7.map)找到跟 delay1/2() 函數(shù)相關的內容如下,顯然這是符合預期的。這里特別注意一下,CodeQuickAccess 的類別顯示的是 inited,表明其不是常見的 ro code,而是經(jīng)過重定向的,而且 delay1/2() 函數(shù)所在 ram_code.o 里包含了 10 個字節(jié)的 rw code。; K! A' T' w+ l1 j( b' w) v
    *******************************************************************************
    ! G+ \  a8 w" m( q0 O9 x0 }*** PLACEMENT SUMMARY
    % d) J' ^, {2 X5 l" q2 k% D***) C; E4 ^9 A0 @) T! `; X
    define block QACCESS_CODE { section CodeQuickAccess };
    0 Q# t- w+ ~1 x0 o! l"P8":  place in [from 0x0 to 0x3'ffff] { block QACCESS_CODE };0 D- D: V. Y; f3 o( }' A* B9 M
      Section              Kind         Address      Size  Object
    4 c$ I3 W6 U1 G& ^% s' ^  -------              ----         -------      ----  ------
    * M8 f0 h; W% D. g- D"P8":                                           0xc) C4 U1 B7 k8 c- R! T4 q
      QACCESS_CODE                          0x0     0xc  [B]
    2 e- Z4 W: F/ m7 g7 S    QACCESS_CODE-1                      0x0     0xa  [I]
    0 V4 R# M, p6 W  C% z      CodeQuickAccess  inited           0x0     0xa  ram_code.o [6]
    " M. D, f; z9 ?% B) N' r                                      - 0xc     0xc
    ( I; M  H+ V1 C) |' d4 V*******************************************************************************
    " O7 e# d+ {0 ?5 k* f1 @# u*** MODULE SUMMARY
    % h1 s  W' ^" B% w$ Q9 q  k***- U" r1 X4 e6 k) e% z
        Module                              ro code  rw code  ro data  rw data: T7 A' O! K4 {4 F; o; v: q
        ------                              -------  -------  -------  -------
    0 l* j0 @' }+ E7 Z5 s% u    ram_code.o                                        10       10) f1 {/ h8 `. `6 N: g
    *******************************************************************************
    : J# u" F# a# X7 p3 @/ u% q*** ENTRY LIST1 a3 I$ \: l0 ^) H; S: q* T) V, q
    ***/ @, N; D8 R* q; G7 G% `
        Entry                       Address   Size  Type      Object+ V# U. W* I4 b/ G* e6 _
        ----                       -------   ----  ----      ------
    ; |% {0 c% h. s7 p/ Z$ w    delay1                          0x1    0x4  Code  Gb  ram_code.o [6]# A- ]+ W8 S& e1 }, h- F
        delay2                          0x5    0x6  Code  Gb  ram_code.o [6]- L" D, r0 ?( K& H. a' }
    如果你打開工程鏡像文件 hello_world_demo_cm7.srec 查看,這里也只有一段連續(xù)的 Flash 地址空間數(shù)據(jù),沒有 RAM 地址空間數(shù)據(jù),所以這個鏡像文件是符合獨立工具(比如 MCUBootUtility)下載以及 BootROM 啟動條件的。
  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


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