嵌入式软件开发(4.4)------嵌入式软件程序设计

4.4 嵌入式软件开发

嵌入式系统设计可分为三个阶段:分析、设计和实现。

             硬件、软件的选择包括:处理器、硬件部件、操作系统、编程语言、软件开发工具、硬件调试工具和软件组件等。

         1.硬件平台的选择

                 1.1处理器性能:目标不是挑选最快的,而是在于选择能够完成操作的处理器和I/O子系统。

                 1.2技术指标:开发人员首先考虑的是系统所需求的一些硬件能否无须过多的逻辑就能链接到处理器上,其次考虑该处理器的一些支持芯片的配套情况。

                 1.3功耗:在选择微处理器的时候要求高性能、低功耗。

                 1.4 软件支持工具

        2.软件平台的选择

                  2.1操作系统

                       2.1.1 操作系统提供发热工具

                       2.1.2操作系统向硬件接口移植的难度

                       2.1.3操作系统的内存要求,有些操作系统对内存的要求较大。

                       2.1.4操作系统的可裁剪性、实时性能等等。

                2.2编程语言

                2.3集成开发环境

                        2.3.1 系统调试器的功能,包括远程调试环境

                        2.3.2 支持库函数。许多开发系统提供大量的库函数和模板代码,如C++编译器就带有标准的模板库。与选择硬件和操作系统的原则一样,应尽量采用标准的   glibc (GNU标准C库函数)

                        2.3.3 链接程序是否支持所有的文件格式和符号格式。

4.4.2 软件设计

1.软件设计的任务

               1.1准备一个工作计划

               1.2确定软件结构

               1.3设计评审

               1.4维护工作计划

               1.5与硬件部门密切合作、相互协调

                1.6控制工作的结果,把工作记录存档

 

2.模块结构设计

              该基本任务是:将系统划分为模块,确定软件的结构,模块的功能和模块间的接口,以及全局数据结构的设计。模块结构设计是软件开发过程中很关键的一步。软件的质量及一些整体特征基本是这一步决定的。

               (1 )模块的概念

                    模块是组成系统的基本单位,它的特点是可以组合、分解、更换。系统中任何一个功能,都可以被看成一个模块。根据模块功能具体化的程度不同,可以分为罗级模块和物理模块。

               一个模块应具备以下四个要素

               1.1输入输出:模块的输入来源和输出去向都是同一个调用者

               1.2处理功能:指模块把输入转换成输出所做的工作。

               1.3内部数据:仅指供该模块本身引用的数据。

               1.4 程序代码:用来实现模块功能的程序。

               (2 )模块结构图

                           模块结构设计原则:

                            2.1   模块:这里所说的模块通常指用一个人的名字就可以调用的一段程序语句。在长方形中间,可以标上能反应模块处理功能的模块名字。

                            2.2  调用:分为调用、判断调用和循环调用

                            2.3  数据:

                            2.4  控制信息:

                            2.5 转接符号

 

3.结构化软件设计方法

             结构化设计是一种面向数据流的设计方法,它可以与结构化分析方法衔接。结构化设计方法的基本思想是将系统设计成相对独立、功能单一的模块组织呢结构。

             3.1信息流的类型

                      在需求分析阶段,用结构化分析方法产生了数据流图(Data Flow Diagram,DFD)。所谓数据流,是一种便于用户理解、分析系统数据流程的图形工具。

             它摆脱了系统的物理内容,精确地在逻辑描述上描述系统的功能、输入、输出和设计存储等等,是系统逻辑模型的重要组成部分。。DFD的信息流大体上可以分

             种类型:一种是交换流,另一种是事务流。

             

              交换流:信息沿着输入通路进入系统,同时将信息的外部形势转换成内部表示,然后通过变换中心(也称主加工)处理,再沿着输出通路转换成外部形式,离开系统。

                              交换流型的DFD可以明显的分为输入、变换(主加工)、和输出三大部分。

              事务流:事务流有明显的事务中心,各活动流以事务中心为起点呈辐射状流出。

           3.2  变换分析

              变换分析,是从变换流型的DFD导出程序结构图。

                      (1 ) 确定输入流和输出流,孤立出交换中心

                                  在DFD中,从物理输入到逻辑输入的部分结构构成系统的输入流,从逻辑输出到物理输出部分构成系统的输出流,位于输入流与输出流之间的部分就是变换中心。

                       (2 )第一级分解 主要是设计模块结构的顶层和第一层。一个交换流型的DFD可映射成如下的结构图:

                                    顶层模块:细分为   输入控制   变换控制  输出控制

                       (3 )第二级分解

                                  第二级主要设计中、下层模块。

                                        输入控制模块的分解:

                                         输出控制模块的分解:

                                       变换控制模块的分解:

                       (4 )事务分析

                                   事务分析是从事务流型DFD导出程序结构图。

                                    ①确定事务中心和每条活动流的流特性。

                                    ②将事务流型DFD映射成高层的数据结构。

                                    ③进一步分解。接收模块的分解类同于变换分析中输入控制模块的分解。每个活动流模块根据其流特性(变换流或数据流)进一步采用变换分析或

                                        事务分析,进行分解。

                        (5 )结构化设计方法的设计步骤

                                    ①复查并精化数据流图。

                                    ②确定DFD的信息流类型(变换流或事务流)

                                    ③根据流类型分别实施变换分析或者实务分析

                                    ④根据系统设计原则,对程序结构图进行优化。                             

            

           

                                 

