K230核间通讯API参考
1. 概述
1.1 概述
该文档描述了K230异构核间通讯的相关内容。
1.1.1 核间通讯实现原理
- 共享内存用于大小核发送通信消息的具体内容
- 共享内存管理用于标识通信消息的属性例如地址,大小,端口号等
- Mailbox通过中断方式实现大小核发送消息后的通知机制
1.1.2 内存空间使用
目前大小核使用的数据共享内存区域设计共1M空间,对于参与通讯的一方来说发送和接收各占512KB的空间大小。用于维护各个核状态的共享内存区域为4KB。
1.2 功能描述
1.2.1 IPCMSG
IPCMSG是K230大小核在用户态进行通讯的组件,主要用于发送控制类消息。该模块包括服务添加删除,消息创建删除,断开连接,发送消息等功能。支持三种消息发送方式,发送异步消息,发送同步消息,以及发送不需要对方回复的消息。其中同步消息支持超时机制,用户调用API时可自定义设置超时时间。需要得到回复的消息,在发出60秒之后才收到回复消息的话,该回复 消息会被丢弃。
1.2.2 DATAFIFO
DATAFIFO是K230大小核在用户态进行大量数据交互(例如编码数据)时,使用的核间通讯组件。内部主要使用共享内存来完成数据的交互,数据传递的是指针,不会拷贝数据的内容,数据的收发通知依靠线程轮询来实现。
DATAFIFO 主要包含通路的打开、关闭、数据的写入和读出,以及其他控制命令
2. API 参考
2.1 IPCMSG
该功能模块提供以下API:
- kd_ipcmsg_add_service
- kd_ipcmsg_del_service
- kd_ipcmsg_try_connect
- kd_ipcmsg_connect
- kd_ipcmsg_disconnect
- kd_ipcmsg_is_connect
- kd_ipcmsg_send_only
- kd_ipcmsg_send_async
- kd_ipcmsg_send_sync
- kd_ipcmsg_run
- kd_ipcmsg_create_message
- kd_ipcmsg_create_resp_message
- kd_ipcmsg_destory_message
2.1.1 kd_ipcmsg_add_service
【描述】
添加服务
【语法】
k_s32 kd_ipcmsg_add_service(const k_char* pszServiceName, const k_ipcmsg_connect_s* pstConnectAttr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
pszServiceName | 服务的名称指针。。 | 输入 |
pstConnectAttr | 连接对端服务器的属性结构体。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
Service 可以添加多个,但不同的 service 不能使用相同的端口号,client 跟 service 是通
过相同的端口号来通信的,因此一个 service能对应一个 client
【举例】
无
【相关主题】
2.1.2 kd_ipcmsg_del_service
【描述】
删除服务
【语法】
k_s32 kd_ipcmsg_del_service(const k_char* pszServiceName);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
pszServiceName | 服务的名称指针。服务名称最大长度: K_IPCMSG_MAX_SERVICENAME_LEN。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
无
【举例】
无
【相关主题】
2.1.3 kd_ipcmsg_try_connect
【描述】
非阻塞方式建立连接
【语法】
k_s32 kd_ipcmsg_try_connect(k_s32* ps32Id, const k_char* pszServiceName, k_ipcmsg_handle_fn_ptr pfnMessageHandle);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ps32Id | 消息通信 ID 指针。 | 输出 |
pszServiceName | 服务名称指针。 | 输入 |
pfnMessageHandle | 消息处理回调函数。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
无
【举例】
无
【相关主题】
2.1.4 kd_ipcmsg_connect
【描述】
阻塞方式建立连接
【语法】
k_s32 kd_ipcmsg_connect(k_s32* ps32Id, const k_char* pszServiceName, k_ipcmsg_handle_fn_ptr pfnMessageHandle);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ps32Id | 消息通信 ID 指针。 | 输出 |
pszServiceName | 服务名称指针。 | 输入 |
pfnMessageHandle | 消息处理函数。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
无
【举例】
无
【相关主题】
2.1.5 kd_ipcmsg_disconnect
【描述】
断开连接
【语法】
k_s32 kd_ipcmsg_disconnect(k_s32 s32Id);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
s32Id | 消息通信 ID。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
无
【举例】
无
【相关主题】
2.1.6 kd_ipcmsg_is_connect
【描述】
消息通信是否连接状态。
【语法】
k_bool kd_ipcmsg_is_connect(k_s32 s32Id);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
s32Id | 消息通信 ID。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
K_TRUE | 连接状态。 |
K_FALSE | 非连接状态。 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
无
【举例】
无
【相关主题】
2.1.7 kd_ipcmsg_send_only
【描述】
仅发送消息给对端,不接收对端的返回值
【语法】
k_s32 kd_ipcmsg_send_only(k_s32 s32Id, k_ipcmsg_message_s *pstRequest);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
s32Id | 消息服务 ID。 | 输入 |
pstRequest | 消息结构体的指针。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
无
【举例】
无
【相关主题】
2.1.8 kd_ipcmsg_send_async
【描述】
发送异步消息。这个接口是非阻塞接口,发送消息到对端后就返回了,不会等待消息命令的处理过程。
如果调用此接口发送回复消息,则不需要对端回复,否则对端必须回复
【语法】
k_s32 kd_ipcmsg_send_async(k_s32 s32Id, k_ipcmsg_message_s* pstMsg, k_ipcmsg_resphandle_fn_ptr pfnRespHandle);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
s32Id | 消息服务 ID。 | 输入 |
pstMsg | 消息指针。 | 输入 |
pfnRespHandle | 消息回复处理函数。在发送回复消息时可以为 NULL,其他情况不允许为 NULL。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
无
【举例】
无
【相关主题】
2.1.9 kd_ipcmsg_send_sync
【描述】
发送同步消息。这个接口会阻塞等待对端消息命令处理完成后再返回。
【语法】
k_s32 kd_ipcmsg_send_sync(k_s32 s32Id, k_ipcmsg_message_s* pstMsg, k_ipcmsg_message_s** ppstMsg, k_s32 s32TimeoutMs);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
s32Id | 消息服务 ID。 | 输入 |
pstMsg | 消息指针。 | 输入 |
ppstMsg | 回复消息的指针的指针。 | 输出 |
s32TimeoutMs | 超时时间。单位:ms。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
本接口超时的情况下,内部会调用 kd_ipcmsg_destory_message将*ppstMsg(回复消
息)销毁一次,由于同一个消息不能重复销毁,所以本接口超时退出后不必再做销毁
回复消息的处理
【举例】
无
【相关主题】
2.1.10 kd_ipcmsg_run
【描述】
消息处理函数
【语法】
k_void kd_ipcmsg_run(k_s32 s32Id);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
s32Id | 消息服务 ID。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
void | 无 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
无
【举例】
无
【相关主题】
2.1.11 kd_ipcmsg_create_message
【描述】
创建消息
【语法】
k_ipcmsg_message_s *kd_ipcmsg_create_message(k_u32 u32Module, k_u32 u32CMD, k_void* pBody, k_u32 u32BodyLen);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
u32Module | 模块 ID。由用户创建,用于区分不同模块的不同消息。 | 输入 |
u32CMD | u32CMD 命令 ID。由用户创建,用于区分同一模块下的不同命令。 | 输入 |
pBody | 消息体指针 | 输入 |
u32BodyLen | 消息体大小 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
k_ipcmsg_message_s* | 消息结构体指针。 |
null | 消息创建失败 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
无
【举例】
无
【相关主题】
2.1.12 kd_ipcmsg_create_resp_message
【描述】
创建回复消息
【语 法】
k_ipcmsg_message_s* kd_ipcmsg_create_resp_message(k_ipcmsg_message_s* pstRequest, k_s32 s32RetVal, k_void* pBody, k_u32 u32BodyLen);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
pstRequest | 请求消息的指针。 | 输入 |
s32RetVal | 回复返回值。 | 输入 |
pBody | 回复消息的消息体指针。 | 输入 |
u32BodyLen | 回复消息的消息体大小。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
k_ipcmsg_message_s* | 消息结构体指针。 |
null | 消息创建失败 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
无
【举例】
无
【相关主题】
2.1.13 kd_ipcmsg_destroy_message
【描述】
销毁消息
【语法】
k_void kd_ipcmsg_destroy_message(k_ipcmsg_message_s* pstMsg);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
pstMsg | 消息指针。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
k_void | 无 |
【芯片差异】
无
【需求】
- 头文件:k_comm_ipcmsg.h k_ipcmsg.h
- 库文件:libipcmsg.a
【注意】
不支持同一个消息重复销毁,否则会导致系统异常。
【举例】
无
【相关主题】
2.2 DATAFIFO
该功能模块提供以下API:
- kd_datafifo_open
- kd_datafifo_open_by_addr
- kd_datafifo_close
- kd_datafifo_read
- kd_datafifo_write
- kd_datafifo_cmd
2.2.1 kd_datafifo_open
【描述】
打开数据通路。
【语法】
k_s32 kd_datafifo_open(k_datafifo_handle* Handle, k_datafifo_params_s* pstParams)
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
Handle | 数据通路句柄。 | 输出 |
pstParams | 数据通路参数指针 。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码。 |
【芯片差异】
无
【需求】
- 头文件:k_datafifo.h
- 库文件:libdatafifo.a
【注意】
无
【举例】
无
2.2.2 kd_datafifo_open_by_addr
【描述】
通过物理地址打开数据通路。
【语法】
k_s32 kd_datafifo_open_by_addr(k_datafifo_handle *Handle, k_datafifo_params_s *pstParams, k_u64 u64Phyaddr)
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
Handle | 数据通路句柄。 | 输出 |
pstParams | 数据通路参数指针。 | 输入 |
u32PhyAddr | 数据缓存的物理地址。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码。 |
【芯片差异】
无
【需求】
- 头文件:k_datafifo.h
- 库文件:libdatafifo.a
【注意】
无
【举例】
无
2.2.3 kd_datafifo_close
【描述】
关闭数据通路。
【语法】
k_s32 kd_datafifo_close(k_datafifo_handle Handle)
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
Handle | 数据通路句柄。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失败,其值为错误码。 |
【芯片差异】
无
【需求】
- 头文件:k_datafifo.h
- 库文件:libdatafifo.a
【注意】
关闭 DataFifo 的时候为了保证读写两端数据正常的释放,用户需要保证读端要读完DataFifo 中存在的数据,写端写完数据后需要额外调用一次kd_datafifo_write (Handle, NULL) 触发写端的数据释放和读指针更新
【举例】
无
2.2.4 kd_datafifo_read
【描述】
读取数据。
【语法】
k_s32 kd_datafifo_read(k_datafifo_handle Handle, void** ppData)
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
Handle | 数据通路句柄。 | 输入 |
ppData |