1. 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:
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。
*客户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:

rx_pthread:


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写入共享内存。
2. 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环境下运行正常。其它环境不能保证。
进入toolchain执行:
Sample代码路径:
复制/src源码(.json和.cpp)到新建文件夹ipc并构建新Makefile:
Makefile:
执行make完成编译,生成的文件为./program

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


打开WinSCP新建站点:

登录后将program拖拽到/home/hobot/完成文件传输:

2.1.3 运行
通过ssh或串口进入/home/hobot/执行:
*如使用自定义ipcfhal_sample_config.json则需将该文件也传输到单板上并修改.cpp中SMP_CFG_FILE为正确路径
Sample运行时Acore串口日志:


