系统架构设计

系统架构功能需求html

根据目前智能仪表的行业需求,智能仪表须要实现设备管理、人机交互、数据上传等功能,按照功能模块化划分,具体系统功能组件如图1-1所示。程序员

图1-1 智能仪表系统功能组件图算法

1.2   系统架构的分层设计网络

早在1979年,国际标准化组织ISO下设的一个专门委员会为制定“开放系统互联”(OSI)的有关标准,提出了基于功能分层概念的网络结构七层模型-开放系统互连参考模型(OSI/RM)。尽管OSI/RM是为网络中系统互连所创建的,可是其分层的设计思想彻底能够为智能仪表嵌入式系统架构的设计所借鉴[5]架构

根据工业自动化行业智能仪表的功能需求,将代码进行分层设计,为用户(嵌入式应用层工程师)提供设备管理接口集、数据上传接口集、人机交互接口集、历史数据管理接口集、传感器参数管理接口集、传感器实时数据采集及周边外设数据采集接口集、设备功能模块电源管理接口集、通信协议接口集、校验算法接口集及滤波算法接口集,同时提供数据类型及错误码组件,以缩短产品开发时间、提升产品开发效率和质量。如图1-2所示,将整个系统由硬件层、硬件驱动层、硬件抽象层,应用支持子层、仪表组函数库、事件驱动核心、应用层共计7个部分组成。每一层中,又能够分为多个独立的模块,这些模块之间耦合较少,共同为上层提供服务。模块化

    图1-2 嵌入式系统架构分层图函数

2       系统各层的工做原理分析与设计

由系统分层的设计思想可知,系统中每层都对下一层进行了封装,所以在代码执行过程当中须要逐级调用,而不能隔层调用。具体各层间的调用流程如2-1所示。编码

随着仪表硬件模块化和接口标准化的落实,为软件分层模块化设计奠基了基础。根据仪表功能需求,硬件层分为主控模块、传感器模块、HMI模块及通信模块等基本单元。spa

图2-1 系统各层间调用流程图架构设计

2.1   硬件抽象层(HAL)

2.1.1 硬件抽象层工做原理

硬件抽象层(HAL)完成了对硬件模块接口的进一步封装,其中包括MCU内部总线类设备及MCU外部设备,硬件抽象层(HAL)做为BSP的上一层,及应用支持子层的下一层,是整个系统架构很是关键的一层,HAL实现了对底层设备的封装,为应用支持子层及系统架构中其它功能模块提供统一的接口。为实现该功能及代码的通用性,须要对每个软硬件模块进行惟一编码,经过设备编码实现对不一样设备的区别,根据设备编码经过回调函数的动态映射实现同一设备不一样的操做。

根据仪表的特征,能够将对设备的操做抽象成一些子操做接口,将这些子操做统一到一个结构中去来实现对上层接口的统一。如对常规设备的操做能够抽象成打开、读、写、休眠、诊断、关闭6个子操做接口,硬件抽象层常规设备接口设计如图2-2所示,在编写设备抽象层代码时,必须将BSP层接口抽象出以上6种接口供应用支持子层及其它功能模块使用,设备操做结构设计以下:

Struct Hal_Dev{.DEV_CODE,.read,.write,.open,.close,.diagnostic,.sleep}

图2-2 硬件抽象层常规设备结构接口设计图

在实际编写硬件抽象层驱动式,可经过open函数来挂载不一样的操做接口。例如应用支持子层若是须要对硬件抽象层传感器模块中的某一子设备进行操做时,首先将该子设备的编码(设备编码是全局惟一的)传入open函数,open函数则根据惟一编码查找到该设备的操做接口并将其地址赋值给结构中的接口。

2.1.2 硬件抽象层中断处理接口

为及时响应用户需求,硬件抽象层可对红外接口、通信模块接口提供了中断处理机制,涉及中断处理的模块有红外通信模块、本地通信模块及远程通讯模块等。在本次系统架构设计中,中断只有定时器中断和UART数据接收中断两种,定时器中断用于驱动事件运转,UART中断发生时用于搬运UART缓冲区中的数据至数据区。RTC中断触发时和UART中断触发时的事件流程图分别如图2-三、2-4所示。

图2-3  RTC中断触发时事件流程图

                        

