(仅供参考)基于开放式体系架构的组件设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Initialized?
[Successed]
Initialized
PreparedToWork
Started?
[Fa i l e d ]
/Release(IModuleManager *)
/Release(IModuleManager *)
Unloaded
[Fa i l e d ]
结束期
Final
29
配置组件项目
设置库路径为<DSLIB>\Debug(Debug编译)或<DSLIB>\Release(Release编译) 设置附加库文件为“LibDS.lib;LibDSTL.lib;” 本例中<DSLIB>= ..\DS,为相对路径
30
Load(); Initialize(); Prepare(); Start(); Wait(); Stop(); Cleanup; Finalize(); Release();
用户自定义
extern “C” IModule * __cdecl GetModuleEntry (const tchar *name);
class System
« i n te rfa ce » IQueriable
+ GetRuntimeClass(): const ClassInfo & + Query(UID &): IQueriable *
组 件
事件 信源
属性
4
4/23
为组件选一个好的架构 LA(Layer Architecture) SOA(Service-Oriented Architecture) OSGI(Open Service Gateway Initiative) SCA(Service Component Architecture) SCA(Software Communications Architecture ) OSA(Open System Architecture)
获取运行节点唯一编号。该编号每次运行都不一样,且保证全局唯一, 一般用于系统动态管理。
注册服务。 sid:服务的唯一编号,一般是服务接口的接口编号。 pService:服务接口指针。 服务注册之后,所有组件都可通过服务接口编号对服务指针进行查询。
反注册服务,参数与RegisterService相同,但动作相反。
/Stop(IModuleManager *)
Working
/Initialize(IModuleManager *)
/Cleanup(IModuleManager *)
Stopped?
/Prepare(IModuleManager *)
[Successed] /Start(IModuleManager *)
+ GetArgument(char *): const char * + GetNodeID(): const UID & + GetNodeName(): const char * + RegisterService(UID &, IQueriable *): boolean + UnRegisterService(UID &, IQueriable *): boolean
IModule接口的实现
函数 GetName GetID GetHelper Load Initialize Prepare Start Stop Cleanup Finalize Release
实现功能 返回模块名称 返回模块唯一编号 返回模块附属功能 向组件管理器注册服务;向其它服务注册指定的接口 初始化自身,服务查询 运行期准备 启动工作线程 停止工作线程,与Start相反 运行期清理,与Prepare相反 结束自身功能,与Initialize相反 反注册服务,与Load相反,并释放组件对象
其他服务
ICommService
Query(IOtherService::GetUID())
IConfigureManager
调用者组件
return Services[IOtherService::GetUID()]
IOtherService
组件之间的功能集成通过服务实现 • 组件数据交互通过组件通信服务实现 • 组件参数配置通过参数配置服务实现 • 组件还可提供其它自定义服务
10
10/23
相关背景介绍 组件 开放式体系架构 组件设计 实例介绍
11
内容
组件生命周期分析
Initial
初始期
模块状态迁移图
[Module is unloaded] /Load(IModuleManager *)
Loaded
JustStopped
[Successed]
[Fa i l e d ]
发送
等待数据到达
接收
打印
等待超时
35
组件部署运行
36
组件调试设置
如果只调试组件代码,设置命令为..\exe\DSHost.exe,该文件为架构可执 行程序的发布版本;工作目录设置为..\exe,命令行参数为--mdir ..\Debug, 重新设置组件搜索目录,因为组件DLL的调试版本在..\Debug目录中。 如果还要调试框架代码,将架构主执行程序DSHost.exe的调试版本也复 制到exe目录中,更名为DSHostDebug.exe,并将此程序路径设置为命令。
5
相关背景介绍 开放式体系架构 组件设计 实例介绍
6
内容
雷达开放式体系架构(ROSA)
7
7/23
开放式软件体系结构——首次设计
可
替
波束调度
环境分析
换
模 块
雷达控制
信号处理
显示 监控
并行计算架构
目标跟踪 数据记录
架 实时系统架构 构
数据分发与通讯架构
层
应用架构
配置 管理
抽 程序语言(C/C++) 象 层
16
接口查询
IQueriable 组件管理器
关联
IQueriable ICommService
通信服务
Query(ICommService::GetUID()) 返回
17
组件
基本服务:通信服务
DDS通信模块
DDS通信工厂 DDS发送者 DDS接收者
1.注册
UDP通信模块
UDP通信工厂 UDP发送者 UDP接收者
基于开放式体系架构组件设计
相关背景介绍 开放式体系架构 组件设计 实例介绍
2
内容
如何从农村走向城市?
农村与城市的启示
3
软件模块化的追求
降低耦合度,提升内聚性
低
耦合性
非直接 耦合
数据 耦合
特征 耦合
控制 耦合
强
模块独立性
组件引用
高
公共环 境耦合
内容 耦合
弱
提供者 端口
事件 信宿
使用者 端口
20
组件描述配置文件
21
组件集成配置文件
22
组件运行部署
组件目录 配置目录
数据目录
可执行文件目录 日志目录
脚本目录
节点自定义的配 置、数据、日志
节点可以是组件,或者分系 统,也可以是其它任何一个 集成概念。 架构优先加载节点自定义的 配置、数据、日志,如果不 存在,则加载通用的。
23
DSSignalProc
每一个DSHost进程叫做一个节点。GetNodeName函数获取节点名称。 节 点 名 由 命 令 行 参 数 “ -n ” 决 定 , 例 如 上 面 的 命 令 行 会 导 致 GetNodeName()”trk” , 若 命 令 行 中 不 指 定 该 参 数 , 则 默 认 返 回 “main”
25
内容
创建组件项目
26
创建组件项目
27
创建组件项目
删除Visual Studio的专用代码,保证代码可移植性。 Dllmain.cpp中的DllMain函数是Windows DLL必需的,不 要删除,但在其它平台上不编译此文件
28
配置组件项目
设置包含路径为<DSLIB>\LibDS;<DSLIB>\LibDSTL; 禁用预编译头 本例中<DSLIB>= ..\DS,为相对路径
组件集成
应用集成
脚本管理
部署管理
中 间
数据总线(DDS)
服务总线(SBS)
件
数据库访问
软
件
操作系统
环
境
数据库管理系统
防病毒软件
数据记录服务 驱动程序
组件监控 …… ……
硬
处理器(X86、PowerPC、龙芯、申微)
件
设 施
图形处理器(ATI、Nvida)
通信(RapidIO、RS232、RS422、以太网) 内、外存储(文件、数据库)
实现模块接口
使用GUID生成器 生成唯一编号
按需要重写IModule 的接口函数
使用IMPL_DEFAULT_MODULE宏自动生成 GetModuleEntry入口函数,宏参数就是自己的模块类
32
实现接口
33
继承DSTL提供的 Thread类
线程接口实现
重写Execute虚函数
34
数据收发实现
3.打开 1.注册
3.打开
组件通信服务 通信提供者
DDS:DDS工厂指针 UDP:UDP工厂指针
组件通信表
TRK, DDSRecv, owstrk TRK, 320, DSP, UDPSend
4.使用 4.使用
TRK组件
Recv(); Send(320, &track, sizeof(track));
系统调用 平台抽象
通讯协议
系
操作系统层
统
硬件抽象层
层
硬件抽象
硬 件
CPU
层
GPU
DSP
硬件平台
FPGA
8
8/23
百度文库
三只队伍并行研究
9
开放式软件体系结构——当前设计
坐标变换
B显
A显
P显
相关处理
滤波处理
点迹处理
组件库
数据记录
时间 管理
应
用
任务管理 数据处理
波束控制 显控处理 监控处理 干扰侦察
……
层
集 成 数据集成 框 架
调用阶段
初始期 运行期 结束期
15
函数 GetArgument
GetNodeName GetNodeID RegisterService
UnregisterService
IServiceManager接口说明
功能说明 获取命令行参数。假设命令行为:DSHost --help -n trk -id=23,则 GetArgument(“--help”) ”true” GetArgument(“-n”) ”trk” GetArgument(“-id”) ”23” GetArgument(“trk”) NULL 对于命令行中没有指定的参数一律返回NULL
组件线程
void MyThread::Execute() {
while(!NeedStop()) {
// 组件处理 } }
void ProcessMessage() {
// 异步消息处理 }
架构进程的主线程 调用组件接口
31
组件创建的线程 执行组件处理
通信服务的处理线程 进行消息处理
继承DSTL提供的 IModule类
14
« i n te rfa ce » ModuleHelper
+ GetReceiveIDGroup(): list<int> + GetSendIDGroup(): list<int> + GetVersion(): string + PrintHelp(): void
« i n te rfa ce » IServ iceManager
基本接口
« i n te rfa ce » IModule
+ CleanUp(IServiceManager *): void + Finalize(IServiceManager *): void + GetHelper(): IModuleHelper * + GetName(): const char * + GetUID(): UID + Initialize(IServiceManager *): boolean + Load(IServiceManager *): void + Prepare(IServiceManager *): boolean + Release(IServiceManger *): void + Start(IServiceManager *): boolean + Stop(IServiceManager *): boolean
运行期
12
接口
服务
13
组件设计:接口及服务
基本接口 扩展接口 自定义接口
IModule IModuleHelper
IQueriable IServiceManager
IThread ITimer
...
用户自定义
基本服务 扩展服务 自定义服务
ICommServer IProtocol
IConfigure IScript ...
2.加载
TRK, 320, DSP:UDP …… OWS, 430, TRK: DDS, owstrk
一致的通信,确保组件的独立
18
组件数据的发送、接收
基本服务
19
自定义服务
提供者组件 其他服务
RegisterService()
组件管理器
IModuleManager
服务注册表 组件通信服务 参数配置服务
DS
DS
组件化系统的运行模式
DSTracker
DSDisplay
DS
DS
外部网络
多线程、多进程任意组合 自主选举主进程负责本机器的内外通信 主进程异常退出后自动重新选举 主进程可以在业务进程中选择,也可以开启独立程序,
由业务进程的配置决定
24
相关背景介绍 组件 开放式体系架构 组件设计 实例介绍