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