C++框架介绍.pdf

上传人:tbuqq 文档编号:4764705 上传时间:2019-12-10 格式:PDF 页数:7 大小:341.46KB
返回 下载 相关 举报
C++框架介绍.pdf_第1页
第1页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C++框架介绍.pdf》由会员分享,可在线阅读,更多相关《C++框架介绍.pdf(7页珍藏版)》请在三一文库上搜索。

1、摘要: 框架作为一种大粒度的重用技术在桌面软件开发中得到了广泛应用,而在嵌入 式开发领域, 目前还没有一套完整的标准框架可供使用。本文以通信领域的嵌入式软件开发 为例,介绍使用C+ 语言,在ARM 平台 Nucleus plus操作系统下实现嵌入式开发框架EFC 的方法和应用实例。 关键词:框架 C+ ARM Nucleus MFC EFC 面向对象 1 框架概述 1.1 什么是框架 国外著名的软件设计大师Ralph Johnson对面向对象技术进行了长期而深入的研究。 在他的主页中,对框架进行了如下定义:A framework is a reusable design expressed a

2、s a set of abstract classes and the way their instances collaborate.It is a re usable design for all or part of a software system.(框架是整个系统或系统的一部 分的可重用性设计,由一组抽象出来的类及其实例间的相互作用方式组成。) 框架把一个系统有机地分解成一组相对独立的构件,并定义了各个构件间的接口和作 用关系, 符合软件工程中设计的模块化、独立化和信息隐藏等特征。框架提供了一个大粒度 的重用技术, 即不仅支持源代码级的重用,而且支持分析和设计以及体系结构的重用,因

3、而 被认为是一种最有前途的面向对象技术。 框架必须是健壮的、可扩展的、灵活的,它要求基于开放或共享标准。框架的设计要 力求做到完备性、灵活性、可扩展性、可理解性,同时抽象能用于不同的场合;用户能轻松 地添加和修改功能,定制框架; 用户和框架的交互清晰,文档齐全。 框架设计的一个核心问 题就是发现可重用的设计和“热点” ,以保证框架具备充分的灵活性,使用户能在已有构件 的基础上生成应用程序,实现“零代码编写”的理想目标。 1.2 如何设计框架 目前框架的设计大都采用实践法。实践法是指从若干个具体的典型应用中,抽象出现 似点来构建框架;框架反过来又应用于不同的问题,并在解决不同问题的过程中得到更新

4、; 在框架的设计和实现的两步中,不断反复, 等到框架逐渐成熟时,需要修改和反复的内容就 会越来越小。 具体步骤为: 分析问题域, 确定所需框架,从一类应用而不是单个的程序去分 析、比较各种不同的软件解决方案,寻求这些方案的共性和每个程度的唯一性特性。这些共 性,尤其是那些经常被多个程序使用的部分将成为框架的基础。然后, 定义框架体系结构并 设计,包括设计用户与框架间的交互、给用户提供的最终工具等。 框架的实现:包括框架核心类的实现、框架的测试、框架的试运行、框架的反复更新。 框架的部署:包括文档的提供和分发过程、为用户提供技术支持、维护和更新框架。 2 嵌入式框架EFC 框架技术在桌面软件的开

5、发中得到了广泛的应用,但在嵌入式开发领域,由于嵌入式 开发的多样性及嵌入式操作系统的多样性,目前还没有一套完整的开发框架可供使用。因此, 在嵌入式软件开发中常常是从底层做起,应用程序和RTOS密不可分。这样的开发方式不但 效率不高,也不利于软件的移植。 EFC (Embedded Foundation Classes)即嵌入式基础类库,是笔者借鉴Microsoft公 司的 MFC (微软基础类库桌面系统框架库的工业标准)构建的一套在ARM 平台 Nucleus p lus 操作系统下的嵌入式开发框架。由于框架全部采用C+开发,没有和处理器相关的汇编 代码, 所以在其它硬件平台可不加修改地使用。

6、如果更换不同的操作系统,则需要修改操作 系统抽象层的部分代码;但由于 EFC提供给上层应用程序的接口不变,所以应用程序不需要 修改代码。 就软件的层次来说,EFC是一个操作系统之上、应用程序之下的中间件,如图1 所示。 在 EFC中有一个操作系统抽象层,对RTOS 进行了抽象和封装,提供包括任务(task )、 /O 驱动( driver)、定时器( timer )、信号量( semaphore)、消息队列( quecue)、事件( e vent group)、邮箱( mailBox )、管道( pipe )以及高级中断(HISR)等基本服务的封装。 为上层应用程序提供更高级的统一编程接口,它

