Sunrise camera 开发说明
Sunrise camera 系统设计
系统框图
Sunrise camera 实现了智能摄像机、智能分析盒等多种应用方案。
Sunrise camera 源码包括用户操作层的 WebPages、通信模块层、功能模块层;本文档主要介绍这三个模块的设计。
Hal 层模块包括多媒体相关模块调用接口库, BPU 模块推理库等;
Kernel 版本包含标准驱动库的基础上,系统 BSP。
软件框图如下所示:
微核设计
微核架构( microkernel architecture )又称为“插件架构”( plug-in architecture ),指的是软件的内核相对较小,主要功能和业务逻辑都通过插件实现。
内核( core )通常只包含系统运行的最小功能。插件则是互相独立的,插件之间的通信,应该减少到最低,避免出现互相依赖的问题。
架构优缺点
优点
良好的功能延伸性,需要什么功能,开发插件即可。
功能之间是隔离的,插件可以独立的加载和卸载,容易部署。
可定制性高,适应不同的开发需要。
可以渐进式开发,逐步添加功能。
缺点
扩展性差,内核通常是一个独立单元,不容易做成分布式。
开发难度相对较高,因为涉及到插件与内核的 通信,以及插件登记。
Sunrise camera 架构视图
模块划分
模块 | 目录 | 描述 |
---|---|---|
事件总线模块 | communicate | 实现模块的事件注册、事件接收、事件分发 |
公共库模块 | common | 公共操作函数, log/lock,线程操作,队列操作等 |
Camera 模块 | Platform | 芯片平台相关代码,实现硬件差异部分的封装 |
对外交互模块 | Transport | 设备和外接交互部分, rtspserver、 websocket 等 |
主程序入口 | Main | Main 函数入口 |
顶层代码结构
.
├── common # 公共库模块代码
├── communicate # 事件总线模块
├ ── config # 编译配置目录
├── main # 主入口程序
├── Makefile # 编译脚本
├── makefile.param # 编译配置
├── Platform # Camera 模块,平台、应用场景代码,芯片 IP 相关代码都在本目录下实现
├── start_app.sh # 启动脚本
├── sunrise_camera.service # 开启自启动配置文件
├── third_party # 依赖的第三方库
├── Transport # rtspserver 和 websocket 模块代码实现
├── VERSION # 版本信息
└── WebServer # web 页面的程序和资源文件
编译
- 登录设备,进入目录:
/app/multimedia_samples/sunrise_camera
- 执行命令:
make
- 生成的目标文件:
sunrise_camera
root@ubuntu:/app/multimedia_samples/sunrise_camera# ls sunrise_camera/bin/
log sunrise_camera www
事件总线模块( communicate )
概述
事件总线模块,最小运行单位;根据编译选项调用不同模块的注册接口函数,并且完成不同模块 CMD 的接收和分发。
当模块间交互时,接收到的 CMD 如果已经注册和使能,则中转到受理子模块处理,处理完成后向请求模块返回处理结果。
当模块间交互时,接收到的 CMD 没有注册或者未使能,则 CMD 调用失败。
功能描述
- 模块插件静态插拔控制
- 模块 CMD 指令中转
示例:
camera 子模块中定义了 SDK_CMD_CAMERA_GET_CHIP_TYPE 命令,调用 camera_cmd_register 函数注册该 CMD 后,当 websocket 子模块收到 web 页面请求获取芯片类型时, websocket 模块可以通过以下代码调用 camera 子模块中的接口 。
整个过程如下图所示:
模块代码结构
.
├── include
│ ├── sdk_common_cmd.h # 定义系统中所有子模块的 CMD
│ ├── sdk_common_struct.h # 定义每个 CMD 对应使用到的数据结构
│ └── sdk_communicate.h # 定义本模块接口函数
├── Makefile
└── src
└── sdk_communicate.c # 接口代码实现
接口描述
sdk_globle_prerare
各子模块的 xxx_cmd_register() 函数会集中放到这个函数中,主程序启动时,通过调用本接口将所有子模块需要注册并使能的的 CMD 注册进子系统中。
每个子模块都要实现 xxx_cmd_register(),在该函数中实现子模块 CMD 注册。这是整个系统能够正常运行的基本前提。
示例:
sdk_cmd_register
CMD 注册接口。
sdk_cmd_unregister
CMD 注销接口。
sdk_cmd_impl
子模块通过调用本接口实现调用其他子模块实现的接口功能。
公共库模块( common )
概述
程序公共库类,包含但不限于日志操作、锁操作、线程封装、base64 ;
本模块主要把编程中会使用到的公共类、公共函数进行封装;避免相同操作的函数实现在多处出现。
本模块的更新影响所有模块,需要谨慎操作。
功能描述
无