IPC(核间)通信

Solution 的跨核通信基于 SDK 的data_service,机制实现核心逻辑如下:

  1. 通道建立:

  • 服务端(server)通过ipc_server_register接口注册

  • 客户端(client)通过ipc_client_register接口注册

  • 双方注册后形成双向数据通道。

  1. 消息发送:

  • 服务端向客户端发送消息:ipc_send_msg_to_client接口

  • 客户端向服务端发送消息:ipc_send_msg_to_server接口

  1. 通道关闭:

  • 服务端关闭:ipc_server_close接口

  • 客户端关闭:ipc_client_close接口

特殊说明 (针对 52x 芯片) 52x对于用户而言为单核芯片,无实际 LCPU(低功耗核),理论上 Sensor 与 APP、Battery 与 APP 之间无需 IPC 通信。但由于 Solution 需兼容双核 / 单核芯片(一套代码通用),因此统一采用 IPC 通信方案,在 52x 中虚拟了 “LCPU” 概念(实际运行于 HCPU 的低功耗处理模块)。

IPC通信的框架

Solution 提供了一套简化的 IPC 通信注册框架(代码位于 ipc_service.c),封装了底层数据交互细节。通过该框架,用户无需关注复杂的跨核通信实现,仅需调用注册接口并实现回调函数,即可快速搭建通信链路。

IPC通信注册接口

  • 服务端注册: 用于注册服务并提供数据处理能力:

     ipc_ds_handle_t *ipc_server_register(
         const char *ds_name,        // 服务名称(唯一标识,用于客户端匹配)
         void *filter_cb,            // 消息过滤回调(可选,用于筛选接收的消息)
         void *est_cb,               // 连接建立回调(通道建立时触发)
         void *sleep_cb,             // 低功耗回调(服务端进入休眠时触发)
         void *comm_cb               // 消息处理回调(接收到客户端消息时触发)
     );
    
  • 客户端注册: 用于订阅服务并建立通信连接:

     void ipc_client_register(
         ipc_ds_handle_t **dst_ds,   // 输出参数,接收客户端句柄
         ipc_ds_handle_t *src_ds,    // 输入参数,服务端句柄(由服务端注册返回)
         const char *ds_name,        // 服务名称(需与服务端注册名称一致)
         void *filter_cb,            // 消息过滤回调(可选)
         void *est_cb,               // 连接建立回调(通道建立时触发)
         void *comm_cb               // 消息处理回调(接收到服务端消息时触发)
     );
    

IPC通信举例

典型通信流程

  1. 服务端初始化:调用ipc_server_register注册服务,指定服务名称和回调函数(如est_cb用于通知连接建立,comm_cb用于处理客户端消息)。

  2. 客户端连接:调用ipc_client_register订阅服务,通过服务名称匹配服务端,获取客户端句柄。

  3. 消息交互:

  • 服务端通过ipc_send_msg_to_client向客户端发送数据;

  • 客户端通过ipc_send_msg_to_server向服务端发送数据;

  • 双方通过comm_cb回调处理接收到的消息。

  • 连接关闭:按需调用ipc_server_closeipc_client_close释放资源。(图中未体现)

参考实例

  1. lcpu_service.c:实现了 LCPU(作为服务端)与应用层(作为客户端)的 IPC 通信实现,包括传感器数据上报、低功耗状态同步等场景。

  2. battery_service.c:实现了电池服务(作为服务端)与应用(作为客户端)的 IPC 通信流程,包含电量数据推送、充电状态通知等功能。