前言
2018年开始参与CPU为i.MX6DL,操作系统为QNX(类linux)的嵌入式多媒体中间件系统架构设计与实现的工作中。本文作为这部分内容的开篇,将介绍整个架构设计的思路和最后的定型。很多人笑话中间件有点类似秘书干的活,比较繁杂,确实有这种感觉在,所以作为软件设计就要从纷繁芜杂的事务和物件中抽象出可以重用的组件,这样中间件的价值就体现出来了。
正文
中间件
软件整体设计图如下:
主要包含
- HMI人机交互组件
- 中间件
- framework,在本项目中和中间件合二为一
- BSP,板级加载包
软件数据流

- 数据源
- 车辆数据
- 摄像数据
- 车载信息娱乐系统数据
- 数据终点
- HMI人机交互组件
- BSP驱动声音和视频
- 回送给外设,如车辆,信息娱乐系统等
架构设计

- 这里以audio为例进行中间件设计的说明。在项目的执行过程中,设计和实现是逐步完善的,也就是最初设计的那些组件会因为项目的进度和人力的原因进行裁剪。
- 从BSP侧收集声音的请求消息
- 接收消息的模块进行消息的解码,并针对消息类型进行消息分发,如果是声音消息则分发给audio adaptor
- audio adaptor作为audio service的一部分,负责消息的过滤和对不同外设的适配
- audio service得到声音消息后,根据定义的声音处理策略进行声音处理
- 最终驱动BSP进行喇叭播放
- 从各个service中提取重用的部分进行SDK封装
audio设计

- 基础消息通讯采用两种:mq和msgpassing。mq为posix标准的消息接口,用于中间件内部的通信,消息量少且分发快速;msgpassing为QNX提供的可靠通信机制,用于中间件和外部的通信,保证消息的可靠传递。这两种消息机制的选型和对比本文暂不展开。
- audio组件启动时,加载配置文件并初始化消息注册、共享内存、互斥锁等数据
- msg listener作为mq的注册回调接口,进行消息的接收
- audio adaptor模块从msg listener收到消息后,根据配置文件进行消息的预处理,如过滤和适配
- audio service根据配置文件中配置的声音处理策略进行业务逻辑处理,并调用音频播放器
- 音频播放器最终使用bsp驱动喇叭播放不同的声音