首页 > 其他分享 >征程6E_M快速上手实战Sample-IPC

征程6E_M快速上手实战Sample-IPC

时间:2024-09-01 10:15:40浏览次数:11  
标签:IPC Ch 6E TxFailCnt Ins Sample ------- TxCnt RxRollCnt

系列文章目录

手把手教你利用算法工具链训练、量化、编译、可视化征程 6 参考算法 BEVFormer
征程6E/M快速上手实战Sample-IPC


@

目录


关于本文

在此篇文章中,我们将深入探讨征程6X系列核间通信(IPC-F)的基本原理,并通过示例代码演示如何有效地使用IPC-F来实现Acore和Rcore之间的高效数据传输。无论你是刚刚接触这个概念的新手,还是希望在J6X系列上复现IPC例程的开发者,都可以从中获得有价值的见解和详细的复现流程。

一、IPC模块简述

J6X IPC(Inter-Process Communication)模块是用于多核之间的通信,支持同构核和异构核之间的通信,软件上基于buffer-ring进行共享内存的管理,硬件上基于MailBox实现核间中断。IPCF具有多路通道,大数据传输,适用多种平台的特点。

1.1 硬件数据流说明

Acore与MCU通过共享内存传输数据,通过mailbox中断通知双方。
在这里插入图片描述

1.2 IPC Sample软件架构

Acore与MCU之间的核间通信,Acore侧主要使用IPCFHAL,MCU侧使用IPCF,其中IPCFHAL是基于IPCF封装了一层接口,用于用户态与内核态的数据传递。
在这里插入图片描述

1.3 Acore-IPC-Sample:

#Sample源码路径
test/samples/platform_samples/source/S83_Sample/S83E02_Communication/ipc_sample/

1.3.1 API调用流程:

在这里插入图片描述

1.3.2 Sample源码解析:

在这里插入图片描述
hb_ipcfhal_getchan_byjson(chan_name[i], &thread_arg[i].ch, json_path);

根据chan_name[i]解析ipcfhal_sample_config.json信息配置信息放入到thread_arg[i].ch中。

*Sample中配置为实例3的通道0和1,实例4的通道0和1。

##Sample板端路径为
"/app/sample/S83_Sample/S83E02_Communication/ipc_sample/testsuite/ipcfhal_sample_config.json"
##用户自定义的ipcfhal_sample_config.json后需要将其传输到单板上,并更新.cpp中SMP_CFG_FILE路径

*客户Acore与MCU通信可使用实例3~10,若用户不需要CANHAL、规控等业务,可以自行使用CANHAL(实例0)和规控(实例1和2)的实例。

hb_ipcfhal_init(&thread_arg[i].ch);

通过配置信息thread_arg[i].ch打开对应的设备驱动:/dev/ipcdrv *只要有一个channel使用就一直打开

hb_ipcfhal_config(&thread_arg[i].ch);

使用ioctl对/dev/ipcdrv进行配置。

pthread_create;

每一个channel分别创建一个发送和一个接收的线程,线程中进行IPC读、写。

tx_pthread:
在这里插入图片描述
hb_ipcfhal_send:使用write对/dev/ipcdrv写入tx_data。

rx_pthread:
在这里插入图片描述
hb_ipcfhal_recv:使用read读取/dev/ipcdrv到data。
在这里插入图片描述
hb_ipcfhal_deinit:释放channel,当channel都被释放则关闭设备/dev/ipcdrv。

1.4 MCU-IPC-Sample:

1.4.1 运行流程:

在这里插入图片描述
在这里插入图片描述

1.4.2 Sample源码解析:

*void Ipc_MDMA_Init(Ipc_InstanceConfigType ConfigPtr, uint32 InstanceId);

1、获取实例和通道;

2、初始化底层驱动;

3、清空MDMA回环内存;

Ipc_MDMA_OpenInstance(uint32 InstanceId);

根据实例id预备共享内存并打开驱动MailBox。

Ipc_MDMA_CheckRemoteCoreReady(uint32 InstanceId);

根据实例id判断共享内存是否ready;

RecvTask:
IrqCallBackSample:中断回调方式

在这里插入图片描述
检查数据的有效性(包括数据是否为空和滚动计数器的连续性),更新计数器,并通过LogSync打印出接受统计信息。

void Ipc_SamplePoll(void):poll方式
在这里插入图片描述
Ipc_MDMA_PollMsg:从共享内存中获取接收到的信息。

