|
大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是在IAR開發(fā)環(huán)境下將整個(gè)源文件代碼重定向到任意RAM中的方法。0 H8 G8 T1 A5 R
痞子衡舊文 《在IAR下將關(guān)鍵函數(shù)重定向到RAM中執(zhí)行的方法》 里介紹了三種關(guān)鍵函數(shù)重定向方法,不過(guò)這三種方法只是寫法形式不同,本質(zhì)上沒啥區(qū)別,都是利用 IAR 鏈接器特性將函數(shù)重定向到工程數(shù)據(jù)段(RW)所在 RAM 里。
9 ^% q/ O1 U4 S6 k1 t) K對(duì)于 i.MXRT 這種擁有多塊地址非連續(xù)的 RAM 的芯片,其實(shí)我們也可以單獨(dú)將這些重定向函數(shù)放到一個(gè)指定的 RAM 里,不一定非得跟數(shù)據(jù)段放在同一個(gè) RAM 里。具體實(shí)現(xiàn)也很簡(jiǎn)單,只需要在鏈接文件里額外加一句 place in 語(yǔ)句處理即可,恩智浦官方 SDK 包里就是這么做的。
( R' q& P! T7 Q0 o# E7 G然而痞子衡最近在支持 i.MXRT1170 客戶過(guò)程中,不使用恩智浦 SDK 里那種自定義函數(shù)段處理的方法,而是在 IAR 鏈接文件里使用指定源文件 object 的方式將代碼重定向到 ITCM 竟然失效了,這是怎么回事?今天我們一起來(lái)看一下:. E; T/ v5 @9 n
Note 1:閱讀本文前需要對(duì) 《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 例程來(lái)看,工程 Build 選擇 flexspi_nor_debug,即代碼段放在 Flash 里(0x30000000 - ),數(shù)據(jù)段放在 DTCM 里(0x20000000 - )。
& x1 t- ~) q# p. e( \; R我們現(xiàn)在新建一個(gè)名為 ram_code.c 的源文件,在這個(gè)源文件里定義如下兩個(gè) delay1/2() 函數(shù),然后將這個(gè)源文件添加進(jìn)工程使用。按照 SDK 里做法,如果我們想將這兩個(gè)函數(shù)重定向,需要加 AT_QUICKACCESS_SECTION_CODE 宏來(lái)修飾,其實(shí)就是將函數(shù)放到名為 CodeQuickAccess 的自定義段里。
) Y0 R( l% U( a4 y#define AT_QUICKACCESS_SECTION_CODE(func) func @"CodeQuickAccess"
# e. d5 o# m' F3 mAT_QUICKACCESS_SECTION_CODE(void delay1(void));$ l7 z5 v7 }$ \( ]: |% E! R- i. C# ^
void delay1(void)
- M1 S, a+ ^) H! h% a5 P# T{
0 k2 i/ U/ |, m __NOP();8 p, V) \8 S3 r' s9 @( ~
}2 a9 ]' s; a- y ~0 _( Z/ h
AT_QUICKACCESS_SECTION_CODE(void delay2(void));. T6 C9 M' [# {, t2 P
void delay2(void)
+ `, x# o- @5 J3 x# C# j, E& {{
4 B [4 j. s1 ]' a5 t6 _ __NOP();
( X+ m, G. j4 ?0 d( x" O# a __NOP();
5 n' C( [: l! k. {$ q( ^}
; N- E8 s1 p& y( \+ F! j% ]然后工程鏈接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 里(僅摘錄部分),CodeQuickAccess 段單獨(dú)放在 ITCM 里(0x00000000 - ),這就是官方 SDK 里的實(shí)現(xiàn)。# v; [" V# w. ]
define symbol m_data_start = 0x20000000;- N0 P$ c7 ]# m5 ` }3 {0 M& b
define symbol m_data_end = 0x2003FFFF;& F6 ?1 f' ?4 H2 I
define symbol m_itcm_start = 0x00000000;
2 f3 t2 F( B* W# h6 {1 ?define symbol m_itcm_end = 0x0003FFFF;, x M! N5 v m& Q* ]8 D
define region DATA_region = mem:[from m_data_start to m_data_end-__size_cstack__];5 L5 e7 X# C0 V! D/ [! F
define region ITCM_region = mem:[from m_itcm_start to m_itcm_end];% l' P/ X# J: Y5 I6 Q, q
define block RW { first readwrite, section m_usb_dma_init_data };
/ c1 k3 O( j+ E" G5 A) R- W! B& rdefine block QACCESS_CODE { section CodeQuickAccess };
7 [1 t9 p* v! F) a! T2 Winitialize by copy { readwrite, section .textrw, section CodeQuickAccess };
5 H8 s4 L4 f6 a' c+ \place in DATA_region { block RW };
6 C ?, m2 F1 U. C' P+ l; O+ Nplace in ITCM_region { block QACCESS_CODE };
& U% n3 t& H' n3 ~2 N編譯鏈接 hello_world_demo_cm7.ewp 工程,然后查看其映射文件(hello_world_demo_cm7.map)找到跟 delay1/2() 函數(shù)相關(guān)的內(nèi)容如下,顯然這是符合預(yù)期的。這里特別注意一下,CodeQuickAccess 的類別顯示的是 inited,表明其不是常見的 ro code,而是經(jīng)過(guò)重定向的,而且 delay1/2() 函數(shù)所在 ram_code.o 里包含了 10 個(gè)字節(jié)的 rw code。
& ^4 p: a8 e4 L* O* a0 z*******************************************************************************1 p; Z/ X1 ]' R. V' v* [
*** PLACEMENT SUMMARY, B R9 Y% p; j* s) P" N) J
***
' X4 H; g& e, p1 c* `define block QACCESS_CODE { section CodeQuickAccess };8 r7 @7 E5 s$ `& c" P" q4 |
"P8": place in [from 0x0 to 0x3'ffff] { block QACCESS_CODE };
7 W# l+ H0 s/ O( Z3 y$ i9 c Section Kind Address Size Object
) [3 y& ?& l2 H! u/ v2 }+ F ------- ---- ------- ---- ------
4 V7 Y% K1 s: y! h0 [( A"P8": 0xc
" k/ w% d/ K5 k' S QACCESS_CODE 0x0 0xc [B]
. D- C5 `: M: T% y; x QACCESS_CODE-1 0x0 0xa [I]
4 G! b" l' Z+ |" _7 a. R CodeQuickAccess inited 0x0 0xa ram_code.o [6]9 ]; f4 \/ Y" K" h8 S
- 0xc 0xc8 n- [" u1 I9 Q* {. t( i$ V0 Q7 {; d
*******************************************************************************
( l2 r1 \2 y1 R# G" d/ \*** MODULE SUMMARY' X- r3 x. B+ ^! w( u& P
***
) y2 ?5 M9 E! V4 E1 T8 l' ? Module ro code rw code ro data rw data0 ~9 M# ^7 O; q/ q! @
------ ------- ------- ------- -------& J4 O- I( b. H: B' m8 E: v
ram_code.o 10 10
+ O2 J; F: j+ |% O9 _7 H*******************************************************************************( F4 ]. w+ E& M) @- l1 Q
*** ENTRY LIST
4 U# r9 V/ x M+ D8 \, w***
( K: p# m6 n) m! r Entry Address Size Type Object
7 ~7 `5 U" O9 }/ m! h7 A ---- ------- ---- ---- ------
( R6 O' J, T0 H0 G$ I6 U delay1 0x1 0x4 Code Gb ram_code.o [6] \* B' n' x i6 h; K0 i
delay2 0x5 0x6 Code Gb ram_code.o [6]
! [6 G. H" a1 t/ T. I( ]如果你打開工程鏡像文件 hello_world_demo_cm7.srec 查看,這里也只有一段連續(xù)的 Flash 地址空間數(shù)據(jù),沒有 RAM 地址空間數(shù)據(jù),所以這個(gè)鏡像文件是符合獨(dú)立工具(比如 MCUBootUtility)下載以及 BootROM 啟動(dòng)條件的。 |
|