4.面向对象软件设计方法(OOD)

        OOD的独特性在于它基于四个重要的软件设计概念:抽象、信息隐蔽、功能独立和模块性。

        OOD分为4个设计层次,从低到高分别是子系统设计曾、类及对象设计层、信息设计层和责任设计层。

4.4.3 嵌入式程序设计

1.BootLoader设计

         从操作系统的角度来讲,BootLoader的总目标就是正确的调用内核来执行。

         由于BootLoader 的实现依赖于CPU的体系结构,所以大部分可以分为stag1和stag2 两大部分。

         BootLoader的stage1通常包括以下步骤:

      硬件初始化。

             为加载BootLoader的stage1准备内存空间。

             复制BootLoader的stage1到内存。

             设置好堆栈。

             跳转到stage1的C入口。

 

              BootLoader的stage2通常包括:

              初始化本阶段要使用的硬件设备。

              检测系统内存映射(Memory Map)。

              将内核映像和根文件系统映射从FLASH上读入到内存当中。

              为内核设置启动参数,并调用内核。

2.设备驱动程序设计

              下面以嵌入式linux系统为例,介绍设备驱动程序的设计与实现。

       (1 )概述

               设备驱动是建立在硬件I/O设备上的一个抽象层,这个抽象层的建立可允许上面的软件层使用同一的、独立于硬件的方式来访问设备。

                在Linux 下主要有两类设备:字符设备和块设备。

                     前者是以字节为单位逐个进行I/O操作的设备。

                     后者是以数据块作为信息的存储和传输单位。

               设备驱动程序的主要功能如下:

                      对设备的初始化和释放。

                      把数据从内核传送到硬件和从硬件读取数据。

                      读取应用程序传送给设备文件的数据和回送应用程序请求的数据。这需要在用户空间、内核空间、总线以及外设之间传输数据。

                      检测和处理设备出现的错误。

                      Linux抽象了对硬件的处理,每一个硬件设备都使用一个特殊的设备文件表示:它们可以使用与文件相同的、标准的系统调用接口来完成打开、关闭、读、写和I/O控制灯操作,而驱动程序的主要任务是实现这些系统调用函数。这样一来,Linux为文件和设备提供了一致的用户接口,应用程序可以像操作普通文件一样来对硬件设备进行操作。

              每个设备文件都对应两个设备号:主设备号和次设备号。

    (2 )设备驱动程序结构

                Linux的设备驱动程序与外界的接口主要有两部分:

                      向上的接口:即驱动程序与操作系统的接口。这是通过file_operations数据结构来完成,这是一组通用的、标准的文件访问接口。

                      向下的接口:即驱动程序与设备接口。

               file_operations数据结构中定义的接口函数主要包括:

                open  close  read  write iseek ioctl等。

   3.网络应用程序设计

              编写一个机遇Socket接口的网路应用程序的基本过程大致可以分为五个步骤

             (1 )初始化Socket网络应用的系统资源

             (2 )建立Socket

             (3 )建立连接

             (4 )发送和接受数据

             (5 )关闭Soctket,释放系统资

4.4.4编码

4.4.5 测试

1.概述

2.测试的任务

