EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Tronlong123 于 2024-7-25 09:21 编辑
; m6 v, ~! C! ~3 k$ T
3 j; M O# x5 C' t/ s$ } 1 X" K3 z. L! V; _% q0 F
前 言
2 i0 `% X; ]* K8 E5 f
5 E# J1 i6 j8 a" h) m9 v 本文档主要说明AM64x基于IPC的多核开发方法。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。
) s6 Z+ I4 X6 G" l5 }9 o8 s+ Z5 D& \# ]0 \- F ]
适用开发环境如下:
! Y1 y" |+ N# w Windows开发环境:Windows 7 64bit、Windows 10 64bit. P/ u2 C+ a* O( t, G% S& Y1 u
虚拟机:VMware15.5.5, b% L! z5 s# b
Linux开发环境:Ubuntu 18.04.4 64bit
9 Q a: F8 w7 T# K. \ Linux Processor SDK:ti-processor-sdk-linux-rt-am64xx-evm-08.01.00.39) U* n) B( B# R$ q M$ N2 @
U-Boot:U-Boot-2021.01
* u u) P, v" p, o9 m. D CCS版本:CCS11.2.0* |0 V7 f" Z5 f/ f
mcu+ SDK:mcu_plus_sdk_am64x_08_03_00_18/ h4 A: @: Z8 q D
SysConfig:sysconfig-1.12.1_2446: J0 K& p( [( J2 K! w
GCC AARCH64 Compiler:gcc-ARM-9.2-2019.12-mingw-w64-i686-aarch64-none-elf- _: a) K0 o- y) \; l' L
本文测试板卡为创龙科技TL64x-EVM,它是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F多核处理器设计的高性能评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,高性能低功耗,稳定可靠,可满足各种工业应用环境。& Z; l6 [$ [+ z9 @
评估板接口资源丰富,引出5x Ethernet(两路支持TSN)、2x CAN-FD、多路UART、多路DI/DO、GPMC、PCIe、USB等接口,板载WIFI模块,支持4G/5G模块、NVME硬盘,可选配外壳直接应用于工业现场,方便用户快速进行产品方案评估与技术预研。 V2 Q% J: C! a g* {) W1 L
* |, ?$ N6 ?( B, }- S- G
- F4 b4 o2 M2 ]+ Y7 w- T/ L
2 t/ s7 U; N2 R; [. B
创龙科技TL64x-EVM 正视图
% a# b4 k! v. v 用户使用核心板进行二次开发时,仅需专注上层运用,降低了开发难度和时间成本,可快速进行产品方案评估与技术预研。
# H, h: f3 a% T0 w# t5 C f8 { AM64x是SOC多核处理器,一般情况下,Cortex-A53核心运行Linux系统,Cortex-R5F/Cortex-M4F核心运行Baremetal(裸机)或RTOS(FreeRTOS等)。
# p' I F; ~9 Q& h ARM基于Linux的remoteproc/rpmsg驱动程序,可以实现Linux内核与运行RTOS的从处理器上的IPC驱动程序通信,具体框图如下图所示。
9 c9 `3 Q% N$ V2 e! S/ d6 I5 G) J" b1 e9 @) q
8 ~1 v$ |9 f2 V# l: q9 j
![]()
" p% s4 r6 j- B$ f图 1 6 z4 }- D: }: @* v; T
IPC多核开发案例位于“4-软件资料\Demo\RTOS-demos\”目录下,案例project目录存放工程源码,bin目录存放可执行程序文件。& Y7 X/ D1 m+ `+ d" K/ \
$ [& u) t; J" I" C3 f
8 k* V0 @' a2 M$ K
![]()
: V2 q: d7 G( ?; e, F5 ~) u. M; N表 1 ( X1 b7 t4 r& D. }# _
ipc_rpmsg_echo_linux案例& c( |! K- ?: N3 l9 E% e
案例说明 案例功能:基于RP Message的API实现Cortex-A53与Cortex-R5F核间通信,以及Cortex-A53与Cortex-M4F核间通信。) T$ P! W c" c5 R
程序框图如下图所示。
4 x3 V5 N* h4 i* D. W
2 L' Y ~6 h% n3 z, l
# G' J) o+ z0 t3 m" Z9 G 0 l; t2 _# v( X V6 l4 d4 Z
图 2 程序框图 9 {7 l" l" X* p, K* l
RTOS工程创建了两个RPMsg端点,其中一个端点与Linux内核交换消息,另外一个端点用于与Linux用户空间、裸机或RTOS交换消息。
, A' v! g5 @, d' p! {7 Z# _) |. Z5 d# z% O0 n
0 X K) J) g) s I3 i" P' M6 I8 y. Y. _ ![]()
( q/ z$ ~7 u. h1 r图3 % P! i/ B/ D1 @6 n: ]
案例测试0 j7 x: P8 L: M8 v4 O+ W- b
环境搭建 请将案例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可执行程序拷贝至评估板文件系统任意目录下。, @ R) K% y& C/ g0 x( ] r
9 v% [* |8 c' I0 \% n; w D7 s
$ P0 Q- C9 U: k S
![]()
5 B7 M; E* U# b. U. ^图 4
" X, P% U% T3 s8 |9 b 进入评估板文件系统,执行如下命令,删除原来的软链接。
' ?6 K0 X8 ? v. t n, k% ^" S" b Target# rm /lib/firmware/am64-main-r5f0_0-fw0 G" `- u) w2 ~! x2 G
Target# rm /lib/firmware/am64-main-r5f0_1-fw* D) b& O' M! s% t( K7 C# S
Target# rm /lib/firmware/am64-main-r5f1_0-fw# S: Y+ y6 Y: l( b$ b
Target# rm /lib/firmware/am64-main-r5f1_1-fw. |7 d8 W; W" `0 P9 B& Q
Target# rm /lib/firmware/am64-mcu-m4f0_0-fw1 u; A8 W* W0 _2 p' L1 r9 D' F. J
5 e. K/ x% c- Y) b9 W7 u+ r% |
- r) q7 A! K& u7 L
![]()
, t3 T% z$ V, l4 e) H图 5
& x' V# Q9 z' E% ?7 z) [% r* @ 执行如下命令,创建新的软链接。
& F' l- ^# c& K1 }/ s8 H Target# ln -sf /home/root/am64-main-r5f0_0-fw /lib/firmware/am64-main-r5f0_0-fw, D1 d& Y$ l0 u' z
Target# ln -sf /home/root/am64-main-r5f0_1-fw /lib/firmware/am64-main-r5f0_1-fw2 }% R" |+ S$ A* E( A/ P4 @
Target# ln -sf /home/root/am64-main-r5f1_0-fw /lib/firmware/am64-main-r5f1_0-fw7 u' t8 e" F* z* W8 s' E
Target# ln -sf /home/root/am64-main-r5f1_1-fw /lib/firmware/am64-main-r5f1_1-fw
& \! l$ e$ ~3 J- G- f) G: n' o Target# ln -sf /home/root/am64-mcu-m4f0_0-fw /lib/firmware/am64-mcu-m4f0_0-fw) M, I8 [ q1 V* e/ d3 b9 }; T
- v" X& n/ ^. O5 z0 `
" a7 X8 j2 |. @' C5 _ ![]()
6 H# p' S h+ }0 W' N图 6 0 A9 y) J' \, v4 ?
请将评估板重启,在系统启动过程中,Cortex-R5F、Cortex-M4F核心将会引导启动。在评估板文件系统执行如下命令,查询Cortex-R5F、Cortex-M4F核心与remoteproc关系。/ \" W- m" i7 t6 b( g
Target# head /sys/class/remoteproc/remoteproc*/name3 A) ]5 L: \5 u; M& E
编辑
, c3 ~( F: p% R, c7 x- _7 p' H I M2 Z# a
) P9 y1 l R& F% a% J. X+ r& ~
" F" e' G) K9 \' E. X+ G
图 7 " t0 k! T0 _, R7 R* u8 h, M! K1 s0 y" a
Cortex-R5F、Cortex-M4F核心与remoteproc关系如下表所示。AM6412包含1个Cortex-R5F核心:r5fss0_0;AM6442包含4个Cortex-R5F核心分别为:r5fss0_0、r5fss0_1、r5fss1_0、r5fss1_1。/ s) _9 H2 M: t9 {
. }- s {/ X, n; @* Z! l1 c. P! f% ]3 O
3 K' F+ A' _- V , y% J% n$ l4 X- G! Q# u g' `
表 2 - x. m& i& Y5 W
备注:核心与remoteproc对应关系,请以实际情况为准。
8 n* k% _ _" Q' Q 执行如下命令,可查看Cortex-M4F、Cortex-R5F核心程序运行日志。
$ |2 Z( X9 I( j/ f Target# cat /sys/kernel/debug/remoteproc/remoteproc0/trace0
! }% Y& J5 U. _1 n Target# cat /sys/kernel/debug/remoteproc/remoteproc1/trace01 N- Y, Q6 E3 k6 [. @" }" [
Target# cat /sys/kernel/debug/remoteproc/remoteproc2/trace0
' Y; [" ]0 ]4 M. K- ]9 {6 K Target# cat /sys/kernel/debug/remoteproc/remoteproc3/trace0/ y3 `! P* t% I `: w- k: o% b
Target# cat /sys/kernel/debug/remoteproc/remoteproc4/trace0
6 D8 ^ `+ g' T* u" W& a$ j3 D7 V& r3 ~
& X+ \) W9 q) U- ^3 M ![]()
) [! W7 l$ Y7 h/ V图 8
7 T6 K3 d) w6 ] 功能测试 本小节主要介绍如何基于RPMsg测试Cortex-A53与Cortex-M4F核间通信,以及Cortex-A53与Cortex-R5F核间通信。$ ?$ f" t8 S. i( S# V: A) B
- 基于Linux应用程序测试* E( _+ G+ _9 C1 ^
本次测试使用TI官方提供的rpmsg_char_simple工具,我司提供的文件系统已移植该工具。5 M6 b- z2 W ~. }. v# u n* r
进入评估板文件系统执行如下命令,查看程序相关参数。
, }, k& ]- e( R; n: Q1 V7 V Target# rpmsg_char_simple -h4 E8 H0 d1 b: k* K; v4 ]( C
$ Z' a0 b* v' v7 S
) M5 c1 T$ \ o ![]()
! W/ @5 Z: L* ^$ f图 9 . t$ |% D F4 ~$ n+ n
参数解析:* S r0 ?9 }- H- n# j
rproc_id:核心ID,默认是0;
2 t0 W5 H- S1 `$ V, l z. y num_msgs:发送的RPMsg数据包数量,默认是100;) A/ E$ x: J" ~) `+ _
rpmsg_dev_name:RPMsg驱动设备节点,默认为不使用;# E g' H8 p6 \6 n |
remote_endpt:对端核心接收RPMsg的端点,默认为14。+ ` y4 F3 z/ n, \4 S& N* C
Cortex-M4F核心、Cortex-R5F核心对应的ID,如下表所示。
u% f* ~# G6 H1 A% e8 K4 v! ?& \' I9 H) w: P
! m* K! G$ ?1 [
: ~( C. U% G0 {7 p5 w
表 3 ! W( C% c) t# t
执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss0_0)接收。
7 E8 ?5 L6 x( m' g4 { F Target# rpmsg_char_simple -r 2 -n 10
! b2 P3 c2 {6 O9 _! j1 P; m. ]( |( Q( i* z
5 \4 p. [; c* r# }3 e# w
![]()
7 T+ _( z2 M# h0 D. O4 H图 10
- w9 C. K Z! v8 q3 _9 Z9 J 执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss0_1)接收。
% l2 c; }# z; W- D+ q2 {2 f0 G% a Target# rpmsg_char_simple -r 3 -n 103 _6 o; P1 O( h
& _- @9 m7 j. }0 O ^$ ]) S: T
# v$ R+ e$ H6 B ) S# F* @8 }& X. d. c- `& c
图 11 + W0 R5 E% l! {2 q4 h( Z
执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss1_0)接收。
% Z; n; N; ^, J# j% X l- h Target# rpmsg_char_simple -r 4 -n 106 R# A" Y( g5 F
P7 _: S9 ~1 [' f' K8 u) G
) V1 }% j$ f0 p$ L 9 j( C& \* }! c- }) q
图 12 % `3 C/ ~& @- w: f* I& S; ~7 o
执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss1_1)接收。
& N/ }6 s' S+ j$ u Target# rpmsg_char_simple -r 5 -n 10
; E* H; b( N5 O) [. E
# `* b \, G: n& ^4 v2 z0 T" C
! F3 F/ `4 x+ l8 W + X* |. [3 h5 E" R2 O' @3 b
图 13
' f9 o: p) ?6 b8 [ 执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-M4F核心(m4fss0_0)接收。
" l3 r( h8 z7 \ Target# rpmsg_char_simple -r 9 -n 10
: l, x- ^; W u; M% b& O0 C/ Q& C5 D! W9 a: w
) r. W4 i: p0 S9 z2 k# w w0 T
![]()
" e) G& B$ N' r% Z图 14 & X1 V q# s5 u5 N( y* x
- 基于Linux驱动程序测试
5 d3 f' b6 i+ p z1 Q; L' @# F 本次测试使用TI官方提供的rpmsg_client_sample驱动程序,我司提供的文件系统已移植该工具。9 c+ u9 H8 U7 t
执行如下命令,查看各个核心对应的virtio ID。
+ f7 Y3 M, w0 U8 Y% l6 Z% u2 S Target# cd /sys/bus/virtio/drivers/virtio_rpmsg_bus. o; Q9 e$ |! i' l8 V$ O! w: u
Target# ls virtio* -l
6 K7 J' v" l" F [5 b- j
* X) e+ B: T+ f( u, U4 A7 ^: I$ n
/ @2 O( z2 X" W1 E8 z ![]()
6 T) f. w+ S6 f! }. b; Q# ^图 15 $ ?$ g. u9 D( f5 B ~
9 I( z! r! ^+ q* Z
表 4 * ?3 b5 l' b# B0 ]* f
进入评估板文件系统执行如下命令,加载驱动,并设置RPMsg数据包数量为10。* g% ?1 Z& _# p/ v# D5 ^
Target# modprobe rpmsg_client_sample count=10 //count表示发送的RPMsg数据包数量。7 \$ n' ~% X: {8 I+ B" j/ p
2 \8 j$ Y2 Z6 z
% u" O6 `; y3 R% Y. v& t' M
![]()
9 w/ o- c* D U$ c S; m% c图 16
8 B. [% B; |% w6 G% \% ~ 执行如下命令查看驱动运行信息,打印"incoming msg x (src:0xd)"表示数据收发成功,即核间通信成功。
: \/ [6 r/ X' t3 ?3 a Target# dmesg | grep rpmsg_client_sample" P0 a" x. m+ ~+ q7 [6 ~ e. `* ~
- A( d7 z( u# x3 Y- @( r d5 A
C! V5 J: C6 m5 V" m1 ] ![]()
/ ]9 G; U- B% c: q8 b( q图 17
2 T! w* E; d9 R2 w9 M 案例编译 打开CCS11.2.0软件,依次点击菜单栏"Project -> Import CCS Projects...",导入案例工程。
1 [. N" f8 g6 G' n/ E* B
* G1 d! P9 z) f% ^- g) a0 ]2 X4 `* r! r+ K+ {
![]()
+ ]5 }& `1 N' }9 y& a' S图 18 ' ^2 f& s# u% b+ o1 E8 T. Y8 \
在弹出的如下界面,选中"ipc_rpmsg_echo_linux_am64x-evm_system_freertos",并勾选"Automatically import referenced projects found in same search-directory",然后点击Finish,导入Cortex-R5F核心与Cortex-M4F核心的全部工程。& W; [3 v- O7 }# H2 S! h% t- ]
0 y0 X: S \( n; k5 a0 V' M1 `% P- F9 R1 a
2 b$ T: b& x% C i0 w
图 19 + \4 K0 E7 a$ ]& D
在工程界面,右键选中ipc_rpmsg_echo_linux_am64x-evm_system_freertos,选择"Rebuild Project",重新编译全部工程。
/ n$ `* x+ j0 h$ o f4 q8 S
/ D6 r- d1 }: p3 ~9 y* k; h" ~* \4 v1 ]
4 U* ~3 @. X# ^
图20
2 H# |" M" o7 @5 d% Q% z! J 编译完成后,将会在各个核心对应工程的Debug目录下生成可执行程序。
8 B* I9 ^7 _* ~& T' O* H5 p: B x8 ^; c |+ \. m1 N" g7 `8 j
8 D, m$ a' e+ P. S. k5 `
* h) ~/ c4 a: b9 f2 D
图 21
6 M4 }9 G B$ V; |, I* ^ 关键代码 x" K* l/ p1 j$ z( f
- 创建任务并调度任务运行。) ]4 u" c. d/ M* @/ d
![]()
# S6 e! E- E- [. J! y# h图 22 - 等待Linux就绪。# a( }8 ]- U+ L/ u- i
2 P, P5 g: S7 p& r$ @1 r
图 23 9 Y3 ^% W7 W' v" f( E
- 创建两个接收RPMsg的任务:用于接收Linux内核、Linux用户空间、Cortex-R5F核心(r5fss0_0)的RPMsg。
. z) L1 l* w3 s1 | u. ^& M: a- y
图 24 - RPMsg接收任务。/ ]: `% h, X$ \- y2 O
1 n ^$ z3 n& y+ ^* y" |7 ]; H# k
图 25 6 ?) x; I$ ` I( d, f6 Y1 b
|