EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
前 言
" j3 v1 c) @% k& H8 M; o 本文主要介绍AM64x的Cortex-A53、Cortex-M4F和Cortex-R5F核心程序自启动使用说明。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。
" S5 k7 ]& j* k2 W2 o- L9 D5 |/ H( \/ p h3 C5 Z7 n% K. M# n4 v
" b. t2 G q/ ~/ G j
本说明文档适用开发环境如下:, [; I$ a% C1 d1 W* l8 z8 X
" K3 x1 n2 c2 c2 F Windows开发环境:Windows 7 64bit、Windows 10 64bit
1 M* U A: f8 E 虚拟机:VMware15.5.5
$ b5 s! P# J4 K; [+ v9 Z Linux开发环境:Ubuntu 18.04.4 64bit2 o3 ^& s4 z! k2 |: D+ w6 ^! P
Linux Processor SDK:ti-processor-sdk-linux-rt-am64xx-evm-08.01.00.39- p) g$ E9 M! D6 v
U-Boot:U-Boot-2021.01
+ _# m. N' D3 H6 w+ G7 ?! z CCS版本:CCS11.2.0
$ o) w( ]0 X0 s& O' K9 q5 H mcu+ SDK:mcu_plus_sdk_am64x_08_03_00_18
1 s. `# c" g- a/ @5 D SysConfig:sysconfig-1.12.1_2446
+ O( w& w* i z: f# U GCC AARCH64 Compiler:gcc-ARM-9.2-2019.12-mingw-w64-i686-aarch64-none-elf
7 ^+ K# \4 e. z" t% P% Z! _& F 本文测试板卡为创龙科技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和高低温测试验证,稳定可靠,可满足各种工业应用环境。" p5 L$ M8 Z- G
; Q: T7 x3 b. K" z
( g* F# w: I8 ?4 h0 g& Q0 k ![]()
/ f9 H* a& ?6 j+ F$ L: x' Q7 E
' g; w/ L i1 I8 t7 o% z% T" D8 K2 v 用户使用核心板进行二次开发时,仅需专注上层运用,降低了开发难度和时间成本,可快速进行产品方案评估与技术预研。
, \% L1 B) N( s
1 h% M6 r+ `5 {$ Z
$ U2 t. ^ R0 H 基于SBL引导裸机、FreeRTOS程序启动 ~- E5 L1 G& `
程序启动流程说明
& ]" c# \( f; _* }/ `9 x 评估板上电后,固化在CPU内部的RBL将会先运行,RBL根据评估板BOOT SET从启动介质(如eMMC,Micro SD、SPI FLASH)读取SBL,然后通过SBL引导应用程序启动。
: {8 ]$ y6 F% Y2 b$ b4 z. r 程序启动流程如下图所示。
) P$ @, |9 S# U* A" d! l9 p' H! s- b. v4 w1 X
" Y2 [8 W" F; ] ![]()
& l+ _! }; b. x7 v4 `; U2 s图 1 目前官方提供的MCU+ SDK(版本为mcu_plus_sdk_am64x_08_03_00_18),SBL将会先读取应用程序至MSRAM,然后再进行解析。由于MSRAM空间有限,分配给SBL使用的内存空间仅512KByte,并且SBL运行需使用部分MSRAM空间。因此,为确保SBL引导应用程序正常启动,应用程序大小不能超过380KByte。
5 k' W& k" e; O% U8 @9 ~6 e( ]# C
. l$ v! a" D- c/ K5 E3 i/ `$ t0 b; \0 F& a
4 J9 g$ V) m& t; x, D$ T
图 2 ( q' L" |+ W- F6 `2 t
' [) A& H6 p! j6 E! { z1 z) L& O 基于Micro SD卡启动1 l+ Q, K1 t% q3 g$ a/ d& P: C
启动卡制作
% r7 [# O5 J) ~9 W% I% D' { 请准备一张FAT32格式的Micro SD卡,通过读卡器将Micro SD卡连接至PC机。
- t! s( d% [8 G) [ x9 l 双击产品资料“4-软件资料\Tools\Windows\”目录下PartManFree-Setup.exe分区管理软件,按默认安装即可。安装完成后,打开分区管理软件,将会自动识别到Micro SD卡分区,请右键选中该分区,点击"Set Active"设置为活跃分区,如下图所示。
5 t3 r) G: t' P E# D# C1 i4 K7 D" Z5 y& H5 y' {7 H
, l& n% i% d7 m; @
) t0 h1 ~! U6 }8 d
图 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,如下图所示。
$ S5 r6 O# j% M/ W 备注:sbl_sd.release.tiimage为官方提供的SBL镜像。
3 b0 i" |) f( q B4 N. t) F4 }: A% r- X2 A- l
7 J' w) ~. ?2 z. G; z& ~ ![]()
/ J+ v; x8 C* Q6 [2 E图 4 1 j8 _- U% u% N4 G4 Q7 v" M; b' F6 ~ v
![]()
/ P" M) \5 z9 p: }2 S: Y图 5
' U3 Y. u) E8 C 单核启动 本小节以Cortex-A53核心的led_flash裸机工程为例进行演示,Cortex-M4F和Cortex-R5F核心操作步骤与之类似。
/ G; e0 N; X8 E 请参考《FreeRTOS、Baremetal案例开发手册》文档,正确编译产品资料“4-软件资料\Demo\Baremetal-demos\led_flash\project\”目录下的led_flash_a53ss_nortos工程,然后将编译生成的led_flash_a53ss_nortos.appimage镜像文件拷贝至Micro SD卡,并重命名为app。% R& J' e6 Y0 ? k5 G- {
: y; k9 F5 t0 q. P* B. }2 N( D1 _' i" _. W4 F, D4 d
: R6 K$ f |0 B$ U
图 6 ! b }5 n6 V& H
![]()
1 F F" B/ W4 k# @# | y图 7 5 b% _; t) f* ?, D' u
请将Micro SD卡插入评估板Micro SD卡槽,根据评估底板丝印将启动方式选择拨码开关拨为101000(1~6),此档位为Micro SD启动模式。然后使用Micro USB线连接评估板的USB TO UART0调试串口至PC机,
! F }/ w; Z: j6 s$ W. } 请将评估板上电启动,串口调试终端将会打印如下类似启动信息。同时,可观察到评估底板LED1、LED2闪烁,说明程序自启动成功。
% s0 R4 B1 d1 ~) {" m! O1 t8 U6 t# B/ r1 D5 `# l
1 n6 A5 K, Z2 \) {9 ?! \ ![]()
) p! V' w* W+ `! l; \- R图 8 6 w3 h3 y% w' N
多核启动 本小节以Cortex-A53、Cortex-M4F和Cortex-R5F核心的led_flash裸机工程为例进行演示。; j4 U5 M' F5 o& X
请在磁盘根目录新建一个非中文文件夹test,将产品资料“4-软件资料\Demo\Baremetal-demos\led_flash\bin\”目录下的led_flash_a53ss_nortos.out、led_flash_m4fss_nortos.out、led_flash_r5fss_nortos.out全部拷贝至该目录下。
& m: \* B9 A3 i2 R5 t7 d. e6 | ![]()
9 h2 F+ ?1 p9 A3 i5 V! U; I- c图 9 ) I* L5 _5 G9 @, G9 l: A
右键Windows按钮,点击"Windows PowerShell(I)",打开Windows PowerShell终端。
0 L. E; l& w: \) f* r0 t$ D" L3 l$ T, v
4 b9 p* Q, w# f; I; ~4 S 6 N. j6 s# L7 X1 P' H4 V
图 10
; x5 M X z1 M* f/ I8 ~1 O% L* m 在Windows PowerShell终端执行如下命令进入test目录。 S8 \$ R7 N" ~( P" D
Window# cd E:\test\
3 |2 H3 W3 }+ x$ }, H- A2 @$ I6 y4 w# _# I- T/ H& j
* x8 g) G/ F# X1 | ![]()
4 z3 b4 l* Z+ B! N+ _" o' ~5 z图 11
: q( G9 \8 M# N% U Y - rprc文件生成' w0 [5 ~1 l' b N( A8 o. h& q
在Windows PowerShell终端执行如下命令,基于xxx.out文件使用CCS和MCU+ SDK生成xxx.rprc文件,xxx.rprc文件已包含可加载段的bin文件。CCS与MCU+ SDK路径请以实际情况为准。
) o( P: p' }% f9 ]( f, B5 C 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
- s7 k* T: T7 s 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.out
* A# u$ a, ]8 u5 a9 ]0 h1 [. q. L 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
5 b( |* d8 T: T: |4 ~
3 d6 F' ]- Z$ I0 [2 Z8 t4 |/ F0 w- y" V6 H6 c1 ]9 @7 z
![]()
0 R D) _7 F1 F) z图 12 ; V, X, j1 A, T9 c: {
执行完成后,将会在当前目录下生成了led_flash_a53ss_nortos.rprc、led_flash_m4fss_nortos.rprc、led_flash_r5fss_nortos.rprc文件。. C' U" A! ^, V; H% W, z
8 j/ x; X1 v+ g
% }& a, {! E6 R( ]& }9 J4 R ![]()
3 P, r2 L3 ?! x) b) }图 13 , q |7 Y* a3 ?! J) e M# \3 f8 N
- appimage文件生成
/ z3 @! ~3 M# _; H+ r* n8 d$ V 基于xxx.rprc文件生成镜像xxx.appimage,需指定启动核心的ID,对应关系如下表所示。5 o/ o' |! [$ M* W. Y
备注:AM6412包含1个Cortex-R5F核心:r5fss0_0;AM6442包含4个Cortex-R5F核心分别为:r5fss0_0、r5fss0_1、r5fss1_0、r5fss1_1。
3 f+ c. O+ X T+ A
8 \) o# C" A( V! Y. c h% ^
. A& d1 d& y" y4 R ![]()
" r; ?* B0 V# ]表 1 : r4 T/ l: u; N. A3 |
在Windows PowerShell终端执行如下命令,将Cortex-A53、Cortex-M4F和Cortex-R5F核心的led_flash可执行程序合并为led_flash.appimage,并指定运行核心分别为a53ss0_0、m4fss0_0、r5fss0_0。
* A' T: V* I! a+ n: k# X5 x 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
. [: s2 \) d l# B/ i) J8 _$ } W. F6 \1 c
, c: y- ~. [3 G; M: {! K
图 14 & j& g* Q( C- |' E/ b$ j3 Y+ G8 V
执行完成后,将会在当前目录下生成led_flash.appimage镜像文件。: d5 j0 w6 r9 S/ y& m
) M4 {% ?0 F# y4 c
1 B; s8 { ^9 n7 [( c C! _ ( b0 V+ A* f2 t' V
图 15 : X6 U. t2 p) @. D
请将生成的led_flash.appimage镜像文件拷贝至Micro SD卡,并重命名为app。) E7 W7 [( P! ?- U
' U7 ^3 I! {) k% d, ]. Q0 s5 U1 A( R5 g1 A. H+ G7 R4 G
![]()
8 F. z L/ a* v7 A: f% @图 16 5 Z7 e" ?3 u2 j, t' M9 g1 D3 H
请将Micro SD卡插入评估板Micro SD卡槽,根据评估底板丝印将启动方式选择拨码开关拨为101000(1~6),此档位为Micro SD启动模式。然后使用Micro USB线连接评估板的USB TO UART0调试串口至PC机。
2 S$ \1 Q& {5 W* s 评估板上电启动,串口调试终端将会打印如下类似启动信息。同时,可观察到评估底板LED1、LED2、LED3闪烁,说明程序自启动成功。
( m- \/ \+ ^: W9 ?* I) P2 [- \$ R* J) {3 p' a8 n2 v
, _- B9 H$ `# h: X) X! H ![]()
& v* ^9 j5 B1 N/ t7 X a, s图 17 * p% R' I$ ~4 D" d/ o
基于Linux引导裸机、FreeRTOS程序启动
0 ^; r: Z7 k8 v4 M 基于Linux启动
o4 \) c4 u, j j) Y+ U 本小节以产品资料“4-软件资料\Demo\RTOS-demos\”目录下的ipc_rpmsg_echo_linux案例为例进行演示。该案例主要实现Cortex-A53与Cortex-R5F核间通信,以及Cortex-A53与Cortex-M4F核间通信。# j/ V( c# ]; K5 M, C6 L! D
请将案例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镜像文件拷贝至评估板文件系统根目录下。0 {6 u" z% X: i" s
& c+ `& W: g2 [! W4 o
+ N- X' }9 F& c0 r8 t, r! m, ~4 { : M3 z0 p& B: _7 i Q& S9 S( f$ E7 t
图 18
9 p! S" N' O1 h; Q: x 进入评估板文件系统,执行如下命令,删除原来的软链接。
( h7 y3 O6 R* k Target# rm /lib/firmware/am64-main-r5f0_0-fw& O9 q% W2 a3 j z
Target# rm /lib/firmware/am64-main-r5f0_1-fw
) O1 t% t$ X3 q) n5 o5 N. \ Target# rm /lib/firmware/am64-main-r5f1_0-fw
2 Z! P3 l7 S$ I( V Target# rm /lib/firmware/am64-main-r5f1_1-fw
$ ?2 {! _3 w" X. i) Q# _ Target# rm /lib/firmware/am64-mcu-m4f0_0-fw+ G- C8 }! {3 W1 F6 Y4 ]
" P9 \+ Y6 J& x& S
% a' n' L/ ~' p9 q" U: i. ~/ t
! N+ _" c; d8 G4 I5 w$ j* m& q
图 19 / u$ @% l5 \5 E$ P: M0 V3 ~! s
执行如下命令,创建新的软链接。
: n/ A$ [3 T/ c- w5 C Target# ln -sf /home/root/am64-main-r5f0_0-fw /lib/firmware/am64-main-r5f0_0-fw
" ^4 C3 s/ ^' w i; v* g9 i/ o Target# ln -sf /home/root/am64-main-r5f0_1-fw /lib/firmware/am64-main-r5f0_1-fw
1 m, n, i6 T2 U4 P7 ^$ `2 l2 ^ Target# ln -sf /home/root/am64-main-r5f1_0-fw /lib/firmware/am64-main-r5f1_0-fw
. @5 N" K3 ^) H' V Target# ln -sf /home/root/am64-main-r5f1_1-fw /lib/firmware/am64-main-r5f1_1-fw
" t2 u6 F1 T9 M Target# ln -sf /home/root/am64-mcu-m4f0_0-fw /lib/firmware/am64-mcu-m4f0_0-fw
) Z/ a# N& ?' @: C9 Q' {+ [- N0 h/ n" ?% b/ V7 M, {7 c
. U+ A$ [( }" ]; q" I- l : r; I# [9 E6 ~4 b7 Q+ t; k
图 20 H9 [- H' w8 z" q
请将评估板重启,在系统启动过程中,Cortex-R5F、Cortex-M4F核心将会引导启动。在评估板文件系统执行如下命令,查询Cortex-R5F、Cortex-M4F核心与remoteproc关系。
9 ~# W+ o* E1 L. [) W Target# head /sys/class/remoteproc/remoteproc*/name1 y2 l2 {% \+ ^" P/ S! ]
" O4 E# ~7 V, O F$ @) W
5 y* [3 {4 t$ @1 ^+ M ![]()
- ^$ m; v; P7 a7 a& \' L! X8 |, \1 W& i图 21 4 I8 q4 L2 H3 ?3 T# g$ R4 t
![]()
+ a+ c2 \, L3 e- n表 2
; A7 k5 i0 I* Z9 _0 A3 g( C 备注:核心与remoteproc对应关系,请以实际情况为准。, p9 F# K" e# n% ^
执行如下命令,可查看Cortex-M4F、Cortex-R5F核心程序运行日志。+ d, r9 e' L( G# Y" y6 u+ |" ^
Target# cat /sys/kernel/debug/remoteproc/remoteproc0/trace0 Q! N5 h$ y! O' b3 h
Target# cat /sys/kernel/debug/remoteproc/remoteproc1/trace0
' I6 x' h8 `# V$ Z# @! K! x Target# cat /sys/kernel/debug/remoteproc/remoteproc2/trace0
3 z, K9 `+ `$ x6 M5 \9 U1 ^ Target# cat /sys/kernel/debug/remoteproc/remoteproc3/trace0. w4 N1 ]# Y2 U D! ^5 n# m
Target# cat /sys/kernel/debug/remoteproc/remoteproc4/trace0$ S5 O% L& K% E
. w1 j- K/ d! o
& G+ E" z- d/ L
" u5 q8 K1 b/ V* g: F( A. y+ R- @
图 22
6 r2 U. W! H% v8 k p 工程配置说明5 }# X- ]6 q3 P, M7 K7 S' @
本小节主要演示如何在Cortex-R5F、Cortex-M4F核心的Baremetal(裸机)工程与FreeRTOS工程中添加Linux引导配置。 r$ N0 L6 w. m5 j' L1 S+ y
# U) J. q; T( n6 j* q% Y) ^
! X4 |& g0 S, y, V, o 内存空间说明
{: V8 L* ~( ?! M3 g 如Cortex-R5F、Cortex-M4F核心的工程需支持基于Linux启动,则需进行内存空间分配,在Linux设备树中已指定内存空间,预留给Cortex-R5F、Cortex-M4F核心使用。内存空间分配如下图所示。% j4 q' w9 \% @& G+ N
: }$ D# r* ]5 b: \0 f. Z
( n' k8 V; \' x8 } O ! \8 }/ H0 S6 f8 y
图 23
5 H R# T' M: N; } Cortex-M4F工程配置
; f- O+ f; `# v( m% h 本小节以Cortex-M4F核心的led_flash裸机工程为例进行演示。
: A- s1 w; V1 | c1 n7 J - IPC配置! g% A: l+ ^' v, D7 E O
在syscfg配置文件,添加IPC配置,具体配置如下图所示。
6 Y% ~7 t, ]0 R, r1 ^2 W/ l) f( u* ? u- d0 m
) u( u7 p6 L( P3 P$ G1 G5 N
/ D7 H# O' A; f- J
图 24
. ~, i& M" M9 Y, o3 u - 编译器链接脚本修改
5 K$ ?" Q# J# _8 ^. v9 T# Z1 A 双击打开编译器链接脚本linker.cmd,修改脚本内容。
- h* p* ^! I0 l, e9 }0 i3 F$ ]! H
! a* H1 Q+ {& T( \8 X- }7 C5 M; A& e
5 ?) `4 L6 x7 o0 Q5 Z& ~ e) {% v' T
图 25
2 q: E0 U8 D: f5 E0 L( n - 在SECTIONS命令中新增一个.resource_table段,具体代码如下所示。
" I3 ^: h+ H( X" B4 V/ I GROUP {
6 T4 a7 g2 l) ^& V /* This is the resource table used by linux to know where the IPC "VRINGs" are located */( j' X) d5 k h4 n9 }- @
.resource_table: {} palign(4096)
' {/ h6 {4 |6 v3 ^9 A1 b } > DDR_02 K0 I9 Z, S8 c8 X I
- W* ]4 g( K2 f/ s0 K5 D/ t. q l: }, o
* F' O3 K- H7 J* ?
图 26 4 I2 ~ A6 y/ M0 R1 ^
- 在MEMORY命令中,设置.resource_table段的加载地址为0xA4100000,作为Cortex-M4F预留内存空间,具体代码如下所示。
! B: X: _" G! U( p /* Resource table must be placed at the start of DDR_0 when M4 core is early booting with Linux */
5 [6 L6 L5 e8 w+ C5 g DDR_0 : ORIGIN = 0xA4100000 , LENGTH = 0x10005 P5 W0 l7 s0 x8 g" s& I
( Q7 d1 `. I) ]
( p9 c( p/ j% o7 w& g ![]()
& |1 t3 z' a, Z图 27
$ F9 L4 Z9 E/ R B$ r7 \ Cortex-R5F工程配置( K) W) p- R" z% i1 S i0 f
本小节以Cortex-R5F核心的led_flash裸机工程为例进行演示。
3 n* N# R+ ?1 U: H8 u AM6412包含1个Cortex-R5F核心:r5fss0_0;AM6442包含4个Cortex-R5F核心分别为:r5fss0_0、r5fss0_1、r5fss1_0、r5fss1_1。不同的Cortex-R5F核心,编译器链接脚本指定的.resource_table段加载地址有所不同,具体如下表所示。; ?1 b4 W) c% h6 X* R' v# r
% q7 B6 h% y) J \* o4 v
/ u2 Y" L9 i! h" R7 e- n 0 A5 K- g+ H. E7 m2 a# B3 `" f
表 3 ; d+ e r) h6 @4 [! N9 C
led_flash_r5fss_nortos工程配置的Cortex-R5F核心为r5fss0_0,下面演示如何修改led_flash_r5fss_nortos工程配置,实现基于Linux引导启动r5fss0_0。8 |. R! u. n4 f- R3 U4 W; \
在syscfg配置文件,添加IPC配置,具体配置如下图所示。, b' z2 t, @9 ~0 u- K Z
7 j6 R# C' k3 `9 e# K1 k6 ~. c e3 C, p( l$ y
![]()
- s/ a A# d3 d$ Q2 Z1 ]图 28
' J/ w3 p3 } u0 Q - UART配置
# \4 F: R0 S# Z, u+ m# ] UART0为Cortex-A53核心(Linux系统)的调试串口。在led_flash_r5fss_nortos工程中已配置UART0作为调试串口,请在syscfg配置文件取消勾选"Enable UART Log"配置选项,或修改为Linux设备树中未使能的串口。
I \* N8 P' f9 V7 E$ N3 D; I4 F: C! ?/ o. ?% |. [, c" E
, N& P7 \$ E- ~, w$ q
* y- e7 Y8 J8 X* x8 V# ?+ |) `
图 29 + B$ H# Q& N& W' c
- 编译器链接脚本修改
- f- A3 [- u: k, P( j 双击打开编译器链接脚本linker.cmd,修改脚本内容。# `" h' ^( Y8 W( d7 S
- ?( {& ]3 q& u. ]! d* G
! U) Z9 I6 s! x; F8 p, r+ Y8 L ![]()
2 b: c1 D' N5 J6 \9 ]图 30 4 {& X5 f. h6 _8 b8 }4 e
修改内容如下:
( [$ N6 A b- X% i1 H - 启动代码链接至R5F_TCMA;
- 新增一个.resource_table段;
- 代码段、数据段、bss段、堆栈全部链接至DDR,在Linux上为r5fss0_0预留内存地址空间;
, Y& b+ j. \0 ~4 O. J" Y2 l6 |- m SECTIONS9 I+ u& ` M7 q/ J3 v' D) @( _
{
: p7 [$ _/ @+ ^, H1 V5 V GROUP {% _9 N; v0 W" }) j' S5 x
.text.hwi: palign(8)( {0 @- l/ z2 [, W! r; F! n
.text.cache: palign(8)) c* K3 s- }/ |7 B, u. ?8 v* b3 x
.text.mpu: palign(8): t# |+ l$ y5 }2 i2 Q
.text.boot: palign(8)
! \" P7 c) i9 U- G .text:abort: palign(8) /* this helps in loading symbols when using XIP mode */
5 H' J# t' f$ G3 q- G } > R5F_TCMA0 \5 O) p; _# k6 D1 ?2 E
GROUP {
7 ?& R% a/ V( d, g0 o .text: {} palign(8) /* This is where code resides */
/ j# k5 r7 E2 W- I0 m, U .rodata: {} palign(8) /* This is where const's go */
" v# j8 u5 [) j } > DDR_1
- a. L8 p( [0 f6 H4 `6 z6 ^+ P2 d0 ^ GROUP {; E2 C* T B+ L
/* This is the resource table used by linux to know where the IPC "VRINGs" are located */
: R6 ?/ \- h+ J9 S .resource_table: {} palign(4096)* ?" _) l8 z+ H5 a9 X
} > DDR_0# |6 J& i# ]8 v% i {6 C
GROUP {
8 \ H4 Y- X( j+ Z; M .data: {} palign(8) /* This is where initialized globals and static go */
5 w8 i; @2 I8 A# W5 I: B } > DDR_18 c. i5 q% O& S2 n
GROUP {* @* x1 Y) s4 e6 O
.bss: {} palign(8) /* This is where uninitialized globals go */. M8 _$ d/ N* p2 D A: L0 s
RUN_START(__BSS_START) c2 C3 K- m. A5 L
RUN_END(__BSS_END)
! T0 K9 e0 G0 m a: C .sysmem: {} palign(8) /* This is where the malloc heap goes */
4 s0 F5 I7 |6 `1 I .stack: {} palign(8) /* This is where the main() stack goes */
. S2 z" p. x) B( b+ [1 n } > DDR_1( G' Z0 W7 G5 V4 z
GROUP {
" ~, t5 D6 W- L3 J: h .irqstack: {. = . + __IRQ_STACK_SIZE;} align(8)3 \9 p( Z8 S0 u1 s6 c) O5 ?
RUN_START(__IRQ_STACK_START)5 y, c8 o' f" [, S, T* L, c
RUN_END(__IRQ_STACK_END)
* ?% H$ n4 [2 n- | .fiqstack: {. = . + __FIQ_STACK_SIZE;} align(8)6 I- D6 p, y& u- y2 P" D! `; ~
RUN_START(__FIQ_STACK_START)! y4 l+ y( a& w& h; M' _
RUN_END(__FIQ_STACK_END)1 o$ q7 n, |) u0 C' }: B
.svcstack: {. = . + __SVC_STACK_SIZE;} align(8)! @( Z/ g S, d2 v c6 A
RUN_START(__SVC_STACK_START)
, M* G" E0 `5 t2 _ RUN_END(__SVC_STACK_END)
* O* @6 ~5 N0 [8 K2 o+ H; |5 z .abortstack: {. = . + __ABORT_STACK_SIZE;} align(8)
7 F. \' T8 Y% @) _ RUN_START(__ABORT_STACK_START)
0 R8 S* f, w2 g& S+ o$ X* [ RUN_END(__ABORT_STACK_END)
; v, l( c5 Q6 ]" ~- V# E1 M .undefinedstack: {. = . + __UNDEFINED_STACK_SIZE;} align(8)+ t) J: l" b2 r- ]+ Y x
RUN_START(__UNDEFINED_STACK_START) |! ^% k% m: O8 E4 A
RUN_END(__UNDEFINED_STACK_END)
1 o- Y1 }8 u( }# {2 q } > DDR_18 U1 ^, Z0 L2 P, t/ R
/* Sections needed for C++ projects */
& N7 {5 ^7 P2 m. {; j GROUP {% Q% \% _/ Z. J7 K
.ARM.exidx: {} palign(8) /* Needed for C++ exception handling */
}! V" J# j( V7 N" ] \4 R5 ?, r .init_array: {} palign(8) /* Contains function pointers called before main */
}0 A5 ?) ~: n2 j8 V- a .fini_array: {} palign(8) /* Contains function pointers called after main */
2 g. p7 V6 T, R } > DDR_19 v: X: ]$ Y2 q$ \5 C9 w
/* Sections needed for C++ projects */" j) y: W" D4 ~3 f$ r: _
GROUP {. S3 ~+ v+ c# i
.ARM.exidx: {} palign(8) /* Needed for C++ exception handling */
* f" u' {7 v0 T5 W# b .init_array: {} palign(8) /* Contains function pointers called before main */7 Q' z" l- H) c
.fini_array: {} palign(8) /* Contains function pointers called after main */
/ U8 f1 U4 A6 t/ E. E6 F2 O } > DDR_1. |* c5 E, }# u/ c
}
7 Y% J, S* b# M7 r& ]6 T2 U* W& m5 `' l" N9 b
- n. s, J) }. |2 X* @2 y 1 {/ x, Y( m* V% {
图 31 ' J; t0 T* }. K( Q
; `" q/ G& K6 j% ?" y
图 32 * z: c9 r( m6 f* p
- 设置.resource_table段的加载地址为0xA0100000,作为r5fss0_0核心预留内存空间;
- 设置共享内存链接至Linux为共享内存预留的内存地址空间。2 Z0 u" b b7 ~% W) K2 ^
/* Resource table must be placed at the start of DDR_0 when R5 cores are early booting with Linux */
% r' j. q( w# h8 x2 x2 B& y DDR_0 : ORIGIN = 0xA0100000, LENGTH = 0x1000
' ?$ p* D3 e: r; a; F DDR_1 : ORIGIN = 0xA0101000 , LENGTH = 0xEFF000
/ t* ]2 h I+ U, t: p( Q O USER_SHM_MEM : ORIGIN = 0xA5000000, LENGTH = 0x80
" {0 {6 C0 T2 I9 D. Y1 c LOG_SHM_MEM : ORIGIN = 0xA5000000 + 0x80, LENGTH = 0x00004000 - 0x807 l# @) V! i" K6 f
RTOS_NORTOS_IPC_SHM_MEM : ORIGIN = 0xA5004000, LENGTH = 0x0000C000
1 w4 r+ V. O1 w9 f# e9 r' s" j9 {; z% G; U$ O/ v
, o3 a4 w, k7 C: r1 p2 q' ]
j9 @6 D- ]* J C+ g" a
图 33
* L& m1 _, w3 _0 \) e
; O" _% D- H/ s) ?, Z }& _1 |* V! A! ~8 Q' @& \/ [* |2 D
: v; Z+ m& p7 F1 _8 `0 F
|