7、样就使应用软件的开发与具体的软件平台无 关,解决了嵌入式应用软件的移植问题。 图 2 EFC 静态结构图 在图 1 中,各模块之间有交界表明模块之间有接口关系。EFC 、应用程序以及RTOS 都 和硬件驱动有接口:EFC要使用一部分核心驱动(例如实时时钟的驱动、ARM 串口和网口的 驱动、 I2C 总线的驱动等) ;应用程序中调用的驱动是针对具体设备的;RTOS所需要的驱动 就是系统的BSP部分。 EFC的静态结构图(类图)如图2 所示。类图是在UML (统一建模语言)中用类和它们 之间的关系描述系统的一种图示。类用类名、 类的属性以及操作来表示,在图中为简单起见, 省略了属性和操作;类与类之

8、间的关系使用不同的连线表示,图中带空心三角箭头的连线表 示继承关系, 两端带数字的连线表示关联关系。在类图中, 类的属性 / 方法的可见性使用 “+” 、 “- ”及“ #”表示:“ +”表示公共的(public),“ - ”表示私有的(private),“ #”表 示受保护的( protected)。 从图 2 中可以看出,CMessage 、CRTApp 、CDevice、Cboard 及 Cinterface都派生于公 共的类 CRTObject。CRTApp对象中有受保护的CMessage 、CEventLog、Cuser 及 CDevice 各 一个。 CDevice 对象中有一个或

9、多个CBoard 对象,相应的每个CBorad 对象中有 0 个到多个 CxxxInterace对象。 2.1 基本数据类型 构建一个框架,需要一些基本的元素,这些元素要在框架的构造以及应用程序开发中 大量使用。这些基本数据类型包括字符串类CString 、集合类CArray 、Clist及 Cmap 。CSt ring包括一个长度可变的字符序列,提供使用非常直观方便的运算符(例如 +, +=,=,=,! =)和一些Todouble()、Tolong() 、Tohex() 等); CArray 是具有内建索元素很快的检索速 度;Clist为其所存储的每一个元素,都提供了两个指针,分别指向位于其

10、前和其后的元素, 形成一个双向链表,这使得插入和删除操作十分快捷;CMap为其存储的每个数据都附带一 个关键字,并以关键字所组成的一个hash 表作为索引,从而使得元素搜索、增加和删除操 作都具有很高的效率。 2.2 RTOS 的抽象和封装 CRTObject 是一个 EFC中最基础的类,它不但是EFC中 CRTApp 、CDevice 等类的基类, 而且可以作为所有使用EFC的嵌入式开发人员定义新的类的超类。CRTObject 类在 EFC中主 要承担 RTOS抽象和封装任务。它提供了下面一些最基本的功能: *CRTObject 对 RTOS的常用对象进行了封装,提供包括Task、Drive

11、r 、Timer 、Event Group、Semaphore、Queue 、Pipe、Mailbox等的创建、删除、查找等功能的成员函数。这 些函数提供了一个简单有效的方法来使用RTOS的对象。使用这些函数能够保证对象创建与 销毁的安全性,而不会造成内存泄漏。 *CRTObject 提供了对RTTI(Run-Time Type Information,运行时类型信息)的支持, 在新的 C+标准中, RTTI 已经是 C+ 的一个功能,但并不是所有的编译器都提供支持这些新 特性, ADS1.2 就不支持。所以在这里参考MFC ,通过宏的方式为每个类定义一个CRuntimeC lass类型的静态

12、常量和相关的成员函数。CRuntimeClass 结构保证了类型的静态常量和相关 的成员函数。 CRuntimeClass 结构保存了类的名称、大小等信息,这样我们就能在程序运行 时确定对象的具体类型。 *CRTObject 还提供了把类的成员函数作为任务及定时器的回调函数的功能。在 Nucleu s 中,任务和定时器的回调函数只能是全局函数或者类的静态成员函数,这在面向对象的开 发中很不方便。这里通过把成员函数指针和对象的this指针作为参数传递给RTOS ,在 RTO S调用公共回调函数时再取出来。通过函数指针的方式去调用类的成员函数,这样把有派生 于 CRTObject 的类就可方便地使

13、用成员函数作为任务、定时器等对象的回调函数。 2.3 应用程序类CRTApp CRTApp类用来定义整个应用程序对象,提供系统初始化、管理其它对象以及运行应用 程序的功能。任何使用EFC框架的应用程序有且只能有一个派生于此类的对象。CRTApp对 象中包含了动态创建的CMessage 、CEventLog、CDevice 及 Cuser 对象。 通过在 Nucleus 的入口函数Application_Initialize中创建系统初始化任务(回调函 数为 CRTApp类的成员函数InitTask),来把系统控制权交给CRTApp对象,在其中完成其 它对象的创建、系统的配置以及初始化任务。 2

