使用C++构建嵌入式开发框架
摘要框架作为一种大粒度的重用技术在桌面软件开发中得到了广泛应用,而在嵌入式开发领域,目前还没有一套完整的标准框架可供使用。
本文以通信领域的嵌入式软件开发为例,介绍使用++语言,在平台操作系统下实现嵌入式开发框架的方法和应用实例。
关键词框架++面向对象
1框架概述
11什么是框架
国外著名的软件设计大师对面向对象技术进行了长期而深入的研究。
在他的主页中,对框架进行了如下定义框架是整个系统或系统的一部分的可重用性设计,由一组抽象出来的类及其实例间的相互作用方式组成。
框架把一个系统有机地分解成一组相对独立的构件,并定义了各个构件间的接口和作用关系,符合软件工程中设计的模块化、独立化和信息隐藏等特征。
框架提供了一个大粒度的重用技术,即不仅支持源代码级的重用,而且支持分析和设计以及体系结构的重用,因而被认为是一种最有前途的面向对象技术。
本文以通信领域的嵌入式软件开发为例,介绍使用++语言,在平台操作系统下实现嵌入式开发框架的方法和应用实例。
关键词框架++面向对象
1框架概述
11什么是框架
国外著名的软件设计大师对面向对象技术进行了长期而深入的研究。
在他的主页中,对框架进行了如下定义框架是整个系统或系统的一部分的可重用性设计,由一组抽象出来的类及其实例间的相互作用方式组成。
框架把一个系统有机地分解成一组相对独立的构件,并定义了各个构件间的接口和作用关系,符合软件工程中设计的模块化、独立化和信息隐藏等特征。
框架提供了一个大粒度的重用技术,即不仅支持源代码级的重用,而且支持分析和设计以及体系结构的重用,因而被认为是一种最有前途的面向对象技术。
框架必须是健壮的、可扩展的、灵活的,它要求基于开放或共享标准。
框架的设计要力求做到完备性、灵活性、可扩展性、可理解性,同时抽象能用于不同的场合;用户能轻松地添加和修改功能,定制框架;用户和框架的交互清晰,文档齐全。
框架设计的一个核心问题就是发现可重用的设计和热点,以保证框架具备充分的灵活性,使用户能在已有构件的基础上生成应用程序,实现零代码编写的理想目标。
12如何设计框架
目前框架的设计大都采用实践法。
实践法是指从若干个具体的典型应用中,抽象出现似点来构建框架;框架反过来又应用于不同的问题,并在解决不同问题的过程中得到更新;在框架的设计和实现的两步中,不断反复,等到框架逐渐成熟时,需要修改和反复的内容就会越来越小。
具体步骤为分析问题域,确定所需框架,从一类应用而不是单个的程序去分析、比较各种不同的软件解决方案,寻求这些方案的共性和每个程度的唯一性特性。
这些共性,尤其是那些经常被多个程序使用的部分将成为框架的基础。
然后,定义框架体系结构并设计,包括设计用户与框架间的交互、给用户提供的最终工具等。
框架的设计要力求做到完备性、灵活性、可扩展性、可理解性,同时抽象能用于不同的场合;用户能轻松地添加和修改功能,定制框架;用户和框架的交互清晰,文档齐全。
框架设计的一个核心问题就是发现可重用的设计和热点,以保证框架具备充分的灵活性,使用户能在已有构件的基础上生成应用程序,实现零代码编写的理想目标。
12如何设计框架
目前框架的设计大都采用实践法。
实践法是指从若干个具体的典型应用中,抽象出现似点来构建框架;框架反过来又应用于不同的问题,并在解决不同问题的过程中得到更新;在框架的设计和实现的两步中,不断反复,等到框架逐渐成熟时,需要修改和反复的内容就会越来越小。
具体步骤为分析问题域,确定所需框架,从一类应用而不是单个的程序去分析、比较各种不同的软件解决方案,寻求这些方案的共性和每个程度的唯一性特性。
这些共性,尤其是那些经常被多个程序使用的部分将成为框架的基础。
然后,定义框架体系结构并设计,包括设计用户与框架间的交互、给用户提供的最终工具等。
框架的实现包括框架核心类的实现、框架的测试、框架的试运行、框架的反复更新。
框架的部署包括文档的提供和分发过程、为用户提供技术支持、维护和更新框架。
2嵌入式框架
框架技术在桌面软件的开发中得到了广泛的应用,但在嵌入式开发领域,由于嵌入式开发的多样性及嵌入式操作系统的多样性,目前还没有一套完整的开发框架可供使用。
因此,在嵌入式软件开发中常常是从底层做起,应用程序和密不可分。
这样的开发方式不但效率不高,也不利于软件的移植。
即嵌入式基础类库,是笔者借鉴公司的微软基础类库—桌面系统框架库的工业标准构建的一套在平台操作系统下的嵌入式开发框架。
由于框架全部采用++开发,没有和处理器相关的汇编代码,所以在其它硬件平台可不加修改地使用。
如果更换不同的操作系统,则需要修改操作系统抽象层的部分代码;但由于提供给上层应用程序的接口不变,所以应用程序不需要修改代码。
图2静态结构图
就软件的层次来说,是一个操作系统之上、应用程序之下的中间件,如图1所示。
框架的部署包括文档的提供和分发过程、为用户提供技术支持、维护和更新框架。
2嵌入式框架
框架技术在桌面软件的开发中得到了广泛的应用,但在嵌入式开发领域,由于嵌入式开发的多样性及嵌入式操作系统的多样性,目前还没有一套完整的开发框架可供使用。
因此,在嵌入式软件开发中常常是从底层做起,应用程序和密不可分。
这样的开发方式不但效率不高,也不利于软件的移植。
即嵌入式基础类库,是笔者借鉴公司的微软基础类库—桌面系统框架库的工业标准构建的一套在平台操作系统下的嵌入式开发框架。
由于框架全部采用++开发,没有和处理器相关的汇编代码,所以在其它硬件平台可不加修改地使用。
如果更换不同的操作系统,则需要修改操作系统抽象层的部分代码;但由于提供给上层应用程序的接口不变,所以应用程序不需要修改代码。
图2静态结构图
就软件的层次来说,是一个操作系统之上、应用程序之下的中间件,如图1所示。
在中有一个操作系统抽象层,对进行了抽象和封装,提供包括任务、驱动、定时器、信号量、消息队列、事件、邮箱、管道以及高级中断等基本服务的封装。
为上层应用程序提供更高级的统一编程接口,它样就使应用软件的开发与具体的软件平台无关,解决了嵌入式应用软件的移植问题。
在图1中,各模块之间有交界表明模块之间有接口关系。
、
应用程序以及都和硬件驱动有接口要使用一部分核心驱动例如实时时钟的驱动、串口和网口的驱动、2总线的驱动等;应用程序中调用的驱动是针对具体设备的;所需要的驱动就是系统的部分。
的静态结构图类图如图2所示。嵌入式系统开发是什么
类图是在统一建模语言中用类和它们之间的关系描述系统的一种图示。
类用类名、类的属性以及操作来表示,在图中为简单起见,省略了属性和操作;类与类之间的关系使用不同的连线表示,图中带空心三角箭头的连线表示继承关系,两端带数字的连线表示关联关系。
在类图中,类的属性方法的可见性使用+、-及#表示+表示公共的,-表示私有的,#表示受
为上层应用程序提供更高级的统一编程接口,它样就使应用软件的开发与具体的软件平台无关,解决了嵌入式应用软件的移植问题。
在图1中,各模块之间有交界表明模块之间有接口关系。
、
应用程序以及都和硬件驱动有接口要使用一部分核心驱动例如实时时钟的驱动、串口和网口的驱动、2总线的驱动等;应用程序中调用的驱动是针对具体设备的;所需要的驱动就是系统的部分。
的静态结构图类图如图2所示。嵌入式系统开发是什么
类图是在统一建模语言中用类和它们之间的关系描述系统的一种图示。
类用类名、类的属性以及操作来表示,在图中为简单起见,省略了属性和操作;类与类之间的关系使用不同的连线表示,图中带空心三角箭头的连线表示继承关系,两端带数字的连线表示关联关系。
在类图中,类的属性方法的可见性使用+、-及#表示+表示公共的,-表示私有的,#表示受
保护的。
从图2中可以看出,、、、及都派生于公共的类。
对象中有受保护的、、及各一个。
对象中有一个或多个对象,相应的每个对象中有0个到多个对象。
21基本数据类型
构建一个框架,需要一些基本的元素,这些元素要在框架的构造以及应用程序开发中大量使用。
这些基本数据类型包括字符串类、集合类、及。
包括一个长度可变的字符序列,提供使用非常直观方便的运算符例如+,+=,=,==,!=和一些、、等;是具有内建索元素很快的检索速度;为其所存储的每一个元素,都提供了两个指针,分别指向位于其前和其后的元素,形成一个双向链表,这使得插入和删除操作十分快捷;为其存储的每个数据都附带一个关键字,并以关键字所组成的一个表作为索引,从而使得元素搜索、增加和删除操作都具有很高的效率。
22的抽象和封装
是一个中最基础的类,它不但是中、等类的基类,而且可以作为所有使用的嵌入式开发人
从图2中可以看出,、、、及都派生于公共的类。
对象中有受保护的、、及各一个。
对象中有一个或多个对象,相应的每个对象中有0个到多个对象。
21基本数据类型
构建一个框架,需要一些基本的元素,这些元素要在框架的构造以及应用程序开发中大量使用。
这些基本数据类型包括字符串类、集合类、及。
包括一个长度可变的字符序列,提供使用非常直观方便的运算符例如+,+=,=,==,!=和一些、、等;是具有内建索元素很快的检索速度;为其所存储的每一个元素,都提供了两个指针,分别指向位于其前和其后的元素,形成一个双向链表,这使得插入和删除操作十分快捷;为其存储的每个数据都附带一个关键字,并以关键字所组成的一个表作为索引,从而使得元素搜索、增加和删除操作都具有很高的效率。
22的抽象和封装
是一个中最基础的类,它不但是中、等类的基类,而且可以作为所有使用的嵌入式开发人
员定义新的类的超类。
类在中主要承担抽象和封装任务。
它提供了下面一些最基本的功能
*对的常用对象进行了封装,提供包括、、、、、、、等的创建、删除、查等功能的成员函数。
这些函数提供了一个简单有效的方法来使用的对象。
使用这些函数能够保证对象创建与销毁的安全性,而不会造成内存泄漏。
*提供了对-,运行时类型信息的支持,在新的++标准中,已经是++的一个功能,但并不是所有的编译器都提供支持这些新特性,12就不支持。
所以在这里参考,通过宏的方式为每个类定义一个类型的静态常量和相关的成员函数。
结构保证了类型的静态常量和相关的成员函数。
结构保存了类的名称、大小等信息,这样我们就能在程序运行时确定对象的具体类型。
*还提供了把类的成员函数作为任务及定时器的回调函数的功能。
在中,任务和定时器的回调函数只能是全局函数或者类的静态成员函数,这在面向对象的开发中很不方便。
类在中主要承担抽象和封装任务。
它提供了下面一些最基本的功能
*对的常用对象进行了封装,提供包括、、、、、、、等的创建、删除、查等功能的成员函数。
这些函数提供了一个简单有效的方法来使用的对象。
使用这些函数能够保证对象创建与销毁的安全性,而不会造成内存泄漏。
*提供了对-,运行时类型信息的支持,在新的++标准中,已经是++的一个功能,但并不是所有的编译器都提供支持这些新特性,12就不支持。
所以在这里参考,通过宏的方式为每个类定义一个类型的静态常量和相关的成员函数。
结构保证了类型的静态常量和相关的成员函数。
结构保存了类的名称、大小等信息,这样我们就能在程序运行时确定对象的具体类型。
*还提供了把类的成员函数作为任务及定时器的回调函数的功能。
在中,任务和定时器的回调函数只能是全局函数或者类的静态成员函数,这在面向对象的开发中很不方便。
这里通过把成员函数指针和对象的指针作为参数传递给,在调用公共回调函数时再取出来。
通过函数指针的方式去调用类的成员函数,这样把有派生于的类就可方便地使用成员函数作为任务、定时器等对象的回调函数。
23应用程序类
类用来定义整个应用程序对象,提供系统初始化、管理其它对象以及运行应用程序的功能。
任何使用框架的应用程序有且只能有一个派生于此类的对象。
对象中包含了动态创建的、、及对象。
通过在的入口函数_中创建系统初始化任务回调函数为
类的成员函数,来把系统控制权交给对象,在其中完成其它对象的创建、系统的配置以及初始化任务。
24文件系统
在嵌入式设备中通常使用存储器来保存程序代码和数据,每片一般由一定数量大小不等的扇区组成。
通过函数指针的方式去调用类的成员函数,这样把有派生于的类就可方便地使用成员函数作为任务、定时器等对象的回调函数。
23应用程序类
类用来定义整个应用程序对象,提供系统初始化、管理其它对象以及运行应用程序的功能。
任何使用框架的应用程序有且只能有一个派生于此类的对象。
对象中包含了动态创建的、、及对象。
通过在的入口函数_中创建系统初始化任务回调函数为
类的成员函数,来把系统控制权交给对象,在其中完成其它对象的创建、系统的配置以及初始化任务。
24文件系统
在嵌入式设备中通常使用存储器来保存程序代码和数据,每片一般由一定数量大小不等的扇区组成。
它在读取方面与普通存储器类似,可以实现随机的读取,但在写入操作上却有很大的不同。
中只有空白的单元才可以进行写入操作,要向非空的单元写入数据,需要先擦除整个扇区。
所以程序中如果直接对进行操作会很不方便。
最好的办法就是在其上构造一个文件系统,文件系统提供简便、可靠的接口供上层使用,而把复杂的操作屏蔽在文件系统内部。
这里文件系统包括内存文件系统和文件系统。
是一个抽象类,只是定义文件系统的接口函数例如、、、、、等,具体的实现在内存文件及文件类中完成。
25设备管理
在中,设备管理由、、及其派生类完成。
类代表整个设备,1个设备中包含1到多个对象,而每个对象中又包含0个到多个接口对象类的派生类对象。
这样以来,嵌入式设备仅限通信领域都可由这几个类组合而成,大大简化了软件的设计。
中只有空白的单元才可以进行写入操作,要向非空的单元写入数据,需要先擦除整个扇区。
所以程序中如果直接对进行操作会很不方便。
最好的办法就是在其上构造一个文件系统,文件系统提供简便、可靠的接口供上层使用,而把复杂的操作屏蔽在文件系统内部。
这里文件系统包括内存文件系统和文件系统。
是一个抽象类,只是定义文件系统的接口函数例如、、、、、等,具体的实现在内存文件及文件类中完成。
25设备管理
在中,设备管理由、、及其派生类完成。
类代表整个设备,1个设备中包含1到多个对象,而每个对象中又包含0个到多个接口对象类的派生类对象。
这样以来,嵌入式设备仅限通信领域都可由这几个类组合而成,大大简化了软件的设计。
26命令处理
类是系统的命令处理模块,它直接派生于类。
它的功能主要是接收网管软件通过串口或网口发送未来的各种命令,完成对设备的配置管理、性能管理、告警管理、安全管理和维护管理等管理功能。
类主要有表1所列的任务。
表1类中的任务
任务名称任务处理函数说明服务器监听任务用于监听客户端的连接请求响应任务对每客户端的连接都创建一响应任务串口任务通过串口对系统进行管理备分份任务备份应用程序和系统配置文件升级任务用于升级应用程序及修改用户配置文件
27其它模块
类封装对芯片的操作,主要包括读、写、擦除等操作。
从图2可以看出,和类中都包含对象;类记录系统中的发生的事件以及系统运行过程中产生的告警信息。
为了实现掉电保存功能,这些事件都保存在芯片中;类用来对系统的用户进行管理,防止对系统非授权的访问。
类是系统的命令处理模块,它直接派生于类。
它的功能主要是接收网管软件通过串口或网口发送未来的各种命令,完成对设备的配置管理、性能管理、告警管理、安全管理和维护管理等管理功能。
类主要有表1所列的任务。
表1类中的任务
任务名称任务处理函数说明服务器监听任务用于监听客户端的连接请求响应任务对每客户端的连接都创建一响应任务串口任务通过串口对系统进行管理备分份任务备份应用程序和系统配置文件升级任务用于升级应用程序及修改用户配置文件
27其它模块
类封装对芯片的操作,主要包括读、写、擦除等操作。
从图2可以看出,和类中都包含对象;类记录系统中的发生的事件以及系统运行过程中产生的告警信息。
为了实现掉电保存功能,这些事件都保存在芯片中;类用来对系统的用户进行管理,防止对系统非授权的访问。
3使用的设计方案举例
这里以在通信和工业自动化领域使用较多的串口服务器为例,来说明使用嵌入式开发框架的设计方案。
串口服务器是一种可把多路异步232485串行数据与通过以太网口传送的数据包进行相互转换,使传统的异步串行数据信息能通过或传送或共享的设备。
设每个串口对应的一个端口,则可画出图3所示的静态结构图图中是的简写。
从图3可以看出,共对五个类进行了派生。
类派生于类,用于通过网管对串口服务器进行管理这里具体命令略;类派生于类,代表串口服务器设备;类对象中有一个或多个派生于类的类对象,而每个类对象拥有一个或多个派生于类的类对象;类派生于类,代表整个应用程序,并重载了虚函数及,用来在其中创建系统的和类的实例来代替系统默认的和
实例。
图3串口服务器系统软件静态结构图
串口类的设计是整个设计的关键,在每个串口类中都有一个监听任务用来作为服务器去监听客户端的连接;一个客户端任务用来连接其它服务器。
这里以在通信和工业自动化领域使用较多的串口服务器为例,来说明使用嵌入式开发框架的设计方案。
串口服务器是一种可把多路异步232485串行数据与通过以太网口传送的数据包进行相互转换,使传统的异步串行数据信息能通过或传送或共享的设备。
设每个串口对应的一个端口,则可画出图3所示的静态结构图图中是的简写。
从图3可以看出,共对五个类进行了派生。
类派生于类,用于通过网管对串口服务器进行管理这里具体命令略;类派生于类,代表串口服务器设备;类对象中有一个或多个派生于类的类对象,而每个类对象拥有一个或多个派生于类的类对象;类派生于类,代表整个应用程序,并重载了虚函数及,用来在其中创建系统的和类的实例来代替系统默认的和
实例。
图3串口服务器系统软件静态结构图
串口类的设计是整个设计的关键,在每个串口类中都有一个监听任务用来作为服务器去监听客户端的连接;一个客户端任务用来连接其它服务器。
无论是通过还是建立连接后,就挂起这两个任务而启动另外两个任务和,它们分别用来通过网口发送数据和接收数据。
每隔10对波特率为1152的情况,10最多收到的字节数为1152019+21000*10=1152字节,所以串口的应大于116字节把从串口读到的数据打包从网口发送出去;而使用阻塞方式读取网口数据。
在读到数据后,根据串口发送缓冲区的情况慢慢通过串口往外发送,没发送完之前就不进行下一次从网口的数据读取。
这样把串口类设计成一个完备的处理类,设备中每块板有多少串口就在类的实例中有多少类的实例。
硬件模块化的结构简单地对应软件模块化的结构。
结语
本文讲述了在嵌入式软件开发中使用++构建系统开发框架的方法,并给出了框架的模型和应用实例。
可以看出,使用面向对象的框架技术对于提高开发效率、降低开发难度、规范开发模式、便于软件的移植和维护方面,具有传统面向过程的开发方法不可比拟的优势
每隔10对波特率为1152的情况,10最多收到的字节数为1152019+21000*10=1152字节,所以串口的应大于116字节把从串口读到的数据打包从网口发送出去;而使用阻塞方式读取网口数据。
在读到数据后,根据串口发送缓冲区的情况慢慢通过串口往外发送,没发送完之前就不进行下一次从网口的数据读取。
这样把串口类设计成一个完备的处理类,设备中每块板有多少串口就在类的实例中有多少类的实例。
硬件模块化的结构简单地对应软件模块化的结构。
结语
本文讲述了在嵌入式软件开发中使用++构建系统开发框架的方法,并给出了框架的模型和应用实例。
可以看出,使用面向对象的框架技术对于提高开发效率、降低开发难度、规范开发模式、便于软件的移植和维护方面,具有传统面向过程的开发方法不可比拟的优势
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论