1 引言。
从系统的观点来看,嵌入式实时系统也是系统,特别是硬件技术的快速发展,嵌入式实时软件也有快速适应硬件型号升级问题,也有业务快速变更要求以及可伸缩、可修改、可复用等方面的问题。但面向对象技术对于实时性、可靠性的描述并不适合,在嵌入式实时应用中依然不是主流设计方法,从而引入了模式的概念。
最早也是最基础的设计模式是liskov提出的七种基本模式,并提出对象构成模式的五条基本准则[1-4],为面向对象设计模式奠定了理论基础。gamma等四人提出了常用的25种设计模式[5],为用模式设计软件体系结构提供了工程实践的基础。不过gamma的模式作用域是局部的,只在单个的协作内。
bruce douglas将两个重要的软件工程进展--模式和uml相结合,成功地应用在主流实时软件传统使用的概念和技术中[6]。
本文讨论的模式ertsdp是基于bruce douglass的实时设计模式基础之上,对典型嵌入式实时系统的设计解决方案加以总结抽象,提出的一套完整的设计思路。这一模式的提出可以促使本领域软件开发速度成倍的提高,更为重要的是软件质量也可以得到保证。
2嵌入式实时系统设计模式(ertsdp)研究。
2.1 设计模式的定义。
设计模式[7-9]是对经常出现问题的泛解。模式由三个重要的方面组成:第一是问题(problem),这是要以模式来处理的设计的某个方面的陈述,也就是要用模式解决的某些优化和qos的侧面。
第二是解决方案(solution),也就是模式本身,模式用指明了角色的结构图表示。最后是结果(consequences)。
2.2 ertsdp (embedded real-time systems design pattern)
1.目的。针对嵌入式实时系统分析和设计过程中的问题进行抽象并建立模型,使得新系统可以通过模式匹配、实例化等手段快速建立,从而达到缩短嵌入式实时产品开发周期的目的。
2.解。解即模式本身,2.3小节将详细讨论。
3.结果。结果是使用模式后的一组利弊,将在本文最后讨论。
2.3 模式的解。
2.3.1 系统分析。
分析的目的是定义待开发系统的基本性质。一般来说,分析是一个黑箱视图,而设计则按某个服务质量qos的要求提供充分的功能。对系统的分析又可分为两个阶段:需求分析阶段和系统工程阶段。
(1)需求分析阶段。
在需求阶段尽可能详细地标识和捕获当前原型的需求,可用顺序图、状态图、活**、正文描述以及约束等的组合对需求加以描述。
(2)系统工程阶段。
系统工程阶段实际是做高层的体系结构设计。系统工程阶段主要定义子系统的体系结构、子系统的接口及交互协议、将系统的用例和需求分解为子系统的用例和需求以及对系统的算法分析和控制法则规范说明。
2.3.2 系统设计。
设计就是该问题的具体解决方案,是对分析模型的优化。优化准则的集合就是要求的系统服务质量qos。如果把每个qos方面看作是独立的特征并具有相对重要性的加权因子,那么一个好的设计就是找出下面公式的最小值。
min [σqosfeaturej * weightj ]
其中weightj指的是与第j个qosfeature相关的相对重要性。对系统的设计也分为两个阶段:体系结构设计阶段和详细设计阶段。
(1)体系结构设计阶段。
体系结构包括逻辑体系结构和物理体系结构。逻辑体系结构只涉及模型本身如何组织,这种组织可简可繁,取决于小组需要用它构造什么;物理体系结构指的是组织存在于运行时的事物。这一阶段用五层体系结构视图、子系统视图和资源并发视图等来描述。
五层体系结构视图[6]是一个特定的体系结构,作用于许多嵌入式和实时系统的通用结构。它包含五个域:应用域(application domain)、用户界面域(user interface domain)、通信域(communication domain)、抽象操作系统域(abstract os domain)和抽象硬件域(abstract hardware domain)。
子系统视图是表示重要子系统的类图,多用于对系统进行细化时。
资源并发视图是实时和嵌入式系统一个最突出的特点。一个有资源服务的元素,它的有效性由一个或多个服务质量(qos)特性来定义。qos是资源的量化性质,如容量、执行速度、可靠性等等。
(2)详细设计阶段。
详细设计阶段是对对象和类的内部精细加工,它只限制在单个对象和类之中。详细设计时,多数优化都集中在数据构造、算法分解、对象状态机的优化、对象实现策略、关联的实现以及可见性和封装问题等方面。
模式是对设计中一般问题的抽象,所以针对具体应用的模式匹配以及实例化是可根据需要对ertsdp变动的。譬如,需求分析阶段可以根据问题的复杂性对描述手段任意组合;系统工程阶段也是微周期中的可选部分;如果系统非常复杂,可以递归调用子系统视图对系统分解、分级细化;还可在体系结构设计时增加activity图实现对任务的划分,增加sequence图对系统运行流程描述。
总之,在具体应用中可以灵活的应用模式来辅助设计。下面通过对常见的嵌入式实时系统--远程监控系统应用ertsdp模式进行分析和设计,阐述了实例化模式的方法,同时也是对这一模式的讨论和验证。
3 基于ertsdp的远程监控系统。
3.1 系统需求分析。
远程监控系统现在已经深透到社会的各个方面,简而言之,远程监控系统就是将现场设备的运行数据发送至远端加以监测和控制。本系统投入运行后预期的用户有三类:普通用户、系统管理员、故障专家。
他们具有不同的职责,因而赋予了不同的权限。图1的use case框图可以清晰地反映出他们各自的权限职责。
图1 远程监控系统的use case框图。
3.2 系统体系结构设计。
本系统包含三个子系统--netweb、netio和remoteclient(见图2)。netweb是整个系统的核心,承担着实时/历史数据管理、报警条件检测,存贮用户组态信息等功能;netio用于实现现场数据的采集(输入)和装置的控制(输出);remoteclient则实现了客户端图形用户界面的功能。其中netweb和netio通过rs485总线进行通讯,netweb 和remoteclient则通过socket进行信息交换。
netweb运行在嵌入式开发板上,操作系统是自主研发的嵌入式实时linux,采用的方案设计是uclinux+rtai。
图2 远程监控系统的五层体系结构视图。
3.3 子系统视图。
子系统视图是表示重要子系统的类图,多用于对系统进行细化时。图3是细化后的netweb子系统,从图中可以看到,特殊的双内核os--uclinx+rtai决定了netweb模块分为实时应用和非实时应用。下面将从初始化和运行两方面对图3详细解释。
图3 netweb模块的子系统视图。
3.3.1 netweb子系统初始化。
netweb子系统初始化过程主要由kernelinit模块和userinit模块(图中灰色的模块)实现。首先kernelinit模块执行,完成内核空间的初始化任务;然后启动userinit模块,这个过程比较复杂,首先store模块将系统存储的配置信息和数据信息传给userinit模块(标注所示),然后kernelinit模块驱动485driver模块实时采集当前模块的信息,传送给userinit模块(标注、所示),userinit模块经过两者信息的比较,确定采集的对象,以及模块信息的变更、系统状态的变更等,最终完成初始化工作。
3.3.2 netweb子系统运行流程。
当系统完成初始化开始运行后,gather模块调用485driver模块相关接口api对底层32个netio模块进行轮询式采集,采集上来的数据经过过滤整合后,正常的数据传送至transfer模块,这时调用rtai内核中的rt_shm模块实现内核和用户空间大规模数据的共享(见标注)。receive模块从rt_shm接受到数据,送到store模块存储,然后根据用户要求送到socket模块传到远程客户端。如果过滤整合时发现数据异常,就驱动alarmkernel模块,这个模块启动rtai的rt_fifo模块,将需报警数据通过管道(见标注)传送至用户空间的alarmuser模块。
alarmuser模块再驱动email模块以邮件的形式完成报警。
3.4 资源并发视图。
本系统中任务间资源共享的方式主要有两种:共享内存和消息队列。图4和图5分别对这两种资源共享方式采用并发视图进行了分析。
图4 共享内存访问并发视图。
共享内存对于大规模的数据共享非常适用,这里讨论的是rtai提供的实时shm。rt_shm并没有提供任何互斥机制来控制实时进程和非实时进程访问同步性(对于实时任务或非实时任务之间的共享有保护措施,故不再考虑),虽然可以自己实现一些lock机制来控制,但是考虑到内核任务的优先级远高于用户任务,即实时任务从来不会被非实时任务中断,所以实时任务对共享区写数据时永远是一次性写完所有模块信息,而且这些数据的时间戳是一致的,可以保证数据的正确性(如图4);而非实时任务读共享数据时是可能发生过程中被中断的情况,导致可能一次读取的模块数据的时间戳不一致。但实际中写进程的速度远远大于读进程的速度,同时考虑到实际运行时模块数据变化是连续的,同一模块不同时间戳采集的数据变化率不会很大,而现阶段读进程只要满足用户需要的刷新频率(qos)就足够了,所以对于数据部分丢失现阶段并不可惜。
图5 消息队列访问并发视图。
消息队列提供了一种传输多条消息的机制。如图5所示,sender线程因响应evrun事件而运行。sender类调用rqueue::
insert()操作,并锁定信号灯。在rqueue::insert()操作过程中,该线程被更高优先级的receiver线程中断。
receiver试图检查在其队列中新加入的消息。它调用rqueue::remove(),同时试图锁定信号灯。
如果失败,receiver自动挂起或被阻塞,因为信号灯已经被锁定到sender线程,这使得sender线程继续工作,完成store()操作。一旦完成,rqueue类释放它的信号灯。它将解除对receiver线程的阻塞,receiver线程这时可以锁定信号灯,读取等待在队列中的消息,解除信号灯的锁定,处理收到的消息。
嵌入式实时系统设计综述
研究生课程考试答题册。学号 2015261620 姓名王嘉豪。考试课目嵌入式实时系统设计 考试日期 2016年1月20日 西北工业大学研究生院。目录。一 设计目的 2 二 设计要求 2 2.1设计指标 2 2.2设计方法 2 2.3设计流程 3 三 系统设计 3 3.1参数设计 3 3.2拓扑选择 ...
嵌入式实时系统
实时系统 real time operating system,rtos 的正确性不仅依耐系统计算的逻辑结果,还依赖于产生这个结果的时间。实时系统能够在指定或者确定的时间内完成系统功能和外部或内部 同步或异步时间做出响应的系统。因此实时系统应该在事先先定义的时间范围内识别和处理离散事件的能力 系统能...
基于嵌入式系统键盘设计
课程名称 基于嵌入式系统键盘设计。专业班级。姓名。学号。批阅时间。指导教师成绩。在arm嵌入式应用中,人机交互对话最通用的方法就是通过键盘和lcd显示进行的,本设计是通过键盘向系统发送各种指令或置入必要的数据信息。键盘模块设计的好坏,直接关系到系统的可靠性和稳定性。1实例说明。在arm应用系统中,键...