IPC(核间)通信
Solution 的跨核通信基于 SDK 的data_service,机制实现核心逻辑如下:
通道建立:
服务端(server)通过
ipc_server_register
接口注册客户端(client)通过
ipc_client_register
接口注册双方注册后形成双向数据通道。
消息发送:
服务端向客户端发送消息:
ipc_send_msg_to_client
接口客户端向服务端发送消息:
ipc_send_msg_to_server
接口
通道关闭:
服务端关闭:
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通信举例
典型通信流程
服务端初始化:调用
ipc_server_register
注册服务,指定服务名称和回调函数(如est_cb用于通知连接建立,comm_cb用于处理客户端消息)。客户端连接:调用
ipc_client_register
订阅服务,通过服务名称匹配服务端,获取客户端句柄。消息交互:
服务端通过
ipc_send_msg_to_client
向客户端发送数据;客户端通过
ipc_send_msg_to_server
向服务端发送数据;双方通过comm_cb回调处理接收到的消息。
连接关闭:按需调用
ipc_server_close
或ipc_client_close
释放资源。(图中未体现)
参考实例
lcpu_service.c
:实现了 LCPU(作为服务端)与应用层(作为客户端)的 IPC 通信实现,包括传感器数据上报、低功耗状态同步等场景。battery_service
.c:实现了电池服务(作为服务端)与应用(作为客户端)的 IPC 通信流程,包含电量数据推送、充电状态通知等功能。