EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Tronlong123 于 2024-7-25 09:21 编辑 ) v, c. t) h% u- b4 a9 [( F# V- ^
4 P7 |) e, O- J5 p: `4 K9 J
7 t0 H( d* q/ {! o 前 言
5 ^; g5 r! ~5 _& d' N' A
$ l7 ^. _0 j/ P. N 本文档主要说明AM64x基于IPC的多核开发方法。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。4 C. R- d2 w+ Y9 k
: [2 h' M, I2 N: A' W
适用开发环境如下:
( D5 M% |3 S' Y- z Windows开发环境:Windows 7 64bit、Windows 10 64bit
) O1 Q V/ g3 _ 虚拟机:VMware15.5.50 c* y0 }, E! o8 M, N$ q
Linux开发环境:Ubuntu 18.04.4 64bit( d8 h1 n7 K* k# @( a, A% H
Linux Processor SDK:ti-processor-sdk-linux-rt-am64xx-evm-08.01.00.39
. P( H3 J0 j2 z0 a- p1 P; h U-Boot:U-Boot-2021.01
/ f* q- I+ D; E. j, C* T CCS版本:CCS11.2.0
# |7 c% `9 u2 l2 ~$ a' e mcu+ SDK:mcu_plus_sdk_am64x_08_03_00_18( }% _0 m$ \( G4 q1 n8 N, U
SysConfig:sysconfig-1.12.1_2446
6 H$ G* Z3 d! _$ W8 e/ O GCC AARCH64 Compiler:gcc-ARM-9.2-2019.12-mingw-w64-i686-aarch64-none-elf
6 B* O7 u. S' b. y0 N i 本文测试板卡为创龙科技TL64x-EVM,它是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F多核处理器设计的高性能评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,高性能低功耗,稳定可靠,可满足各种工业应用环境。
. W1 F) p7 H. ?5 @. ^ 评估板接口资源丰富,引出5x Ethernet(两路支持TSN)、2x CAN-FD、多路UART、多路DI/DO、GPMC、PCIe、USB等接口,板载WIFI模块,支持4G/5G模块、NVME硬盘,可选配外壳直接应用于工业现场,方便用户快速进行产品方案评估与技术预研。" J# J) Y5 u) E, |. a
, ]/ [3 E- X3 G2 z1 n |+ g4 E9 L C3 D" N* S2 {0 f7 q
![]()
6 \5 ` f2 N% \1 a; [创龙科技TL64x-EVM 正视图
- k8 m- @1 O3 @- _( v) { 用户使用核心板进行二次开发时,仅需专注上层运用,降低了开发难度和时间成本,可快速进行产品方案评估与技术预研。
0 Z/ D, f0 B; z7 ~3 k AM64x是SOC多核处理器,一般情况下,Cortex-A53核心运行Linux系统,Cortex-R5F/Cortex-M4F核心运行Baremetal(裸机)或RTOS(FreeRTOS等)。
]/ v! e) R% @2 q" X, E ~ ARM基于Linux的remoteproc/rpmsg驱动程序,可以实现Linux内核与运行RTOS的从处理器上的IPC驱动程序通信,具体框图如下图所示。7 p2 |! K# Z# B# l* L$ U% S( \5 S3 x
/ _0 f0 q& f9 e
* O& ^, s9 s+ m; y" f V$ M ![]()
, K9 M% a' W) w5 f& p( Y+ [图 1
! {* V& I" y, M; \7 _; k IPC多核开发案例位于“4-软件资料\Demo\RTOS-demos\”目录下,案例project目录存放工程源码,bin目录存放可执行程序文件。2 @6 O( _5 o) d7 z% S8 \" P0 b& V
; H F! N( W% g3 ~
4 Y) j; C8 h B0 d; u7 l* b5 c* x
( x. R2 R, W( r2 r
表 1 - v' }" N3 p! h* C* H f, M
ipc_rpmsg_echo_linux案例. L* M9 G: i7 }4 V2 q
案例说明 案例功能:基于RP Message的API实现Cortex-A53与Cortex-R5F核间通信,以及Cortex-A53与Cortex-M4F核间通信。9 }( }3 n" A# ?7 G- C4 E
程序框图如下图所示。
* c) h! M, b; r5 K0 u6 ? {
( j) c" n4 d! [3 I* K3 X# M" x
% ?# ^/ p3 r6 ] ![]()
- o$ ^1 B* p% S8 G8 _% A+ k图 2 程序框图
0 U8 q! ^/ o0 M& t3 ~2 m RTOS工程创建了两个RPMsg端点,其中一个端点与Linux内核交换消息,另外一个端点用于与Linux用户空间、裸机或RTOS交换消息。
, c) B! N' W. p1 v7 Y. \, f9 p2 G2 C4 Z" {3 i: B( v( W
6 L8 X. ]; H" ^ / L2 r, v# v% S6 F& ~' c% K8 A2 X
图3
4 x2 v# J, c7 ?: M 案例测试
8 v! {" I* k/ B- X3 ?: I7 t 环境搭建 请将案例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可执行程序拷贝至评估板文件系统任意目录下。" b. y' H0 Q7 ^
( m+ ]& N) o/ s8 _% W3 {/ V4 P
/ ~7 w! G; m! y6 b " g3 u" j: n" A; d8 V* I$ r0 c% [
图 4
& Y% C) @$ |2 T: ?) c# G3 r 进入评估板文件系统,执行如下命令,删除原来的软链接。: \: H! Z9 ^& r1 \/ C1 |9 p1 t3 g
Target# rm /lib/firmware/am64-main-r5f0_0-fw6 Z; o; b; J {' U
Target# rm /lib/firmware/am64-main-r5f0_1-fw
+ { _2 m0 c. _( Y; F Target# rm /lib/firmware/am64-main-r5f1_0-fw. w; X" g1 _( a6 W! ^
Target# rm /lib/firmware/am64-main-r5f1_1-fw, y/ }7 R/ X! k' O3 C. [6 W
Target# rm /lib/firmware/am64-mcu-m4f0_0-fw4 [4 U5 N* k6 M) \9 X
6 {+ V! y a g/ u( u1 l- U |1 p
4 c E% r* G# P2 E2 J
% {# {2 B% ~1 {, Y- k- s$ c, J
图 5
' Y: ?- E" p4 d 执行如下命令,创建新的软链接。* `. U9 H8 X" Z- |: I, G# B
Target# ln -sf /home/root/am64-main-r5f0_0-fw /lib/firmware/am64-main-r5f0_0-fw- V9 Z$ F9 K# ?. X) {( ?
Target# ln -sf /home/root/am64-main-r5f0_1-fw /lib/firmware/am64-main-r5f0_1-fw2 S/ Z9 B B, P: d% K- Y
Target# ln -sf /home/root/am64-main-r5f1_0-fw /lib/firmware/am64-main-r5f1_0-fw
# O4 T2 Y( p. f1 X0 @+ r# w% h4 k Target# ln -sf /home/root/am64-main-r5f1_1-fw /lib/firmware/am64-main-r5f1_1-fw
$ |0 G& [( Y' d$ Y, K& b% F Target# ln -sf /home/root/am64-mcu-m4f0_0-fw /lib/firmware/am64-mcu-m4f0_0-fw
0 f- }! b% E: _* w5 G! @# t6 ]* E' a" _1 H3 b# V& Q) I6 a' Q
/ p4 D; U* p, T5 m8 E ![]()
9 z$ ^/ ~: W8 G# o0 E图 6 ! ^# x8 _" ~' r
请将评估板重启,在系统启动过程中,Cortex-R5F、Cortex-M4F核心将会引导启动。在评估板文件系统执行如下命令,查询Cortex-R5F、Cortex-M4F核心与remoteproc关系。% _* v* ^- n7 @) q) p* g+ l9 G
Target# head /sys/class/remoteproc/remoteproc*/name& Y( \# @# a) I* f$ u( @; r- _
编辑
0 b& n0 |" C9 c; b, q* I+ ]9 U% B- y! @7 j. Y
# A$ ~4 Y' h! J# M ![]()
, |; r+ p7 G# f图 7 ; w3 Y7 x' F% P' P; \4 X8 a @, v3 y
Cortex-R5F、Cortex-M4F核心与remoteproc关系如下表所示。AM6412包含1个Cortex-R5F核心:r5fss0_0;AM6442包含4个Cortex-R5F核心分别为:r5fss0_0、r5fss0_1、r5fss1_0、r5fss1_1。
2 ~4 M; N4 @, h( u3 P: A; m, G* p5 o- w O1 p( x8 T1 ?" z: r: O2 o/ `+ D) N
$ _, k* N. x- ~# k, Y. X5 \! v ![]()
8 [2 T* U$ W+ t/ y表 2
% e5 z2 w* d% ^: _6 J, i 备注:核心与remoteproc对应关系,请以实际情况为准。
7 V# ^8 y w: c8 b 执行如下命令,可查看Cortex-M4F、Cortex-R5F核心程序运行日志。6 j: k5 [: G- i) |; b
Target# cat /sys/kernel/debug/remoteproc/remoteproc0/trace03 r2 H+ B+ P7 O, @0 S4 W% U4 ?0 |7 c
Target# cat /sys/kernel/debug/remoteproc/remoteproc1/trace0
) n! e# u' t) A& z2 z! E Target# cat /sys/kernel/debug/remoteproc/remoteproc2/trace0
; L; w8 @( R' z9 z2 d d+ _" m5 ~ Target# cat /sys/kernel/debug/remoteproc/remoteproc3/trace0; f, ]4 M% ^0 i% |
Target# cat /sys/kernel/debug/remoteproc/remoteproc4/trace0& `) _8 |- R* ]$ d- m& f
@7 s( |! i$ _& f5 Y( @& y6 x
# R; e- _4 P7 g4 F ![]()
1 S2 O9 [' l7 V6 o/ t2 |( y- U. V图 8
2 N" d' S" O+ N 功能测试 本小节主要介绍如何基于RPMsg测试Cortex-A53与Cortex-M4F核间通信,以及Cortex-A53与Cortex-R5F核间通信。
$ V" C- K) S) b& [( @ - 基于Linux应用程序测试
' l' u& e% N! u/ y9 o# `4 l 本次测试使用TI官方提供的rpmsg_char_simple工具,我司提供的文件系统已移植该工具。) |+ O! q, F& w9 a( q
进入评估板文件系统执行如下命令,查看程序相关参数。7 f9 i7 s! G( `
Target# rpmsg_char_simple -h' \0 }, C! [5 y" m3 b* Y
/ L* Z4 v1 e# e; B8 T" ~0 I
' F, l: U, s1 K" a9 m' [ ![]()
6 d: E$ D" p$ T图 9 " _1 L7 P8 p8 V* j
参数解析:* R1 S6 X/ r; v3 {4 C, n( g' R
rproc_id:核心ID,默认是0;% W& x3 j8 E/ p2 } \
num_msgs:发送的RPMsg数据包数量,默认是100; X5 L$ u- @% ?2 P
rpmsg_dev_name:RPMsg驱动设备节点,默认为不使用;6 _+ ~- Q; b# n' H) y. X
remote_endpt:对端核心接收RPMsg的端点,默认为14。8 K) [& |7 p1 l# h2 S
Cortex-M4F核心、Cortex-R5F核心对应的ID,如下表所示。
% N% i6 F7 R" X% I& ?' b( g4 |0 r5 O
0 y* ]+ \# r5 P- Z/ Q
4 S' r) M& Y, Q3 v# P 1 ^ V2 [" Y c
表 3 : H! C& @3 v$ [4 N1 H# j' v
执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss0_0)接收。
+ d9 n+ y' b$ X9 W" A8 w Target# rpmsg_char_simple -r 2 -n 10
) U- h: f; d/ k5 {$ T" U8 G
) b2 D" \: ~/ S( a% C; }8 c0 B. T( p9 i
![]()
0 U- ~0 x/ `6 ? R8 `0 d" Q图 10
) }2 {! [. M3 W5 v# o; X+ E) | 执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss0_1)接收。! |! J! ~; c4 [7 L2 v
Target# rpmsg_char_simple -r 3 -n 108 P- i6 a. N! A( X+ @5 W
' c/ g8 m; K$ W/ p+ C' F& n$ A
& I& D3 q8 _1 H% i' I$ e
![]()
7 h/ v" j* C! C: C0 b图 11
5 f( }6 }3 W7 c 执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss1_0)接收。, E3 n/ S( K0 I- o, b+ ]1 |' m1 c
Target# rpmsg_char_simple -r 4 -n 10
7 @( L! w1 G' {- l2 x' v
1 p: a y9 l7 i$ P7 J$ i! U2 D: F/ c9 t$ E e
0 ^- `) R9 c4 N% [- q& o
图 12 $ [3 J& ]# F. @5 ^* e) z2 A
执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss1_1)接收。+ _5 g1 c) D- k; H
Target# rpmsg_char_simple -r 5 -n 10
5 l+ M3 \) M+ b; K; v. ^( j) G( [' g8 i( q+ u3 _
) m; A* |) d+ k/ Y5 ~, h; V
' @7 F1 M& Y; |. `+ a/ u
图 13
& I J8 @" n. A7 I$ f9 @ r% b 执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-M4F核心(m4fss0_0)接收。
f( O. d5 Q0 D: M Target# rpmsg_char_simple -r 9 -n 10' [: p3 E1 @ L% u7 @
- L2 \7 N' V' ?/ U7 _/ w( d
% y; r6 S H% z4 p " {8 U: o3 l& ^* [' T6 E1 u# n+ ^" ]
图 14 & Z% v4 C- `9 A4 C6 P; \
- 基于Linux驱动程序测试
) X( `; @/ u( y" X7 U 本次测试使用TI官方提供的rpmsg_client_sample驱动程序,我司提供的文件系统已移植该工具。9 Q# g& H6 s+ s) {
执行如下命令,查看各个核心对应的virtio ID。
( D" @. @- @1 ]: I Target# cd /sys/bus/virtio/drivers/virtio_rpmsg_bus' w" y2 f# s) J( {& u
Target# ls virtio* -l
: N% x1 u2 N( B6 v! Y; {
0 T; j* P2 Y/ [. f4 |8 K y' O. I
: d0 k1 \: K9 Q ![]()
9 |2 [& {2 s* _" v& s% Y5 G图 15
# X% I5 u6 e' g4 q7 ]) d0 k 1 _; A& ^5 O& v* }7 z
表 4 2 R# i7 F3 P! k3 p) K+ u: x( Y
进入评估板文件系统执行如下命令,加载驱动,并设置RPMsg数据包数量为10。- i' H/ h( F e5 K9 ^; W
Target# modprobe rpmsg_client_sample count=10 //count表示发送的RPMsg数据包数量。
( Z! t5 h7 f9 T0 d" N' `6 a; `! d+ y0 |, H' C
. ~$ U# u, N0 o; z9 C1 z* ] 4 F# Q% Y- K% ~- _
图 16
0 y, d+ ~: j \2 Q r- A# W0 `. n 执行如下命令查看驱动运行信息,打印"incoming msg x (src:0xd)"表示数据收发成功,即核间通信成功。7 x- O* s$ ]! B% l/ V# w2 N0 P$ q1 L
Target# dmesg | grep rpmsg_client_sample
2 i, R w5 P6 k! G7 ?
1 V6 C3 E* P7 h6 t# q" l D4 V1 R
5 L2 Y5 B! X, N! `4 m9 y8 w ![]()
" G- X) R4 V- r8 ^图 17 8 T! V7 N4 U L+ `) P+ z& U
案例编译 打开CCS11.2.0软件,依次点击菜单栏"Project -> Import CCS Projects...",导入案例工程。& g! g4 q9 r z3 x0 h& F% ?
; f7 H" `! M J5 w- D" h0 N, [6 e3 K0 d7 s
![]()
- F. E: N9 \4 p3 e. q2 V1 z图 18
( w/ n8 H5 x9 w. G! j# e! u 在弹出的如下界面,选中"ipc_rpmsg_echo_linux_am64x-evm_system_freertos",并勾选"Automatically import referenced projects found in same search-directory",然后点击Finish,导入Cortex-R5F核心与Cortex-M4F核心的全部工程。$ r, j; ?( p7 o
' k$ J, z+ W/ d$ n e
1 X4 s' O$ T, T5 c9 I
* Z/ \. X M& M; R& ]' L" X2 U
图 19
/ M7 p) |$ M3 A- q' I% l" Q 在工程界面,右键选中ipc_rpmsg_echo_linux_am64x-evm_system_freertos,选择"Rebuild Project",重新编译全部工程。% N. \: j' B( W* b0 X# V/ r6 J
' p" n! B3 W5 v) x7 G" _& W8 \6 K* l! C
6 t% p- L* M N5 d+ M
图20
# P. R$ Q# E9 m5 { `' f+ D 编译完成后,将会在各个核心对应工程的Debug目录下生成可执行程序。
; N. J: ~* `: U2 N
8 u+ K. `9 ~5 ]1 I. x. O+ a. Q# |- I' ]# V% F
% e7 l3 |5 k* g1 P0 Z6 a3 r
图 21
5 G: c" V" u% v; Q8 ~ 关键代码' }" \4 F' w S& r
- 创建任务并调度任务运行。
' S% T+ G1 P' y# g2 ] / |& `- `2 q! \# V2 Q* F
图 22 - 等待Linux就绪。
( ^$ U, c8 d( Y7 l# k% f4 ?& r ![]()
: ], p$ h& E& [6 s图 23 4 f2 f+ |* u+ o8 |6 f! c
- 创建两个接收RPMsg的任务:用于接收Linux内核、Linux用户空间、Cortex-R5F核心(r5fss0_0)的RPMsg。 z/ ]. Y1 Q1 z2 U$ o: A
![]()
4 Y/ O1 |" T: e; A: A* Y图 24 - RPMsg接收任务。; K# H4 s2 h6 |5 N0 o9 l
![]()
- s1 L( r" g& R3 Y+ K# q$ l图 25 c! n) O! v" W0 G
|