hi3559v100是海思推出的camera soc处理器。采用的是双核处理器。一个是a7,运行的linux3.18内核。一个是a17使用的是huaweiliteos操做系统,Hi3559V100 系统中 Huawei LiteOS 负责系统媒体编解码相关业务。两个操做系统实现amp的构建形式。linux
首先了解一下sdk中的内容。架构
分别解压两个sdk包目录以下:工具
做为嵌入式软件开发来讲,重点关注如下两个目录:ui
主要是一些datasheet,demo板的原理图。spa
板端,pc端,手机端所使用到的开发调试 维护的软件包,工具包和文档操作系统
NDK 即媒体相关的功能模块基本都在 Huawei LiteOS 上具体实现(即 MAPI Local模式),并经过在 linux 侧提供 MAPI client 接口,对外提供媒体服务。MAPI local和 MAPI client 之间经过双核通讯组件 Hisyslink 实现通讯。设计
Middleware 和 References 在 Linux 侧部署,便于用户扩展。调试
硬件资源在双系统部署。component
媒体相关硬件部署在 Huawei LiteOS 侧;但外设控制器及其相关中断,内存等硬件资源应该根据产品须要,进行双系统部署。视频
在soc上部署的amp构架,一个linux,一个是huawei liteos。两个系统间的通讯机制:ICMP
Linux+Huawei LiteOS 双系统业务部署中,媒体业务的硬件资源及功能实现都部署在Huawei LiteOS 端,并经过核间通讯,把媒体服务延伸到 Linux 端,Linux 提供和Huawei LiteOS 端相同的接口定义。这就须要 Linux 和 Huawei LiteOS 提供核间通讯机制,为媒体业务提供消息通讯和大块数据通讯机制。核间通讯组件IPCM 就是专门为Linux+Huawei LiteOS 双系统核间通讯设计的底层组件。
IPCM 的底层通讯机制基于共享内存+中断方式实现。
IPCM 是基于共享内存区域实现多核通讯的,每一个核(OS)拥有一块本身的内存区域(基址+长度),同时知道其它每一个核(OS)拥有的内存区域(基址+长度)。
发送消息(带消息头)时,需指定目标核 ID(target)和端口(port),将消息填充到目标的内存区域。
接收消息时,从本身的内存区域读取数据,根据消息头读取一个消息。
双核之间经过 GIC 中断通知对方有消息准备好,须要对方读取。
Hi3559V100 在 IPCM 基础上再封装实现 HisysLink 子系统,通常状况下不直接访问IPCM 接口进行双核通讯。这里只介绍 IPCM 模块的初始化动做。
挂载 hi_ipcm.ko
调用_ipcm_vdd_init();初始化 IPCM 模块。
因为 IPCM 使用一片内存区域供 Linux 与 Huawei LiteOS 共同访问实现消息通讯。当执行 rmmod hi_ipcm 卸载完 Linux 的 IPCM 模块后,也须要在 Huawei LiteOS 调用_ipcm_vdd_cleanup 去初始化 IPCM。若是 Linux 与 Huawei LiteOS 两端初始化与去初始化 IPCM 不一致(好比一端去初始化并再次初始化 IPCM,另外一端不执行相应操做),将会致使内部共享内存区域未同步,形成访问异常地址而出现系统挂死。
Huawei LiteOS 上运行的某些应用须要进行一些配置文件的读写和临时中间文件的产生和删除。但 Hi3559V100 的 flash、sd、usb 均部署在 Linux 端,致使 Huawei LiteOS 没法使用 yaffs、FAT 之类文件系统进行文件的访问。所以开发 Sharefs 文件系统,在Huawei LiteOS 端虚拟一个文件系统,利用 IPCM 通讯和共享内存,实现其读写 Linux上指定目录下的内容。Sharefs 能够帮助 Huawei LiteOS 从 Linux 端读写文件,相似于NFS。Sharefs 指定访问 Linux 的目录可做为 flash,sd,usb,nfs 等的挂载点。这样,可实现 Huawei LiteOS 经过 Sharefs 访问 yaffs、FAT、NFS 等文件系统。将 Huawei LiteOS 须要访问的文件放在 Linux 端 Sharefs 指定目录,Huawei LiteOS 便可访问其须要的文件。假如共享的目录是liteos这个目录,Huawei LiteOS 端访问/liteos 目录,即为 Linux 端实际目录/liteos。在 Huawei LiteOS 端可以使用 open/read/write/lseek/close 等系统调用,也可以使用 fopen/fread/fwrite/fclose 等标准 I/O 库访问/liteos 目录。具体的使用以下:
将 Huawei LiteOS 须要访问的文件放在 Linux 端 Sharefs 指定目录,Huawei LiteOS 便可访问其须要的文件。Sharefs 使用步骤以下:
步骤1. Sharefs 在目录 osdrv/ components/sharefs/sharefs 下,在其目录执行./build.sh 编译出Linux 端使用的库(sharefs/out/linux/ liblinux_sharefs.a)和 APP(sharefs/out/linux/sharefs),Huawei LiteOS 端使用的库(sharefs/out/liteos/ libsharefs.a)。(此步骤已经过顶层 SDK 编译执行完成,可不作)
步骤2. Huawei LiteOS/Linux 使用方法
Huawei LiteOS 端使用方法:sharefs/include/sharefs_client.h 为其使用 Sharefs 用到的头文件。首先执行 IPCM 初始化,调用 _ipcm_vdd_init();再调用HI_ShareFs_Client_Init("/liteos");
完成初始化,其传参"/liteos"为 Sharefs 指定访问的文件目录,在 Linux 端须要有一个与其同名的目录。用户可自行指定 Sharefs 访问目录。可以使用 HI_ShareFs_Client_Check()接口查看 Sharefs 是否创建链接。返回 true 表示创建链接。方可执行文件访问。可以使用 HI_ShareFs_Client_Get_Path()接口得到 Sharefs 指定访问的目录。此目录实际存在于 Linux 端文件系统中。
Linux 端使用方法:首先加载 IPCM 模块,在单板根文件系统下执行/komod/ipcm 或insmod /komod/hi_ipcm.ko;若是采用 APP 执行:sharefs &,若是采用库,则在用户APP 中调用 HI_ShareFs_Server_Init()。
Sharefs 在 Linux 端使用的是用户态程序,其会与其它用户态程序一块儿竞争 CPU 资源。当 Linux 端 CPU 使用率过高(大80%)时,Sharefs 的 APP 执行效率会受到必定影响,会引发 Huawei LiteOS 端经过 Sharefs 访问 Linux 端文件效率降低,访问时长增长。此时须要提升 Sharefs 进程的优先级优先抢占 CPU 资源,命令:nice --19 sharefs&。采用 Sharefs 库时,须要提升使用其库的 APP 优先级。