14、.4 文件系统 在嵌入式设备中通常使用Flash 存储器来保存程序代码和数据,每片Flash 一般由一 定数量大小不等的扇区组成。它在读取方面与普通RAM 存储器类似,可以实现随机的读取, 但在写入操作上却有很大的不同。Flash 中只有空白的单元才可以进行写入操作,要向非空 的单元写入数据, 需要先擦除整个扇区。 所以程序中如果直接对Flash 进行操作会很不方便。 最好的办法就是在其上构造一个文件系统,文件系统提供简便、可靠的接口供上层使用,而 把复杂的操作屏蔽在文件系统内部。 这里文件系统包括内存文件系统和Flash 文件系统。 CFile 是一个抽象类, 只是定义文 件系统的接口函数(

15、例如Open 、Read、Write 、Seek、GetLength 、Close 等),具体的实现 在 CMemFile(内存文件)及CFlashFile( Flash 文件)类中完成。 2.5 设备管理 在 EFC中,设备管理由CDevice、CBoard、CInterface及其派生类完成。CDevice 类代 表整个设备, 1 个设备中包含1 到多个 CBoard对象,而每个CBoard 对象中又包含0 个到多 个接口对象( CInterface类的派生类对象)。这样以来,嵌入式设备(仅限通信领域)都 可由这几个类组合而成,大大简化了软件的设计。 2.6 命令处理 CMessage类是

16、系统的命令处理模块,它直接派生于CRTObject 类。它的功能主要是接 收网管软件通过串口或网口发送未来的各种命令,完成对设备的配置管理、性能管理、 告警 管理、安全管理和维护管理等管理功能。CMessage类主要有表1 所列的任务。 表 1 CMessage 类中的任务 任务名称任务处理函数说 明 TCP 服务器监听任务 TCPServerTask 用于监听客户端 的连接请求 TCP 响应任务 TCPEchoTask 对每客户端的连接都创建一响应任务串口任务 U artTask 通过串口对系统进行管理 TFTP 备分份任务 TFTPClientPutTask 备份应用程序和 系统配置文件

17、TFTP 升级任务 TFTPClientGetTask 用于升级应用程序及修改用户配置文件 2.7 其它模块 CFlash 类封装对Flash 芯片的操作, 主要包括读、 写、擦除等操作。 从图 2 可以看出, CEventLog 和 CFlashFile类中都包含CFlash 对象; CEventLog 类记录系统中的发生的事件 以及系统运行过程中产生的告警信息。为了实现掉电保存功能,这些事件都保存在Flash 芯片中; Cuser 类用来对系统的用户进行管理,防止对系统非授权的访问。 3 使用 EFC的设计方案举例 这里以在通信和工业自动化领域使用较多的串口服务器为例,来说明使用FEC嵌入

18、式 开发框架的设计方案。串口服务器是一种可把多路异步RS232/RS485串行数据与通过以太网 口传送的TCP/IP 数据包进行相互转换,使传统的异步串行数据信息能通过Internet或 Int ranet传送或共享的设备。 设每个串口对应TCP/IP 的一个端口,则可画出图3 所示的静态结构图(图中SerSvr 是 Server 的简写)。 从图 3 可以看出, 共对五个类进行了派生。CSerSvrMessage 类派生于CMessage类,用 于通过网管对串口服务器进行管理(这里具体命令略);CserSvrDevice类派生于CDevice 类,代表串口服务器设备;CserSvrDevic

19、e类对象中有一个或多个派生于CBoard 类的 Cser SvrBoard 类对象, 而每个 CserSvrBoard类对象拥有一个或多个派生于CasyInterface类的 CSerSvrInterface类对象; ScerSvrApp 类派生于CRTApp类,代表整个应用程序,并重载了 虚函数 OnCreateMessage() 及 OnCreateDevice (),用来在其中创建系统的CSerSvrMessag e 和 CserSvrDevice类的实例来代替系统默认的CMessage和 CDevice 实例。 图 3 串口服务器系统软件静态结构图 串口类 CSerSvrInterfa

20、ce的设计是整个设计的关键,在每个串口类中都有一个TCP监 听任务 TCPServerTask 用来作为服务器去监听客户端的连接;一个 TCP客户端任务TCPClie ntTask 用来连接其它服务器。无论是通过TCPServerTask 还是 TCPClientTask建立连接后, 就挂起这两个任务而启动另外两个任务TCPSendTask和 TCPRecvTask, 它们分别用来通过网 口发送数据和接收数据。TCPSendTask每隔 10ms (对波特率为115.2K 的情况, 10ms最多收 到的字节数为115200/( 8+2)/1000*10=115.2字节, 所以串口的FIFO 应

21、大于 116 字节) 把 从串口读到的数据打包从网口发送出去;而 TCPTecvTask 使用阻塞方式读取网口数据。在读 到数据后, 根据串口发送缓冲区的情况慢慢通过串口往外发送,没发送完之前就不进行下一 次从网口的数据读取。这样把串口类设计成一个完备的处理类,设备中每块板有多少串口就 在 CSerSvrBoard 类的实例中有多少CSerSvrInterface类的实例。硬件模块化的结构简单地 对应软件模块化的结构。 结语 本文讲述了在嵌入式软件开发中使用C+ 构建系统开发框架的方法,并给出了框架的模 型和应用实例。 可以看出, 使用面向对象的框架技术对于提高开发效率、降低开发难度、 规 范开发模式、便于软件的移植和维护方面,具有传统面向过程的开发方法不可比拟的优势。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1