EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
前 言
0 }: Y8 H% z) v 本文主要介绍AM64x的Cortex-A53、Cortex-M4F和Cortex-R5F核心程序自启动使用说明。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。
% _5 d5 h2 @3 C( _! Z) k$ j
: F. ^* q3 T) c3 ?/ {3 v2 n0 c3 c: @2 M- l8 S1 o
本说明文档适用开发环境如下:; w$ x. {0 K5 \1 F
4 J# ~3 n I! n/ J Windows开发环境:Windows 7 64bit、Windows 10 64bit
6 N$ ~! u- t! @" W 虚拟机:VMware15.5.5
& ?, c2 ~+ y$ g+ H( ^; U Linux开发环境:Ubuntu 18.04.4 64bit& T6 B: ]! `" b1 F7 W) n
Linux Processor SDK:ti-processor-sdk-linux-rt-am64xx-evm-08.01.00.39
0 ` W& ^4 V! K" U5 W U-Boot:U-Boot-2021.018 W% x0 _4 K: N
CCS版本:CCS11.2.0
& Y. `) U( X! F- Y$ J ?% Y mcu+ SDK:mcu_plus_sdk_am64x_08_03_00_18. l0 D& L" N* E" c- O! s
SysConfig:sysconfig-1.12.1_2446
/ y/ M( i" o2 z0 s+ j5 q GCC AARCH64 Compiler:gcc-ARM-9.2-2019.12-mingw-w64-i686-aarch64-none-elf. d4 o! h. W: Q' ?8 _; o! ^3 b- N. X
本文测试板卡为创龙科技SOM-TL64x核心板,它是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F设计的多核工业级核心板,通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。! A5 M- [7 R3 f, H" c" h& P- e
% m0 L) X! M4 g( `7 V
, B7 z$ ]3 a- Q" e1 y" K7 G$ {4 Q, R ![]()
- T' E8 [# W8 C( K+ _( c/ o8 a* @" T' t# q1 M9 D$ I( O5 a7 C' d
用户使用核心板进行二次开发时,仅需专注上层运用,降低了开发难度和时间成本,可快速进行产品方案评估与技术预研。
% c, i9 X; X3 ^3 E8 X$ \2 g& s( e+ W& |) y% ~% w
8 h; R5 q* L6 }- Y 基于SBL引导裸机、FreeRTOS程序启动
* m8 M% v9 y; o0 B7 N- x 程序启动流程说明$ B3 @: E* ]! ]
评估板上电后,固化在CPU内部的RBL将会先运行,RBL根据评估板BOOT SET从启动介质(如eMMC,Micro SD、SPI FLASH)读取SBL,然后通过SBL引导应用程序启动。
* W z3 y% n$ X4 a6 ^, A 程序启动流程如下图所示。: o, L+ B+ k0 T4 O' {% [8 M1 x
7 G8 q8 H6 o, S& n9 U! I( s. a1 U% r
7 y, f$ |- R5 |/ T
![]()
}6 u; T3 X1 d9 V) _# l4 a图 1 目前官方提供的MCU+ SDK(版本为mcu_plus_sdk_am64x_08_03_00_18),SBL将会先读取应用程序至MSRAM,然后再进行解析。由于MSRAM空间有限,分配给SBL使用的内存空间仅512KByte,并且SBL运行需使用部分MSRAM空间。因此,为确保SBL引导应用程序正常启动,应用程序大小不能超过380KByte。8 ?& K; B* t4 O6 v6 I
& n7 X0 y$ c9 K
& ^6 D; e2 k* @% e
& [. A7 k: v! Y+ U1 z
图 2
E# \! S! H, Z5 @- u! l9 P$ F; [6 F W
+ ~1 j0 r" G: j
基于Micro SD卡启动
0 ^) B" Z D( Y2 \1 J( Y 启动卡制作8 L L1 C; u5 v. ]0 A
请准备一张FAT32格式的Micro SD卡,通过读卡器将Micro SD卡连接至PC机。
1 f: h3 V; I% L9 h, R, ] 双击产品资料“4-软件资料\Tools\Windows\”目录下PartManFree-Setup.exe分区管理软件,按默认安装即可。安装完成后,打开分区管理软件,将会自动识别到Micro SD卡分区,请右键选中该分区,点击"Set Active"设置为活跃分区,如下图所示。
; P, t6 I+ t9 q2 I7 J) Y2 u$ P; `$ _2 s7 k( u7 E3 O. T
r/ p% m, p- y2 Q" r % V8 I( E2 F. y7 |1 O2 ?' m
图 3 进入MCU+ SDK组件安装目录"C:\ti\mcu_plus_sdk_am64x_08_03_00_18\tools\boot\sbl_prebuilt\am64x-evm\",将sbl_sd.release.tiimage拷贝至Micro SD卡,并重命名为tiboot3.bin,如下图所示。
: l+ Y0 N1 ]4 v 备注:sbl_sd.release.tiimage为官方提供的SBL镜像。
& {6 s+ }4 Y7 Z2 H9 E$ ?& j5 P5 G' O1 f' b' Z, B
1 Y( W/ X( L6 \4 O* [$ R4 K9 p5 V ![]()
/ ~; W& Z, L6 z- l+ n* y+ G图 4
* {# c, F1 ~8 q& E- l# H; z- T ; j6 w' X- I0 w5 y
图 5 2 c Y9 _* ]* U$ j- @: f( M, v5 R
单核启动 本小节以Cortex-A53核心的led_flash裸机工程为例进行演示,Cortex-M4F和Cortex-R5F核心操作步骤与之类似。
3 k. M8 q P; J& j 请参考《FreeRTOS、Baremetal案例开发手册》文档,正确编译产品资料“4-软件资料\Demo\Baremetal-demos\led_flash\project\”目录下的led_flash_a53ss_nortos工程,然后将编译生成的led_flash_a53ss_nortos.appimage镜像文件拷贝至Micro SD卡,并重命名为app。7 g, j# Z0 k' H& w
& [4 @# p$ u( Y/ y$ |5 R0 I3 R) B- M3 b9 y* c
. X/ j1 R. E7 I
图 6
/ M4 ~% c4 Y4 |0 p ![]()
* u0 I% I: }: L3 b) G图 7
: z& b# I4 G: y" k. k8 v 请将Micro SD卡插入评估板Micro SD卡槽,根据评估底板丝印将启动方式选择拨码开关拨为101000(1~6),此档位为Micro SD启动模式。然后使用Micro USB线连接评估板的USB TO UART0调试串口至PC机,
- @! K2 J v# Q& D Q: ^ 请将评估板上电启动,串口调试终端将会打印如下类似启动信息。同时,可观察到评估底板LED1、LED2闪烁,说明程序自启动成功。9 @( s8 N- m8 I' `& x* n. u9 J
9 O4 \$ \5 f- c5 V+ V
8 z. Y7 q& I) K7 u1 |- }: W ![]()
; ^; y" d4 [6 X- w- m图 8 2 i- l0 v W2 h+ e
多核启动 本小节以Cortex-A53、Cortex-M4F和Cortex-R5F核心的led_flash裸机工程为例进行演示。
: q1 n' `6 k; S 请在磁盘根目录新建一个非中文文件夹test,将产品资料“4-软件资料\Demo\Baremetal-demos\led_flash\bin\”目录下的led_flash_a53ss_nortos.out、led_flash_m4fss_nortos.out、led_flash_r5fss_nortos.out全部拷贝至该目录下。% {& A) K0 f! a# N$ ]$ C9 k0 [; ~
![]()
9 V% ~3 u8 m9 N% ?; D2 j6 F! ]图 9 2 f8 y& j; N1 E1 q
右键Windows按钮,点击"Windows PowerShell(I)",打开Windows PowerShell终端。
& d( J7 K7 e3 L! _# X! I+ r0 I8 p% N3 ]9 b3 F
# [' ~& u. d8 ^
1 }2 I/ R0 R, g+ B2 S) v
图 10 , h! k: L9 f0 M0 w+ }
在Windows PowerShell终端执行如下命令进入test目录。
) w2 ~- y9 ~( ?0 I! D b" G Window# cd E:\test\
1 m: Y5 \4 h8 a: {7 \1 _/ t; I1 D# k$ ~& j+ |8 V1 |% y
, ?) f* A0 |* X$ L2 ^7 Q J* q C* G# v* d/ \
图 11
/ F$ V' e, J2 k' [ - rprc文件生成
. I) }, J9 M, R7 }: \' O$ e# O L 在Windows PowerShell终端执行如下命令,基于xxx.out文件使用CCS和MCU+ SDK生成xxx.rprc文件,xxx.rprc文件已包含可加载段的bin文件。CCS与MCU+ SDK路径请以实际情况为准。7 c# j1 g# ] ^
Window# C:\ti\ccs1120\ccs/tools/node/node C:/ti/mcu_plus_sdk_am64x_08_03_00_18/tools/boot/out2rprc/elf2rprc.js led_flash_a53ss_nortos.out
: ~( w4 k# `5 h7 ?$ L! c$ V Window# C:\ti\ccs1120\ccs/tools/node/node C:/ti/mcu_plus_sdk_am64x_08_03_00_18/tools/boot/out2rprc/elf2rprc.js led_flash_m4fss_nortos.out3 @/ A* M6 D8 t% ^. j1 v
Window# C:\ti\ccs1120\ccs/tools/node/node C:/ti/mcu_plus_sdk_am64x_08_03_00_18/tools/boot/out2rprc/elf2rprc.js led_flash_r5fss_nortos.out
- n' G6 q" h. q7 _, j" Y* S- F [4 Z
+ ]+ r6 H. s. W* J4 _ + b6 W5 U8 ?6 E* O3 o0 B+ x
图 12
( U0 a, d* L5 c5 Y# O- ^ 执行完成后,将会在当前目录下生成了led_flash_a53ss_nortos.rprc、led_flash_m4fss_nortos.rprc、led_flash_r5fss_nortos.rprc文件。& m! n+ i, M! h, F6 P2 V: u
! v( D) A5 a) l3 @% N2 v, T. Y
, I0 V% X2 s% y; g" a
![]()
3 r$ e# N0 I" @图 13
2 ^$ I! A* Q h - appimage文件生成
/ E- V6 L4 v7 {; O2 y3 R2 i! J 基于xxx.rprc文件生成镜像xxx.appimage,需指定启动核心的ID,对应关系如下表所示。
' W9 [; U* a9 I% f/ `) @9 S 备注:AM6412包含1个Cortex-R5F核心:r5fss0_0;AM6442包含4个Cortex-R5F核心分别为:r5fss0_0、r5fss0_1、r5fss1_0、r5fss1_1。; k2 W+ n1 B0 e( w
, W7 I* ~2 |4 e; X
) ^" ~9 p- w' y2 y' ^. n % K7 G1 T! A- j/ t* A! r7 Z" B
表 1 9 I/ t! ~& x- D
在Windows PowerShell终端执行如下命令,将Cortex-A53、Cortex-M4F和Cortex-R5F核心的led_flash可执行程序合并为led_flash.appimage,并指定运行核心分别为a53ss0_0、m4fss0_0、r5fss0_0。, b" ]6 }; L5 L7 h1 H
Window# C:\ti\ccs1120\ccs/tools/node/node C:/ti/mcu_plus_sdk_am64x_08_03_00_18/tools/boot/multicoreImageGen/multicoreImageGen.js --devID 55 --out led_flash.appimage led_flash_a53ss_nortos.rprc@0 led_flash_m4fss_nortos.rprc@14 led_flash_r5fss_nortos.rprc@4 t8 ~+ c5 \& e5 T" W/ r
8 d0 L0 v, I6 E: Z ![]()
; j! U+ o/ u5 W图 14
0 f1 H* a6 ?1 d7 T( U6 k 执行完成后,将会在当前目录下生成led_flash.appimage镜像文件。 ]! U X' ~% O& F$ `+ t' O/ w
: h" f- C4 Y7 K: h8 D( O, T- @2 Y& Z0 t9 F, H
![]()
& E- k' D# p; v7 V( W1 ]2 P. u, w+ w图 15 3 _5 \/ P" v P, y
请将生成的led_flash.appimage镜像文件拷贝至Micro SD卡,并重命名为app。! B' I) a1 _/ M
) l. x1 j0 j& }" g7 S8 u- z. L2 C2 {: \, h+ k+ u
( U! d' k% l2 n8 ]
图 16 1 m+ h9 J7 T; q: E6 L6 [
请将Micro SD卡插入评估板Micro SD卡槽,根据评估底板丝印将启动方式选择拨码开关拨为101000(1~6),此档位为Micro SD启动模式。然后使用Micro USB线连接评估板的USB TO UART0调试串口至PC机。, }5 ]' Y; U& ^$ J ?
评估板上电启动,串口调试终端将会打印如下类似启动信息。同时,可观察到评估底板LED1、LED2、LED3闪烁,说明程序自启动成功。
X, k; W/ ?. q+ c7 W& _7 I% J( B S$ i
+ n" J. f% h, J$ n( x( ~ ![]()
8 L& m0 t) o" d# k图 17
3 e- T7 W" P) C6 k% B! W4 { 基于Linux引导裸机、FreeRTOS程序启动
, l9 r; `$ ]( v: i 基于Linux启动" m0 z9 Q' T7 d c0 Q* R1 r
本小节以产品资料“4-软件资料\Demo\RTOS-demos\”目录下的ipc_rpmsg_echo_linux案例为例进行演示。该案例主要实现Cortex-A53与Cortex-R5F核间通信,以及Cortex-A53与Cortex-M4F核间通信。+ @; }. }* I& M' `+ F# o
请将案例bin目录下的am64-main-r5f0_0-fw、am64-main-r5f0_1-fw、am64-main-r5f1_0-fw、am64-main-r5f1_1-fw、am64-mcu-m4f0_0-fw镜像文件拷贝至评估板文件系统根目录下。! L* F$ u1 i2 |% T3 ?
7 b! C+ T8 w; z4 y
. s d" E3 _8 H& @7 m( i1 L6 d
![]()
/ i! G9 R" p/ b! j l图 18 $ p4 E5 G$ U7 K' W* M; N
进入评估板文件系统,执行如下命令,删除原来的软链接。- R; p' E" I5 f) e
Target# rm /lib/firmware/am64-main-r5f0_0-fw/ ~! S9 V a5 q9 k" J+ F
Target# rm /lib/firmware/am64-main-r5f0_1-fw* ^9 e/ M; y+ V) q
Target# rm /lib/firmware/am64-main-r5f1_0-fw4 ?0 e+ h0 a4 P; x% c `' Y$ J; V: [ R
Target# rm /lib/firmware/am64-main-r5f1_1-fw u2 H+ b. t4 {1 K `; [2 `9 K
Target# rm /lib/firmware/am64-mcu-m4f0_0-fw0 g* q- o: K- U9 {% p0 W6 h
7 _1 w8 {) ?" @8 T+ U! v' u. p
. K* F, d/ `* v( y. d ![]()
: z: Y3 A0 M7 J* C. y1 z5 F0 I图 19 & q9 L7 i; |6 |" ~
执行如下命令,创建新的软链接。: H. D" r8 z. O `% s# J
Target# ln -sf /home/root/am64-main-r5f0_0-fw /lib/firmware/am64-main-r5f0_0-fw
3 [6 A+ f+ v5 ~: R- Z7 n7 ^. G4 l Target# ln -sf /home/root/am64-main-r5f0_1-fw /lib/firmware/am64-main-r5f0_1-fw; r$ a0 o3 L p3 N7 a1 }
Target# ln -sf /home/root/am64-main-r5f1_0-fw /lib/firmware/am64-main-r5f1_0-fw4 c0 V' w. e/ u$ a( H
Target# ln -sf /home/root/am64-main-r5f1_1-fw /lib/firmware/am64-main-r5f1_1-fw. [" m7 c6 o, K" F! @6 h+ m. \" p
Target# ln -sf /home/root/am64-mcu-m4f0_0-fw /lib/firmware/am64-mcu-m4f0_0-fw6 Q3 c6 c/ t! V8 K
% L5 p5 N g, H9 V4 b# Q# ^. o/ ^6 u
~. L# p& M3 h: O. ~* J
图 20
6 t% _% r! c$ x9 A( t2 @ 请将评估板重启,在系统启动过程中,Cortex-R5F、Cortex-M4F核心将会引导启动。在评估板文件系统执行如下命令,查询Cortex-R5F、Cortex-M4F核心与remoteproc关系。
$ o7 {+ h4 k0 \7 v! f- v& A# G! f0 A Target# head /sys/class/remoteproc/remoteproc*/name
- r5 S: M$ { p/ w$ K: F/ z0 s* Z$ b# z- E5 `- r
" Q3 D. L; Q- o+ ?- A 3 z1 c- U [& {3 H9 V
图 21 & {. q/ o( ]3 j4 U9 B9 l# A. {; d
![]()
/ t- L H: H* H# A. ?, W# G4 [- P表 2 p1 c# J" E: b) A
备注:核心与remoteproc对应关系,请以实际情况为准。
4 r {7 }. s# p/ A0 F# _0 f 执行如下命令,可查看Cortex-M4F、Cortex-R5F核心程序运行日志。* a0 L' y0 |. u. l5 F
Target# cat /sys/kernel/debug/remoteproc/remoteproc0/trace0
# o. W0 u% J4 q/ T& a0 U2 E Target# cat /sys/kernel/debug/remoteproc/remoteproc1/trace0% g4 P# \5 W+ C3 Y2 d
Target# cat /sys/kernel/debug/remoteproc/remoteproc2/trace0
4 A% ?7 R4 P6 n& d Target# cat /sys/kernel/debug/remoteproc/remoteproc3/trace0
8 p% @8 f; Q0 L. D* d( t6 B) j Target# cat /sys/kernel/debug/remoteproc/remoteproc4/trace0
^3 s- x& C( ~) B3 U6 h; `/ p
7 C- f( p3 J" r8 j( l5 H. q' Y! N/ w3 e+ m$ ^ e
5 V8 P1 j3 H# L' ~1 I1 _- t; t
图 22 5 X7 y% h7 W. e3 V
工程配置说明) Y" [! m: A4 f
本小节主要演示如何在Cortex-R5F、Cortex-M4F核心的Baremetal(裸机)工程与FreeRTOS工程中添加Linux引导配置。& ?( X! a3 m5 Q; N! _
9 Q$ K1 n" Q0 K! B
2 ?9 }3 O9 F) u6 ^ 内存空间说明
0 ^! y" G: C& L9 G1 Q" S 如Cortex-R5F、Cortex-M4F核心的工程需支持基于Linux启动,则需进行内存空间分配,在Linux设备树中已指定内存空间,预留给Cortex-R5F、Cortex-M4F核心使用。内存空间分配如下图所示。0 K9 O M! E! L
3 a" _+ n0 v4 u
" s) t* W5 H8 W7 K ![]()
, \) R, [- q) |) @4 o8 ?8 x4 [图 23 : }" q ?% P+ [3 p8 o' K7 A
Cortex-M4F工程配置" ?7 K4 ?) Q3 D+ r! ~- G: `
本小节以Cortex-M4F核心的led_flash裸机工程为例进行演示。4 i: g+ H6 v# S2 [9 p/ T( _, G' m
- IPC配置1 h! g8 V: X- Y+ E1 \
在syscfg配置文件,添加IPC配置,具体配置如下图所示。
/ S3 D, n6 y h3 l/ I
; X" ]; ` J4 N- s+ n# h* o. T6 \3 h# B! Z! j; D/ q
8 ~& m- X% G9 w, M
图 24
' v9 x) ^# |/ E# H X - 编译器链接脚本修改
' {. Y0 b. ?, w) y 双击打开编译器链接脚本linker.cmd,修改脚本内容。! X# q! t; Z" Y2 u/ }4 N' v; k
# y) f. @, P- d$ F8 \" ?$ s
1 ~; }' K; i2 r7 s! z! @
![]()
# e* h) R0 H0 J3 m图 25
6 ^/ O& b n- {0 x6 ~* D: w% W - 在SECTIONS命令中新增一个.resource_table段,具体代码如下所示。: d& j! I7 E" g; q! Y$ | I3 Z0 e
GROUP {7 a- l% L2 a8 \
/* This is the resource table used by linux to know where the IPC "VRINGs" are located */
. J6 l: \( P- |* D! n! |: l3 g .resource_table: {} palign(4096)( V* x }+ Q% |4 S
} > DDR_0. @$ C0 P0 k8 u
& H' t1 ?3 D) o( c
% D9 |$ D: X) }1 Y* ]& v
. X( Y! F# b. X: O [
图 26 + l- S* v$ c# O! Q$ ]
- 在MEMORY命令中,设置.resource_table段的加载地址为0xA4100000,作为Cortex-M4F预留内存空间,具体代码如下所示。
: z8 \% C2 L9 G; A! } /* Resource table must be placed at the start of DDR_0 when M4 core is early booting with Linux */8 L9 }6 c7 r0 i- i6 d
DDR_0 : ORIGIN = 0xA4100000 , LENGTH = 0x1000
5 r* L5 v% v+ |: o* ]2 m1 U" w+ l) }* n% ~
" y. \$ T4 ]' e0 O+ b2 u, ~ ![]()
/ o4 ]% m3 {8 v5 I图 27
$ L5 _$ K" a, Q Cortex-R5F工程配置/ C z* d& i3 g, D
本小节以Cortex-R5F核心的led_flash裸机工程为例进行演示。
( j1 r# m: o% F AM6412包含1个Cortex-R5F核心:r5fss0_0;AM6442包含4个Cortex-R5F核心分别为:r5fss0_0、r5fss0_1、r5fss1_0、r5fss1_1。不同的Cortex-R5F核心,编译器链接脚本指定的.resource_table段加载地址有所不同,具体如下表所示。* T& P) o6 X7 ~' I7 I
% `2 S$ r+ Y6 u
6 i* n- Z9 s3 a0 r' ` ![]()
* b& w6 b& t. M6 K! c; V* z3 v, m表 3
9 j) y# y0 \$ i3 i. m2 @8 x6 L; \ led_flash_r5fss_nortos工程配置的Cortex-R5F核心为r5fss0_0,下面演示如何修改led_flash_r5fss_nortos工程配置,实现基于Linux引导启动r5fss0_0。
7 H6 d& z6 t; v. v& s - IPC配置
, T2 [; a5 N2 d+ f( ~ 在syscfg配置文件,添加IPC配置,具体配置如下图所示。3 y* ~9 j; }5 q% Z$ _
4 i$ _1 U" Z6 ]1 d0 ?7 _
: V* ]6 H0 ]- ^# Y& k9 H+ ~ - W; @ c1 u; R
图 28
" y+ C U" Z5 z - UART配置
' A$ u& A& S$ a9 e5 |7 s UART0为Cortex-A53核心(Linux系统)的调试串口。在led_flash_r5fss_nortos工程中已配置UART0作为调试串口,请在syscfg配置文件取消勾选"Enable UART Log"配置选项,或修改为Linux设备树中未使能的串口。' o/ M, n5 a- f1 |% D' p: M
2 f' |' x: x- h/ k8 s, k* }- i C
![]()
: s& j- V Y' }2 [" Q2 l图 29
9 n( L. k2 g$ T; r* ? - 编译器链接脚本修改
. Z/ D3 |/ |- m/ _' j4 D/ U* P) I/ x! y 双击打开编译器链接脚本linker.cmd,修改脚本内容。
0 i$ H! c) k, V; H6 v: v$ X
8 |# l% N# E) h* R& _/ E
5 v4 R! ]5 ^2 u/ Z9 J0 X 0 r0 U% p& O' b8 M' @4 G
图 30 + U* O# r; C4 f
修改内容如下: o+ g% W8 A$ _" z6 z
- 启动代码链接至R5F_TCMA;
- 新增一个.resource_table段;
- 代码段、数据段、bss段、堆栈全部链接至DDR,在Linux上为r5fss0_0预留内存地址空间;
, Y @3 i: T) ?6 `# W SECTIONS
; ?9 ], r& k ?' | `$ |" i {8 R/ I0 ~8 D6 A0 L! R S8 d$ ?
GROUP {
: ?3 Y R/ m3 K% H1 \; A .text.hwi: palign(8)
( w2 j. m4 p9 d* m/ A8 Y8 U .text.cache: palign(8)
/ }, R' Q9 W) f .text.mpu: palign(8)
% n) @4 } M6 c! X& R! G. ? .text.boot: palign(8)( H. [% g$ Q6 Q/ _4 M: G
.text:abort: palign(8) /* this helps in loading symbols when using XIP mode */! A' c D! K& S2 U7 K
} > R5F_TCMA: y5 w0 e9 r) @' k0 z1 |
GROUP {
$ n3 y9 T: E' m5 l; D' ?3 s .text: {} palign(8) /* This is where code resides */( ~; S) k8 T! C9 K5 p/ j
.rodata: {} palign(8) /* This is where const's go */! I% l* N' M, y! K
} > DDR_1- B; \+ E; S* q* W. P
GROUP {
3 I- L: m, {9 L! [ /* This is the resource table used by linux to know where the IPC "VRINGs" are located */
: f: R) B/ v& @( r! | .resource_table: {} palign(4096)+ M' V; j. L+ `! v6 J1 d
} > DDR_0
; c# D. t1 I! z3 a. K7 _9 u GROUP {
, t8 k/ a" ]' \ .data: {} palign(8) /* This is where initialized globals and static go */
+ S- [7 o/ n6 } ~6 h; g$ ]0 S } > DDR_1
1 C; o5 N8 K9 U( w( O GROUP {
( Q5 L( r% i( C' S" Y8 p .bss: {} palign(8) /* This is where uninitialized globals go */
& X2 o$ F5 ` g RUN_START(__BSS_START)
* Q/ p$ y8 p* z* L! T3 `' |5 ~ RUN_END(__BSS_END), F* B% c2 m& T; m/ l
.sysmem: {} palign(8) /* This is where the malloc heap goes */
: j. P: d5 z- [9 j& j .stack: {} palign(8) /* This is where the main() stack goes */
' @ y6 p! D) l } > DDR_1% ^, s0 G8 j- M
GROUP {+ ?' s! i b, R3 [; L5 Z
.irqstack: {. = . + __IRQ_STACK_SIZE;} align(8)# y5 H& r! ?% e0 l6 G% M& Z
RUN_START(__IRQ_STACK_START)5 O4 J- m/ g) ~; S
RUN_END(__IRQ_STACK_END)
2 F) l0 M0 ]- h% b .fiqstack: {. = . + __FIQ_STACK_SIZE;} align(8)
% i0 l: u, I4 i RUN_START(__FIQ_STACK_START)! ]. S4 U+ r: | p" O
RUN_END(__FIQ_STACK_END)9 v7 a2 y4 Q3 K" E6 f0 C
.svcstack: {. = . + __SVC_STACK_SIZE;} align(8). f$ T) n. K& x) Y6 v3 u
RUN_START(__SVC_STACK_START)
9 D6 B) p# ^; X RUN_END(__SVC_STACK_END)! w# U+ u1 D2 F' j. [, r
.abortstack: {. = . + __ABORT_STACK_SIZE;} align(8)' ~" m K: _ j+ A J+ w. c9 C
RUN_START(__ABORT_STACK_START). N: U; n& v- d+ L! q+ e
RUN_END(__ABORT_STACK_END)
0 z' ^( U" h- n9 h .undefinedstack: {. = . + __UNDEFINED_STACK_SIZE;} align(8); j& a7 L" U! I' O& a7 m2 B
RUN_START(__UNDEFINED_STACK_START)
9 G# |% D' f) F- Y3 u RUN_END(__UNDEFINED_STACK_END)
+ @ U5 e& R* G! { } > DDR_1
; E0 J k2 f, Y9 a /* Sections needed for C++ projects */
. O* v# K+ V# i0 k s( \ GROUP {
3 ~ Y( ~3 Q9 g6 O; E# [/ I" c4 ~ .ARM.exidx: {} palign(8) /* Needed for C++ exception handling */1 p' n' q, }' T4 @. l5 G! D% w2 |* U% T
.init_array: {} palign(8) /* Contains function pointers called before main */- U7 G4 G/ H( V, d) L. D0 b
.fini_array: {} palign(8) /* Contains function pointers called after main */9 T. r( K* D. O$ U! q9 {4 P+ M" P
} > DDR_13 T/ H& Y1 s: _) J* n
/* Sections needed for C++ projects */7 O; i% W! o i4 p+ z2 j
GROUP {# w) T4 U& E( J, X6 _
.ARM.exidx: {} palign(8) /* Needed for C++ exception handling */$ q7 S+ p9 F, }
.init_array: {} palign(8) /* Contains function pointers called before main */
* J. a$ h9 I" K* C .fini_array: {} palign(8) /* Contains function pointers called after main */
+ E/ N' D; M3 H$ V7 n: \ } > DDR_1
8 @/ Q; J* n" G5 @" N7 C }
! w4 R! P3 F e A& l( M- c* ?3 b3 q$ d" l( ?
; V; j4 ?5 j. V+ j2 e
_9 |/ U5 s Q, p& a, N
图 31 4 L g* v6 R, P* p D
$ Q! `2 v f" E2 L: J' }
图 32
+ j5 w) D: I) M - 设置.resource_table段的加载地址为0xA0100000,作为r5fss0_0核心预留内存空间;
- 设置共享内存链接至Linux为共享内存预留的内存地址空间。
. E D4 d! p7 H) C8 C /* Resource table must be placed at the start of DDR_0 when R5 cores are early booting with Linux */' g7 [% m9 Z9 S/ t% b
DDR_0 : ORIGIN = 0xA0100000, LENGTH = 0x1000
5 S' P) f, p; O DDR_1 : ORIGIN = 0xA0101000 , LENGTH = 0xEFF000
) h- o+ r" a1 e q# b( z1 t/ S USER_SHM_MEM : ORIGIN = 0xA5000000, LENGTH = 0x80' l* M9 _ M; V* K
LOG_SHM_MEM : ORIGIN = 0xA5000000 + 0x80, LENGTH = 0x00004000 - 0x80( e8 a |: ?" f. E
RTOS_NORTOS_IPC_SHM_MEM : ORIGIN = 0xA5004000, LENGTH = 0x0000C000
7 g% f. G, K/ x* m6 t2 I+ n3 I/ T7 `! o/ e& o7 K) O' q' ?7 u" A N
3 E. A1 x, L2 m3 I6 Q% A1 u ! Y/ f+ z8 K. K6 ~0 D& |
图 33
9 | U3 d8 n! A3 }- A
" s& k$ y$ _7 V4 t! y
' P; n8 S) _ }- F! d0 [ C) [' g3 ^* c: Q( p4 x" I5 O) `7 W
|