图2-4 UART中断触发时事件流程图

2.2   应用支持子层

应用支持子层是整个系统的第二枢纽,应用支持子层提供了设备硬件抽象层与应用层之间及仪表组函数库之间的链接,在层级职能上该层对硬件抽象作了进一步的封装,以便于应用层封装事件操做接口时调用,主要由传感器操做相关操做接口、数据存取相关操做接口、数据展现相关操做接口及数据传输相关操做接口组成。与仪表组函数库提供的接口相比,该层级接口偏重于硬件接口封装,它做为一个桥梁创建了系统其它功能组件与事件驱动核心之间的联系,为应用层和事件驱动核心提供更加易于使用的设备接口。

以传感器模块接口为例。整个系统运转过程当中,传感器操做是最频繁的一个任务,整个系统基本上是围绕着传感器进行的,根据硬件模块化设计的方案能够肯定传感器的操做涉及到实时数据读取、传感器信息读取、传感器诊断共计3个方面,对于MCU来说实际上是对SPI接口的一些读写操做,而这些读写基本操做在HAL中已经实现,本处须要设计一个接口,用来封装对传感器实时数据读取、传感器信息读取、工况诊断等操做,如图2-5所示。

图2-5 传感器模块应用支持子层接口

2.3   仪表函数库

仪表函数库实现了对仪表类产品软件模块的封装,主要包含通信协议模块、文件系统、设备管理模块、算法模块、智能电源管理模块等,同时包含C语言部分标准函数,该套系统架构支持标准C函数库中的输入、输出函数及数学函数。仪表函数库的架构如图2-6所示。

图2-6 仪表代码库建设架构图

经过代码库建设,能够统一代码规范,统一经常使用函数接口,并避免重用性,提升嵌入式软件工程师的效率。

2.4   应用层

不一样的设备有不一样的应用场景,相同的设备又有不一样的应用需求,如何系统架构的统一,尽可能将程序员的工做量集中在实际问题处理上,而不是整个系统上?这要依赖于应用层的设计,应用层将实例化出人机交互事件、设备远程管理事件、数据上传事件、数据展现事件、实时数据采集事件、外部设备数据采集事件及历史数据存取事件等操做接口。在事件驱动中心中将执行上述事件处理函数,应用层及各层之间的关系如图2-7所示。如传感器数据上传事件,该事件工做主要粉两个方面,一是被动上传,即上位机有需求时启动上传,这种方式主要是应用于总分架构的总线中;另外一方面是主动上传,这要根据具体的通信协议,如A11通信协议。同时在该事件中完成数据的合包与发送,该事件将调用通信协议接口及通信模块数据发送接口。

图2-7 应用层与各层之间的关系图

2.5   事件驱动核心

事件驱动核心的主要功能是仲裁系统中各个任务的前后顺序。事件驱动核心的“心跳”在硬件抽象层完成,经过RTC时钟滴答进行判断或触发事件,设计这一部分目的是让应用层工程师专一于用户需求,由于大多数状况下,事件驱动核心及相关子层的设计是整个系统的核心任务,能够经过按期的维护和更新这个“内核”对产品进行升级。事件驱动核心与各层之间的关系如图2-8所示。

图2-8 事件驱动核心与各层之间的关系图

基于事件间的驱动接口可采用结构Event进行封装,该结构包含了当前事件和上一事件的信息,同时能够在事件之间传输数据指针,以下所示:

Struct Event{

CurrentEvent,

.PreEvent,

Pdata

}

3        结束语

本文介绍的分层设计、逐级调用的代码架构设计方法已经在新一代的智能仪表中使用,并取得了明显的效果。在智能仪表的软件代码设计中,利用这种分层的系统架构设计有以下优势:

(1)提升软件质量,缩短产品的开发周期。在仪表开发期,统一的函数接口和经常使用算法的统一管理,大大提升代码的可重用性,避免重复开发,从而进一步提高开发人员利用率,减小嵌入式代码工程师的工做量,缩短了产品的开发时间。

(2)简化设备后期的升级维护。在仪表维护期,清晰的程序结构和统一的接口可有效避免潜伏的BUG,提升产品的稳定性;在更改层的具体实现代码时,只要函数接口保持稳定,则没必要修改其它函数,大大简化产品的升级维护工做。