SendTask:
在这里插入图片描述
根据实例和通道选择存入dataBuf,通过IpcTest_MdmaSend_Func发送data。
在这里插入图片描述
Ipc_MDMA_TryGetHwResource:获取驱动共享内存;

Ipc_MDMA_SendMsg:根据实例id写入共享内存。

二、Sample使用:

2.1 Acore侧:

2.1.1 编译

获取AppSDK包后,进入appuser执行:

*其中hbrootfs-sdk_0.0.1.XXX_all.deb是地平线自己的库和头文件,rootfs-sdk-focal_0.0.1.XXX_all.deb是系统库,aarch64-linux-hb-gcc_12.2.0_amd64.deb是gcc 12.2.0工具链,目前在ubuntu22.04非docker环境下运行正常。其它环境不能保证。

dpkg-deb -x rootfs-sdk*.deb ./sdk
dpkg-deb -x hbrootfs-sdk*.deb ./sdk
##移动sdk库路径,本文档放入/usr/lib中
sudo mv sdk/ /usr/lib

进入toolchain执行:

dpkg -x aarch64-linux-hb-gcc_12.2.0_amd64.deb ./arm-gnu-toolchain
##移动toolchain库路径,本文档放入/usr/lib中
sudo mv arm-gnu-toolchain/ /usr/lib
nano ~/.bashrc
##添加系统路径
export PATH="/usr/lib/arm-gnu-toolchain/bin:$PATH"
export LD_LIBRARY_PATH="/usr/lib/arm-gnu-toolchain/lib:$LD_LIBRARY_PATH"
##
source ~/.bashrc

Sample代码路径:

#Sample源码路径
/test/samples/platform_samples/source/S83_Sample/S83E02_Communication/ipc_sample/

复制/src源码(.json和.cpp)到新建文件夹ipc并构建新Makefile:

ipc
├── Makefile
└── src
    ├── ipcfhal_sample_config.json
    └── libipcfhal_sample.cpp

Makefile:

CROSS_COMPILE = aarch64-none-linux-gnu-
OUTPUT_HBROOTFS_DIR = /usr/lib/sdk ##请根据用户sdk安装路径修改
CXX := ${CROSS_COMPILE}g++

INC_DIR := ${OUTPUT_HBROOTFS_DIR}/usr/hobot/include

LIB_DIR := ${OUTPUT_HBROOTFS_DIR}/usr/hobot/lib 
LIB_DIR += ${OUTPUT_HBROOTFS_DIR}/usr/lib/aarch64-linux-gnu

LIBS := -lhbipcfhal -lpthread -lalog -ljsoncpp

CXXFLAGS := -Wall -O2 -I$(INC_DIR)

LDFLAGS := $(addprefix -L, $(LIB_DIR)) $(LIBS)

SRC_DIR := src
TARGET := program

