找回密码
 注册
关于网站域名变更的通知
查看: 214|回复: 1
打印 上一主题 下一主题

嵌入式工程师进阶,基于AM64x开发板的IPC多核开发案例分享

[复制链接]

该用户从未签到

跳转到指定楼层
1#
 楼主| 发表于 2024-7-24 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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) a
0 ]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

该用户从未签到

2#
发表于 2024-7-24 18:13 | 只看该作者
程序写的很规范
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 13:15 , Processed in 0.156250 second(s), 22 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表