|
大家好,我是痞子衡,是正經(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 啟動條件的。 |
|