3.测试的方法

         (1 )人工测试

                     个人复查

                      抽查

                     会审


         (2 )机器测试

                     机器测试只能发现错误的症状,但无法对问题进行定位。

                     机器测试分为黑盒测试和白盒测试两种。测试代码的覆盖率逐渐成为软件测试的评价标准。①②③④⑤⑥⑦⑧⑨⑩⑾

                     ① 黑盒测试

                     黑盒测试也称为功能测试。将软件看成黑盒子,在完全不考虑软件内部结构和特性的情况下,测试软件的外部特性。

                     一般来说,黑盒测试包括以下几点:

                     极限情况测试:即在测试中,有意使输入信道、内存缓冲区、磁盘控制器和内存管理器等部件超载。

、                 边界测试:对输入值进行设计,使得输入或者输出值落在边界范围内。

                     异常测试:有意识的去触发系统的失败模式或者异常模式。

                     错误测试:选择一些容易引发的错误的测试用例。

                      随机测试:这种方法的效率低,主要用在用户界面的测试上,用来评估界面代码的健壮性。

                      性能测试:

                    ②白盒测试

                       白盒测试,也成为机构测试。测试原则:

                       程序模块中的所有独立路径至少执行一次。

                       在所有的逻辑中,取真和取假的两种情况至少都要执行一次。

                       每个循环都应在边界条件和一般条件下各执行一次。

                       测试程序内部的数据结构的有效特性。

4.测试的步骤

         (1 )系统平台测试

                    包括硬件电路测试、操作系统及底层驱动程序的测试。硬件电路要用专门的测试工具进行测试;操作系统和底层驱动程序的测试主要包括测试操作系统的任务调度、实时性能、通信端口的数据传输率等等。该阶段测试完成后吧,系统为一个完整的嵌入式系统平台。

          (2 )单元测试

                     也称为模块测试。

                     单元测试主要从模块的以下五个特征着手进行检查。

                     模块接口。

                     局部数据结构。

                     重要的执行途径。

                     出错处理。

                     边界条件。

                       

                      由于模块不是独立运行的程序,且各模块之间存在调用与被调用的关系。因此在对各个模块进行测试时,需要开发两种模块。

                      驱动模块:相当于一个主程序,负责接收测试用例的数据,将这些数据送到测试模块,并输出测试结果。

                      桩模块 :也成为存根模块。用来代替测试模块中所调用的子模块,其内可进行少量的数据处理,目的是为了检验入口,并输出调用和返回信息。

      

         (3 )集成测试

                     集成测试也成为组装测试,就是把各个模块按照系统设计说明书的要求组合起来进行测试。即使所有模块都通过了各自的单元测试,单在组装之后,仍可能会出现下列问题:

                     传过模块的数据丢失。

                      一个模块的功能对其他模块造成有害的影响。

                     各个模块组装起来,没有达到预期的效果。

                      全局数据结构出现问题。

                    单个模块的误差可以接受, 但模块组合后,可能会出现误差的累积,最后达不到接收的程度。

                    集成测试通常有两种方法:

                               非增量式

                               增量式

         (4 )系统测试

                    系统测试时将嵌入式软件、硬件、外设和网络等各种因素结合在一起,进行整个系统的组装测试和确认测试。这个阶段的测试一般在目标机上进行。

                    常见的系统测试主要内容如下:

                    恢复测试

                    强度测试

                    性能测试

                    可靠性测试

5.覆盖测试

          (1 )覆盖测试概述

                     覆盖测试是一种白盒测试方法,测试人员必须拥有程序的规格说明书和程序清单。它的基本思路是以程序的内部结构为基础来设计测试用例,以覆盖尽可能多的程序内部逻辑结构,发现其中的错误和问题。覆盖测试一般用在软件测试的早期,即单元测试阶段。

                      覆盖测试主要包括以下五项

                      ① 语句覆盖:在设计测试用例时,使程序的每一条语句都至少执行一次。

                      ②  判定覆盖:执行足够多的测试用例,使程序中的每个判定语句,都获得一次“真”值和“假”值,即每个分支都至少执行一次。

                      ③  条件覆盖:执行足够多的测试用例,使判定中的每个条件都获得所以可能的逻辑值。
                      ④判定/条件覆盖:使每个分支.

                      ⑤条件组合覆盖:执行足够多测试用例,使每个判定中各种条件组合都至少出现一次。其特点是覆盖较充分,满足条件组合覆盖测试用例也一定满足判定覆盖、                  条件覆盖和判定、条件覆盖。

          (2 )覆盖测试工具

4.4.6下载和运行

          根据嵌入式系统硬件的配置情况,固化的方式有多种,可以固化在EEPROM和Flash这类存储器中,也可以固化在DOC或者DOM等电子盘中。或者是试用TFTP协议进行远程文件传送。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值