专栏算法工具链征程6E/M快速上手实战Sample-IPC

征程6E/M快速上手实战Sample-IPC

六朝金粉地2024-08-01
550
3

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:

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写入共享内存。

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方式进行传输:

将生成的可执行文件复制到共享文件夹中:

通过串口获取单板ip:*可通过地平线开发者社区-6. *单板设置ip地址设置ip

打开WinSCP新建站点:

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

2.1.3 运行

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

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

Sample运行时Acore串口日志:

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


算法工具链
征程6社区征文官方教程
+1
评论2
0/1000
  • 卖报小郎君
    Lv.1

    地平线默认mcu 版本,A核sample ipc demo 只能发送,收不到mcu 的ipc data

    2024-08-16
    0
    1
    • 卖报小郎君回复卖报小郎君:

      基线是730

      2024-08-16
      0
  • Lv.1

    Ipc_MDMA_PollMsg之后如何使用数据?

    2025-08-19
    0
    0