SRCS := $(wildcard $(SRC_DIR)/*.cpp)

OBJS := $(SRCS:.cpp=.o)

$(TARGET): $(OBJS)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

clean:
    rm -f $(OBJS) $(TARGET)

执行make完成编译,生成的文件为./program
在这里插入图片描述

2.1.2 文件传输

在Linux上交叉编译的执行文件需要传输到开发板上,本文使用共享文件夹+WinSCP方式进行传输:

将生成的可执行文件复制到共享文件夹中:
在这里插入图片描述
通过串口获取单板ip:*可通过地平线开发者社区-6. *单板设置ip地址设置ip
在这里插入图片描述
打开WinSCP新建站点:

在这里插入图片描述
登录后将program拖拽到/home/hobot/完成文件传输:
在这里插入图片描述

2.1.3 运行

通过ssh或串口进入/home/hobot/执行:

*如使用自定义ipcfhal_sample_config.json则需将该文件也传输到单板上并修改.cpp中SMP_CFG_FILE为正确路径

chmod 777 program
./program

Sample运行时Acore串口日志:

root@hobot:~# /app/sample/S83_Sample/S83E02_Communication/ipc_sample/bin/libipcf_hal_sample
[INFO][hb_ipcf_hal.cpp:276] [channel] cpu2mcu_ins3ch0 [ins] 3 [id] 0 init success.
[INFO][hb_ipcf_hal.cpp:326] [channel] cpu2mcu_ins3ch0 [ins] 3 [id] 0 config success.
[INFO][hb_ipcf_hal.cpp:276] [channel] cpu2mcu_ins3ch1 [ins] 3 [id] 1 init success.
[INFO][hb_ipcf_hal.cpp:326] [channel] cpu2mcu_ins3ch1 [ins] 3 [id] 1 config success.
[INFO][hb_ipcf_hal.cpp:276] [channel] cpu2mcu_ins4ch0 [ins] 4 [id] 0 init success.
[INFO][hb_ipcf_hal.cpp:326] [channel] cpu2mcu_ins4ch0 [ins] 4 [id] 0 config success.
[INFO][hb_ipcf_hal.cpp:276] [channel] cpu2mcu_ins4ch1 [ins] 4 [id] 1 init success.
[INFO][hb_ipcf_hal.cpp:326] [channel] cpu2mcu_ins4ch1 [ins] 4 [id] 1 config success.
        Ins[3]Ch[0]     TxCnt[100]TxFailCnt[0]  -------
        Ins[3]Ch[1]     TxCnt[100]TxFailCnt[0]  -------
        Ins[4]Ch[0]     TxCnt[100]TxFailCnt[0]  -------
        Ins[4]Ch[1]     TxCnt[100]TxFailCnt[0]  -------
        Ins[3]Ch[0]                             ------- RxCnt[100]RxRollCnt[100]        
        Ins[4]Ch[0]                             ------- RxCnt[100]RxRollCnt[100]        
        Ins[3]Ch[1]                             ------- RxCnt[100]RxRollCnt[100]        
        Ins[4]Ch[1]                             ------- RxCnt[100]RxRollCnt[100]        
        Ins[3]Ch[0]     TxCnt[200]TxFailCnt[0]  -------
        Ins[3]Ch[1]     TxCnt[200]TxFailCnt[0]  -------
        Ins[4]Ch[0]     TxCnt[200]TxFailCnt[0]  -------
        Ins[4]Ch[1]     TxCnt[200]TxFailCnt[0]  -------
        Ins[3]Ch[0]                             ------- RxCnt[200]RxRollCnt[200]        
        Ins[4]Ch[0]                             ------- RxCnt[200]RxRollCnt[200]        
        Ins[3]Ch[1]                             ------- RxCnt[200]RxRollCnt[200]        
        Ins[4]Ch[1]                             ------- RxCnt[200]RxRollCnt[200]        
        Ins[3]Ch[0]     TxCnt[300]TxFailCnt[0]  -------
        Ins[3]Ch[1]     TxCnt[300]TxFailCnt[0]  -------
        Ins[4]Ch[0]     TxCnt[300]TxFailCnt[0]  -------
        Ins[4]Ch[1]     TxCnt[300]TxFailCnt[0]  -------
        Ins[3]Ch[0]                             ------- RxCnt[300]RxRollCnt[300]        
        Ins[4]Ch[0]                             ------- RxCnt[300]RxRollCnt[300]        
        Ins[3]Ch[1]                             ------- RxCnt[300]RxRollCnt[300]        
        Ins[4]Ch[1]                             ------- RxCnt[300]RxRollCnt[300]        
        Ins[3]Ch[0]                             ------- RxCnt[400]RxRollCnt[400]        
        Ins[4]Ch[0]                             ------- RxCnt[400]RxRollCnt[400]        
        Ins[3]Ch[1]                             ------- RxCnt[400]RxRollCnt[400]        
        Ins[4]Ch[1]                             ------- RxCnt[400]RxRollCnt[400]        
        Ins[3]Ch[0]     TxCnt[400]TxFailCnt[0]  -------
        Ins[3]Ch[1]     TxCnt[400]TxFailCnt[0]  -------
        Ins[4]Ch[1]     TxCnt[400]TxFailCnt[0]  -------
        Ins[4]Ch[0]     TxCnt[400]TxFailCnt[0]  -------
        Ins[3]Ch[0]                             ------- RxCnt[500]RxRollCnt[500]        
        Ins[4]Ch[0]                             ------- RxCnt[500]RxRollCnt[500]        
        Ins[3]Ch[1]                             ------- RxCnt[500]RxRollCnt[500]        
        Ins[4]Ch[1]                             ------- RxCnt[500]RxRollCnt[500]        
        Ins[3]Ch[0]     TxCnt[500]TxFailCnt[0]  -------
        Ins[3]Ch[1]     TxCnt[500]TxFailCnt[0]  -------
        Ins[4]Ch[1]     TxCnt[500]TxFailCnt[0]  -------
        Ins[4]Ch[0]     TxCnt[500]TxFailCnt[0]  -------
        Ins[3]Ch[0]                             ------- RxCnt[600]RxRollCnt[600]        
        Ins[4]Ch[0]                             ------- RxCnt[600]RxRollCnt[600]        
        Ins[3]Ch[1]                             ------- RxCnt[600]RxRollCnt[600]        
        Ins[4]Ch[1]                             ------- RxCnt[600]RxRollCnt[600]        
        Ins[3]Ch[1]     TxCnt[600]TxFailCnt[0]  -------
        Ins[3]Ch[0]     TxCnt[600]TxFailCnt[0]  -------
        Ins[4]Ch[1]     TxCnt[600]TxFailCnt[0]  -------
        Ins[4]Ch[0]     TxCnt[600]TxFailCnt[0]  -------
        Ins[3]Ch[0]                             ------- RxCnt[700]RxRollCnt[700]        
        Ins[4]Ch[0]                             ------- RxCnt[700]RxRollCnt[700]        
        Ins[3]Ch[1]                             ------- RxCnt[700]RxRollCnt[700]        
        Ins[4]Ch[1]                             ------- RxCnt[700]RxRollCnt[700]        
        Ins[3]Ch[1]     TxCnt[700]TxFailCnt[0]  -------
        Ins[3]Ch[0]     TxCnt[700]TxFailCnt[0]  -------
        Ins[4]Ch[1]     TxCnt[700]TxFailCnt[0]  -------
        Ins[4]Ch[0]     TxCnt[700]TxFailCnt[0]  -------
        Ins[3]Ch[0]                             ------- RxCnt[800]RxRollCnt[800]        
        Ins[4]Ch[0]                             ------- RxCnt[800]RxRollCnt[800]        
        Ins[3]Ch[1]                             ------- RxCnt[800]RxRollCnt[800]        
        Ins[4]Ch[1]                             ------- RxCnt[800]RxRollCnt[800]        
        Ins[3]Ch[1]     TxCnt[800]TxFailCnt[0]  -------
        Ins[3]Ch[0]     TxCnt[800]TxFailCnt[0]  -------
        Ins[4]Ch[1]     TxCnt[800]TxFailCnt[0]  -------
        Ins[4]Ch[0]     TxCnt[800]TxFailCnt[0]  -------
        Ins[3]Ch[0]                             ------- RxCnt[900]RxRollCnt[900]        
        Ins[4]Ch[0]                             ------- RxCnt[900]RxRollCnt[900]        
        Ins[3]Ch[1]                             ------- RxCnt[900]RxRollCnt[900]        
        Ins[4]Ch[1]                             ------- RxCnt[900]RxRollCnt[900]        
        Ins[3]Ch[1]     TxCnt[900]TxFailCnt[0]  -------
        Ins[3]Ch[0]     TxCnt[900]TxFailCnt[0]  -------
        Ins[4]Ch[1]     TxCnt[900]TxFailCnt[0]  -------
        Ins[4]Ch[0]     TxCnt[900]TxFailCnt[0]  -------
[SampleEnd]Ins[3]Ch[0]TxCnt[994]TxFailCnt[0][SampleEnd]Ins[3]Ch[0]RxCnt[996]RxRollCnt[996][INFO][hb_ipcf_hal.cpp:521] [channel] cpu2mcu_ins3ch0 [ins] 3 [id] 0 deinit success.
[SampleEnd]Ins[3]Ch[1]TxCnt[995]TxFailCnt[0][SampleEnd]Ins[3]Ch[1]RxCnt[997]RxRollCnt[997][INFO][hb_ipcf_hal.cpp:521] [channel] cpu2mcu_ins3ch1 [ins] 3 [id] 1 deinit success.
[SampleEnd]Ins[4]Ch[0]TxCnt[996]TxFailCnt[0][SampleEnd]Ins[4]Ch[0]RxCnt[998]RxRollCnt[998][INFO][hb_ipcf_hal.cpp:521] [channel] cpu2mcu_ins4ch0 [ins] 4 [id] 0 deinit success.
[SampleEnd]Ins[4]Ch[1]TxCnt[997]TxFailCnt[0][SampleEnd]Ins[4]Ch[1]RxCnt[999]RxRollCnt[999][INFO][hb_ipcf_hal.cpp:521] [channel] cpu2mcu_ins4ch1 [ins] 4 [id] 1 deinit success.

*由于MCU的Sample需要ETAS支持,本文暂不涉及M侧Sample的使用。

标签:IPC,Ch,6E,TxFailCnt,Ins,Sample,-------,TxCnt,RxRollCnt
From: https://www.cnblogs.com/horizondeveloper/p/18391045

相关文章

  • P3320 [SDOI2015] 寻宝游戏 与 P10930 异象石 与 CF176E Archaeology
    思路:考虑按照dfn序将关键点的集合排序后为\(a_0,a_1,\cdots,a_k\),则答案为:\[\frac{\sum\limits_{i=0}^k\operatorname{dis}(a_i,a_{(i+1)\bmodk})}{2}\]简单证明一下:需要找出包含一些关键点的最小联通导出子图。则随便以一个关键点为根,对于子树内没有关键点的子树直接......
  • CF1286E Fedya the Potter Strikes Back 题解
    题目链接点击打开链接题目解法牛题!题目实际上是要每次加入一个字符,求所有的\(border\)的神秘度之和考虑从前\(i-1\)个字符到前\(i\)个字符\(border\)的变化如果\(str_1=str_i\),会加入长度为\(1\)的\(border\),这一部分可以暴力加且只会保留\(i-1\)的\(border......
  • 数仓之TABLESAMPLE采样
    前言在日常工作中,我们会对表中记录随机抽样然后探查,如何进行抽样就是本章要讲的重点。数仓中的抽样方法有很多,这里主要介绍一下:随机抽样、块抽样、桶抽样、分组抽样这四种,话不多说,直接上干货。随机抽样随机抽样就是给每行数据赋值一个随机数,排序之后进行抽样,主要分为:or......
  • Android开发 - IInterface 接口 Binder 机制跨进程通信 (IPC)解析
    什么是IInterfaceIInterface一个接口,用于跨进程通信(IPC)。有时需要让一个应用程序与另一个应用程序或服务进行通信。这些应用程序可能运行在不同的进程中,使用Binder机制来实现这种通信,而IInterface就是Binder机制的一部分简单来说,IInterface是一个基础接口,它为跨......
  • 互联工厂数据交换标准:IPC-CFX
    大家好,我是Edison。全球电子制造主要集中在中国,面向未来工业4.0、中国制造2025的战略转型升级,互联互通是基础、数据是核心,如何从用户角度来定义设备加工数据的内容完整性、有效性、可扩展性将是工厂通讯连接交换的工作重点。IPC-CFX是什么?首先,解释下这两个缩写的意思:IPC是国际......
  • Android开发 - Binder 类进程间通信(IPC)的机制解析
    什么是BinderBinder是一种用于进程间通信(IPC)的机制,允许不同的进程(或者不同的组件)相互交互,提供了跨进程通信(IPC)的基础。它允许一个进程中的对象(如服务)被另一个进程中的代码(如应用组件)调用。Binder是一种特殊的对象,它能够在不同进程之间传递数据和调用方法Binder的作用进......
  • Android开发 - IBinder 类实现跨进程通信(IPC)解析
    什么是IBinderIBinder类是一个重要的接口,常用于实现跨进程通信(IPC);IBinder允许不同的进程或组件之间相互传递数据和调用方法。主要用于实现进程间通信。它是Android中的一个底层机制,允许不同的应用或组件(即使它们在不同的进程中)通过IBinder对象进行数据交换和方法调用IB......
  • 【WiFi】精讲WiFi 6E协议!图解超赞超详细!!!
    目录1.Wi-Fi6E概念介绍2.Wi-Fi6E关键技术3.Wi-Fi6EvsWi-Fi6对比4.Wi-Fi4VsWi-Fi5VsWi-Fi6VsWi-Fi6E特性对比图1.Wi-Fi6E概念介绍    802.11ax(HE,HighEfficiency)(Wi-Fi6E):6G频段共有1200MHz的频谱给到WiFi6E使用,可用于从5.925GHz到7.125GH......
  • 重头开始嵌入式第二十六天(Linux系统编程 进程间通信 IPC)
    目录IPC进程间通信1.管道通信管道的特性使用流程无名管道1.创建并打开管道:2.无名管道的读写:3.关闭管道: close();4.使用例子:有名管道1、创建:mkfifo2、打开有名管道 open3、管道的读写: 文件IO4、关闭管道:5、卸载管道:remove();IPC进程间通信进程间通信(In......
  • Adobe Substance 3D Sampler v4.2.2 下载及安装教程(3D材质管理软件)
    前言Substance3DSampler简称“Sa”是一款由Adobe新推出的3D真实材质贴图制作软件。允许用户通过调整和混合现有材料,或通过扫描(单个或多个图像)中提取新材料来创建和迭代材料集合,从而轻松将真实的图片转换为具有真实感的表面或HDR环境,为用户创作出更为丰富的材质贴图。一、下载......