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 执行。
3.MAPI Demo
MAPI(Media Application Programming Interface) 是对 MPI(Media Process Platform Programming Interface) 接口和功能模块做了提炼和抽象,简化繁琐的多媒体处理平台库调用流程,支持应用软件快速开发输入音视频捕获、H264/H265/JPEG/ 音频编码,音视频解码输出等多媒体功能。同时 MAPI 支持跨 OS 调用,即 K230 的大小核上均可调用相同的 API 来实现需要的应用场景(MAPI 实现的功能可查看 GitHub 接口文档 :K230 SDK_Docs_MAPI )。以下 Demo 展示了 MAPI 的使用方式,其中大核作为服务端通过 MPP 操作硬件设备,小核作为设备端向大核发送操作请求。
3.1 MAPI 视频编码
sample_venc Demo 小核通过调用 MAPI 编码接口,将大核 Camera 采集的图像进行编码,并保存成文件。Demo 最大支持 3 通道输出,支持 H264、H265,JPGE 编码,但暂不支持同时 3 通道编码不同的格式,其主要参数说明:
参数说明 | 可选参数值 | 参数说明 |
---|---|---|
-s | 3 | sensor 型号,默认使用 3 |
-n | 1,2,3 | 输出通道数,比如设置为 3,则 3 个通道同时编码输出 |
-t | 0,1,2 | 0:h264 type,1:h265 type,2:jpeg type |
-o | NA | 指定编码生成的文件目录,然后根据不同的编码类型,会在小核指定的输出目录下 生成不同的码流文件,对于h264类型,会生成形如 stream_chn0.264 文件,其中 0 代表 0 通道;对于h265类型,会生成形如 stream_chn0.265 文件,同样 0 代表0 通道;对于 jpeg 类型,会生成形如 chn0_0.jpg 的 jpg 图片,代表 0 通道第 0 张图片, 默认会生成 10 张 jpg 图片 |
操作步骤如下:
1、在大核侧启动核间通信进程,进入 /sharefs/app,执行 ./sample_sys_init.elf
2、在小核侧 /mnt 目录下,执行 ./sample_venc -s 3 -n 3 -t 0 -o /sharefs
,3 通道同时进行 H264 编码,且在 /sharefs下生成不同分辨率的编码文件:
- 一路:分辨率 1280*720,生成文件:/sharefs/stream_chn0.264
- 二路:分辨率 960*640,生成文件:/sharefs/stream_chn1.264
- 三路:分辨率 640*480,生成文件:/sharefs/stream_chn2.264
3、执行一段时间后按【ctrl+c】退出 Demo 执行
4、将生成的编码文件通过 scp
命令拷贝到上位机,再下载到本地 PC 播放,例如使用 ffplay 工具进行播放
3.2 MAPI 视频解码
MAPI 视频解码
Demo 主要展示将小核的编码文件通过 MAPI 接口给大核解码并通过 LCD 屏幕显示,其操作步骤:
- 在大核侧启动核间通信进程,进入 /sharefs/app,执行
./sample_sys_init.elf
- 在小核侧 /mnt 目录下,执行
./sample_vdec -i /sharefs/test_resource/canaan.264
,将编码文件通过 MAPI 传递给大核解码并播放
MAPI 音频编码
Demo 主要展示小核通过调用 MAPI 接口,将大核采集音频数据并进行编码,并保存成文件。其操作步骤如下:
- 上位机执行播放音频操作,默认音频文件是 /home/user/hellocannan.wav,也可以【文件上传】按钮手动上传音频文件,执行播放音频命令:
audio_aplay /home/user/hellocannan.wav
- 在大核侧启动核间通信进程,进入 /sharefs/app,执行
./sample_sys_init.elf
- 在小核侧 /mnt 目录下,执行
./sample_audio -type 0 -filename /sharefs/test.g711a
(采样率44100,16bit)进行采集编码 - 按键盘“q”回车退出 Demo 执行
- 将编码生成的 test.g711a 通过
scp
命令拷贝到上位机,再下载到本地 PC 播放 - 本地PC采用采用音视频软件分析,其中参数设置如下,然后播放该录制的音频:
- 【编码】:A-Law
- 【字节序】:默认尾端(endianness)
- 【声道】:2 声道(立体声)
- 【采样率】:44100