K230 异核通信 Demo使用指南
Demo 主要实现 K230 异构核间通讯,包含 IPCMSG , DataFIFO 两种方式,其中 IPCMSG 主要用于发送控制类消息;DataFIFO 主要应用于大量数据交互(例如编码数据)通信。
1. IPCMSG Demo
IPCMSG 是 K230 大小核在用户态进行通讯的组件,主要用于发送控制类消息。该模块包括服务添加删除,消息创建删除,断开连接,发送消息等功能。支持三种消息发送方式,发送异步消息,发送同步消息,以及发送不需要对方回复的消息。其中同步消息支持超时机制,用户调用 API 时可自定义设置超时时间。需要得到回复的消息,在发出 60 秒之后才收到回复消息的话,该回复消息会被丢弃。本 Demo 主要展现小核发送三种消息给大核,大核接收到消息后,根据消息类型进行处理和返回结果,Demo代码主要实现:
- 大小核建立通讯 ,即建立 2 个 IPCMSG 通讯服务 Test1 和 Test2(log 中对应 id 号3 和 4),每一个 IPCMSG 服务对应一个接收线程
- 小核创建 2 个线程分别使用不同通信服务来发送同步/异步消息,其中异步信息分别为仅发送消息 不设置回调函数,和发送消息并设有回调函数
- 大核接收到信息之后,会根据消息类型进行处理回复
- 小核收到回复消息后,唤醒线程打印接收到回复消息
操作步骤如下:
1、大核执行:/sharefs/app/sample_receiver.elf
2、小核进入 /mnt,然后执行:./sample_sender
3、可按“q”键 、回车键退出 Demo
-
小核 log:
[root@canaan /mnt ]#./sample_sender
-----Connect: 1
-----Connect: 0
Run...
id:3 send sync: module:1 cmd:03000001 time use:10.895ms
receive sync resp: modle:1, cmd:03000001, have done., return:0
sendasync modle:2 cmd:03000001
receive async resp: modle:2, cmd:03000001, have done., return:0
sendonly modle:2 cmd:03000001
Run...
id:3 send sync: module:1 cmd:03000002 time use:4.120ms
receive sync resp: modle:1, cmd:03000002, have done., return:0
sendasync modle:2 cmd:03000002
id:4 send sync: module:1 cmd:04000003 time use:0.301ms -
大核 log:
receive sync resp: modle:1, cmd:04000003, done., return:0
receive async resp: modle:2, cmd:03000002, have done., return:0
sendonly modle:2 cmd:03000002
sendasync modle:2 cmd:04000003
receive async resp: modle:2, cmd:04000003, done., return:0
sendonly modle:2 cmd:04000003
id:3 send sync: module:1 cmd:03000004 time use:3.857ms
receive sync resp: modle:1, cmd:03000004, have done., return:0
sendasync modle:2 cmd:03000004
receive async resp: modle:2, cmd:03000004, have done., return:0
id:4 send sync: module:1 cmd:04000005 time use:1.111ms
receive sync resp: modle:1, cmd:04000005, done., return:0 -
对应的大核 log:
msh /sharefs/app>sample_receiver.elf
msh /sharefs/app>
Press q to quit
start receive msg from 3
start receive msg from 4
receive msg from 3: sync 0, len: 16
receive msg from 3: async 0, len: 16
receive msg from 3: only 0, len: 16
receive msg from 3: sync 1, len: 16
receive msg from 4: sync 2, len: 16
receive msg from 3: async 1, len: 16
receive msg from 4: async 2, len: 16
receive msg from 3: only 1, len: 16
receive msg from 3: sync 3, len: 16
receive msg from 4: only 2, len: 16
receive msg from 3: async 3, len: 16
receive msg from 4: sync 4, len: 16
2.DataFIFO Demo
DataFIFO 是 K230 大小核在用户态进行大量数据交互(例如编码数据)时,使用的核间通讯组件。内部主要使用共享内存来完成数据的交互,数据传递的是指针,不会拷贝数据的内容,数据的收发通知依靠线程轮询来实现,本 Demo 主要实现:
- 大小核分别建立 2 个 DataFIFO,1 路读通道,1 路写通道,并建立连接
- 大核往 DataFIFO buf 按如下代码规则写数据,其中 g_s32Index 随着每次循环+1,小核去读取 snprintf(buf, BLOCK_LEN, "%d", g_s32Index)
- 小核往发送 DataFIFO buf 按如下代码规则写数据,其中 g_s32Index 随着每次循环+1,大核读取 snprintf(buf, BLOCK_LEN, "%d", g_s32Index)
操作步骤如下:
1、大核执行:/sharefs/app/sample_writer.elf
,此时 log 会打印 2 个物理地址
msh />/sharefs/app/sample_writer.elf
PhyAddr: 10000000
PhyAddr: 10003000
datafifo_init finish
press any key to start.
2、小核进入/mnt,然后执行:./sample_reader 0x10000000 0x10003000
,0x10000000 是读地址, 0x10003000 是写地址,地址与大核 log 的物理地址一致
[root@canaan /mnt ]#./sample_reader 0x10000000 0x10003000
datafifo_init finish
press any key to start.
3、此时大核和小核串口中断按提示输入任何按键,开启 DataFIFO 数据传输
-
小核 log:
receive:********0********
receive:********1********
receive:********2********
Input q to exit:
send: ========0========
send: ========1========
receive:********3********
release 0x3fcf7070e0
release 0x3fcf7074e0
send: ========2========
receive:********4********
receive:********5******** -
大核 log:
send: ********0********
Input q to exit:
send: ********1********
send: ********2********
release 0x1000000e0
release 0x1000004e0
release 0x1000008e0
send: ********3********
receive:========0========
receive:========1========
release 0x100000ce0
send: ********4********
send: ********5********
receive:========2========
3、可按“q”键回车后,再按任意按键释放资源,并退出 Demo 执行。