软考中级-嵌入式系统设计师(三)

第三章 软件基础

1、宿主机和目标机、交叉编译

2、解释和编译

编译方式生成目标程序,编译器不参与运行控制,程序执行速度快,效率高。

解释方式不生成目标程序,解释器参与运行控制,程序执行速度慢,效率低。

3、主要的程序语言

Fortran语言(第一个高级程序设计语言,科学计算,执行效率高)。

Pascal语言(结构化程序设计语言,表达能力强)。

Delphi(快速应用程序开发工具,可视化编程环境)。

Lisp语言(函数式程序语言,符号处理,人工智能)。

JavaScript语言(脚本语言)

Python(面向对象,解释型程序设计语言,通用的脚本语言)。

PHP(服务器端脚本语言,制作动态网页)。

Ruby(简单快捷、面向对象、脚本语言)。

COBOL(数据外理领域最为广泛的程序设计语言,高级编程语言)

Prolog(逻辑式程序设计语言,建造专家系统、自然语言理解、智能知识库等)

4、编译程序基本原理

编译正确的程序可以消除词法及语法错误,但不能完全消除语义错误。语义错误分两类, 静态语义错误可以通过编译程序检测发现,而动态语义错误需要到运行时才能被发现

词法分析能够过滤注释、扫描源程序并识别记号和指出出错行号,但不能查出猜错的关键字。词法分析的任务是对源程序中的记号从前到后(从左到右)逐个字符地扫描,从而识别出一个个“单词”符号。

语法分析的任务是判断语法是否出错,如表达式、循环语句、程序等。

语义分析的任务是分析语法结构的含义,检查如赋值语句左右是否匹配,是否有零除数等。

中间代码后缀式(逆波兰式)、三元式(三地址式)、四元式等形式。

5、程序段和代码段

text段:存放程序代码。

data段:存放有初值的全局变量和常量。

bss段:存放未被初始化的全局变量。

6、数据结构

线性表和链表(单链表、循环链表、双向链表)

顺序表是需要一段连续的内存空间来存放顺序表中的所有元素,这些元素在物理地址上是相邻的。顺序表在进行读取、查找时效率更高。

链表所有元素只是逻辑上的相邻,在实际物理存储时处于不同的空闲块中,元素之间通过指针域连接。链表在进行插入、删除时效率更高。

队列和栈

队列:先进先出。

:先进后出。

环形队列(首尾相连的FIFO)

采用数组顺序存储,到达尾部时将转回0位置,该转回是通过取模操作实现。

typedef struct fifo
{
    int head;                //头部,出队列方向
    int tail;                //尾部,入队列方向
    int flag;                //标志位
    int fifo_size;           //队列长度
    int FIFOBuf[FIFO_MAX];   //队列数组
}FIFO;
FIFO *f;
//入队操作时,如队列未满,写入
f->tail = (f->tail + 1) % f->fifo_size;

//出队操作时,如队列未空,读出
f->head = (f->head + 1) % f->fifo_size;

//flag作为标志位,当head追上tail时,队列为空,flag=0;当tail追上head时,队列已满,flag=1
//队列为空时,head=tail
//队列已满时,(tail+1)%FIFO_MAX=head

7、树(非线性结构)

满二叉树:每层都满。

完全二叉树:k-1层是满的,第k层结点从左到右是满的。

二叉树的遍历

先序遍历:根左右。

中序遍历:左根右。

后序遍历:左右根。

8、图(非线性结构)

邻接矩阵
邻接链表

采用何种存储方式与有向图、无向图没有区别,要看图的边数和顶点数,完全图适合采用邻接矩阵存储

图的遍历

深度优先遍历:从任一顶点出发,遍历到底,直至返回,再选取任一其他结点出发,重复这个过程直至遍历完整个图。

广度优先遍历:先访问完一个顶点的所有邻接顶点,而后再依次访问其邻接顶点的所有邻接顶点,类似于层次遍历。

9、算法分析方法

时间复杂度:执行算法所需要的计算工作量。

空间复杂度:执行算法所需要的内存空间。

递推和递归

任何可以用递推法解决的问题,可以很方便地用递归法写出程序解决。

许多用递归法解决的问题不能用递推法解决。

这是因为递归法利用递归时压栈,可以有任意长度和顺序的前效相关性,这是递推法所不具备的。

分治法(会使用递归技术,将问题规模缩小)

分解、求解、合并。

二分查找法归并排序法等算法里,将待排序序列分解为一个个小序列先排序,后再不断扩大范围合并。

回溯法(一般用于迷宫类问题)

先进行深度优先策略,一直向下探测,当此路不通时,返回上一层搜索另外的分支,重复此步骤。

贪心法(局部最优)
动态规划法(全局最优)

10、单个系统开发生命周期

11、能力成熟度模型CMM

CMM是对软件组织化阶段的描述,随着软件组织定义、实施测量、控制和改进某软件进程,软件组织的能力经过这些阶段逐步提高。针对软件研制和测试阶段,分为五个级别。

CMMI是若干过程模型的综合和改进,不仅仅支持软件过程模型,还支持多个工程学科和领域的、系统的、一致的过程改进框架,能适应现代工程的特点和需要,能提高过程的质量和工作效率。

12、软件开发模型

瀑布模型(结构化模型,只适合需求明确或需求稳定时二次开发)
原型(结构化模型,适合需求不明确,不适合超大项目开发)

首先快速构造一个功能模型,演示给用户看,并按用户要求及时修改,中间再通过不断演示与用户沟通,最终设计出项目,就不会出现与用户要求不符合的情况,采用的是迭代的思想。

增量模型(结构化模型)

首先开发核心模块功能,而后与用户确认,之后再开发次核心模块的功能,即每次开发一部分功能,并与用户需求确认,最终完成项目开发,优先级最高的服务最先交付,但由于并不是从系统整体角度规划各个模块,因此不利于模块划分。难点在于如何将客户需求划分为多个增量。与原型不同的是增量模型的每一次增量版本都可作为独立可操作的作品,而原型的构造一般是为了演示。

螺旋模型(结构化模型,适合需求不明确的项目,适合大型项目开发)

多种模型的混合,与原型类似,增加了风险分析。

V模型(结构化模型)

特点是增加了很多轮测试,并且这些测试贯穿于软件开发的各个阶段,不像其他模型都是软件开发完再测试,很大程度上保证了项目的准确性。

喷泉模型(面向对象,迭代思想和无间隙开发)
基于构件的开发模型
形式化方法模型
统一过程(UP,针对大型项目)
MVC模型(模型-视图-控制器)

13、软件开发方法

结构化方法(流程固定,适合需求明确的项目,自顶向下,逐层分解,面向数据流)

将数据流映射为软件系统的模块结构,数据流类型包括变换流型和事务流型,不同类型的数据流有不同的映射方法。

以瀑布模型为代表,一旦开发完成,将难以修改,不利于复用及后续版本的开发,现在已被面向对象代替。

原型方法(适合需求不明确的项目,以原型模型为代表)
面向对象方法

强调复用性,构建全面合理的模型,供不同项目使用,方便修改,节省开发时间和效率,增强复用性,以构建组装模型为代表。

Jackson方法(面向数据结构,适用于小规模项目)
敏捷开发方法(设用于中小型项目)

主要是为了给程序员减负,去掉一些不必要的会议和文档。

14、结构化需求分析

数据流图

描述数据在系统中如何被传送或变换,以及如何对数据流进行变换的功能或子功能,用于对功能建模。

数据流图可以分层的,从顶层(即上下文无关数据流)到0层、1层等,顶层数据流只含有一个加工处理表示整个管理信息系统,描述了系统的输入和输出,以及和外部实体的数据交互。

数据字典

用来定义在数据流图中出现的符号或者名称的含义,在数据流图中,每个存储、加工、实体的含义都必须定义在数据流图中,并且父图和子图之间这些名称要相同。

符号

含义

举例说明

=

被定义为

+

x=a+b,表示x由a和b组成

[...,...]或[...|...]

x=[a,b],x=[a|b],表示x由a或b组成

{...}

重复

x={a},表示x由0个或多个a组成

(...)

可选

x=(a),表示a可在x中出现,也可以不出现

E-R图

在E-R模型中,使用椭圆表示属性(一般没有),长方形表示实体,菱形表示联系,联系的两端要填写联系类型。

状态转化图

状态转化图通过描述系统的状态及引起系统状态转化的事件,来表示系统的行为。此外,状态转化图还指明了作为特定事件的结果系统将做哪些动作。

15、面向对象

对象:基本的运行实体,为类的实例,封装了数据和行为的整体,如学生、汽车等真实存在的实体。对象具有清晰的边界、良好定义的行为和可扩展性。

:包括实体类(用于对必须存储的信息和相关行为建模的类,是需要长久保存且一直存在的类)、边界类系统内部与系统外部的业务主角之间进行交互建模的类)、控制类(用于对一个或几个用例所特有的控制行为进行建模,再用例执行过程中被动出现的特定行为的类)。

消息:对象之间进行通信。

继承:父类和子类之间共享数据和方法。

覆盖:在子类中重定义一个与父类同名同参的方法。

多态:不同的对象收到同一个消息时产生完全不同的反应,包括参数多态(不同类型参数多种结构类型)、包含多态(父子类型关系)、过载多态(类似于重载,一个名字不同含义)、强制多态(强制类型转换)四种类型。多态由继承机制支持。

封装:一种信息隐蔽技术,其目的是使对象的使用者与和生产者分离,也就是使其他开发人员无需了解所要使用的软件组件内部的工作机制,只需知道如何使用组件。

静态成员是不同的对象之间共享数据的方式,值可修改,静态方法只能访问静态成员。

静态类型是指一个对象的类型在编译时就确定,动态类型指对象类型在运行时才能确定。

静态绑定在程序执行前方法已经被绑定。

动态绑定运行时根据变量实际引用的对象类型决定调用哪个方法,动态绑定支持多态。

类的属性和方法分为public(所有类可以访问)、private(仅本类内部可以访问)、protect(本类内部可以访问、继承子类也可以访问)。

16、统一建模语言(UML)

和程序设计语言并无关系。UML结构包括构造块、规则和公共机制。

UML关系

依赖:一个事物的语义依赖于另一个事物的语义变化而变化。

关联:是一种结构关系,描述了一组链,链是对象之间的连接。分为组合和聚合,都是部分和整体的关系,其中组合事物之间关系更强。两个类之间的关联,实际上是两个类所扮演角色的关联,因此,两个类之间可以有多个由不同角色标识的关联。

泛化:一般/特殊的关系,子类与父类之间的关系。

实现:一个类元指定了另一个类元保证执行的契约。

UML图

用例图:描述了系统提供了一个功能单元,帮助开发人员以一种可视化的方式理解系统的功能需求。

类图:表示不同的实体如何彼此相关,显示了系统的静态结构。类图可用于表示逻辑类(通常就是业务人员所谈及的事物种类)和实现类(程序员处理的实体)。

序列图:显示具体用例的详细流程。它几乎是自描述的,并且显示了流程中不同对象之间的调用关系,同时还可以很详细的显示对不同对象的不同调用。

状态图:表示某个类所处的不同状态和该类的状态转化信息。

活动图:表示在处理某个活动时,两个或多个类对象之间的过程控制流。活动图可用于在业务单元的级别上对更高级别的业务过程进行建模或者对低级别的内部类操作进行建模。

组件图:提供系统的是物理视图,显示系统中的软件对其他软件的依赖关系。

部署图:表示该软件系统如何部署到硬件环境中,用于显示该系统不同的组件将在何处运行,以及将彼此如何通信。

17、结构化设计

系统设计主要目的:为系统制定蓝图,在各种技术和实施方法中权衡利弊,精心设计,合理地使用各种资源,最终勾画出新系统的详细设计方法。

系统设计方法:结构化设计方法,面向对象设计方法。

系统设计的主要内容:概要设计,详细设计。

概要设计(系统整体结构设计)基本任务:是将系统的功能需求分配给软件模块,确定每个模块的功能和调用关系,形成软件的模块结构图,即系统结构图。

详细设计的基本任务:模块内详细算法设计、模块内数据结构设计、数据库的物理设计、其他设计(代码、输入/输出格式、用户界面)、编写详细设计说明书、评审。

18、面向对象设计原则

单一职责原则:设计目的单一的类。

开放-封闭原则:对扩展开放,对修改封闭。

李氏替换原则:子类可以替换父类。

依赖倒置原则:要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程。

接口隔离原则:使用多个专门的接口比使用单一的总接口要好。

组合重用原则:要尽量使用组合,而不是继承关系达到重用目的。

迪米特原则:一个对象应当对其他对象有尽可能少的了解。

19、测试原则

软件测试最根本的目的是发现软件的错误。

应尽早并不断地进行测试。

测试工作应该避免由原开发软件的人或小组承担。

在设计测试方案时,不仅要确定输入数据,而且要根据系统功能确定预期的输出结果。

既包含有效、合理的测试用例,也包含不合理、失效的用例。

检验程序是否做了该做的事,且是否做了不该做的事。

严格按照测试计划进行。

妥善保存测试计划和测试用例。

测试用例可以重复使用或追加测试。

20、动态测试和静态测试

21、测试策略和测试阶段

测试策略

自底向上:从最底层模块开始测试,需要编写驱动程序,而后开始逐一合并模块,最终完成整个系统的测试。优点是较早的验证了底层模块。

自顶向下:先测试整个系统,然后编写桩程序,而后逐步向下直到最后测试最底层模块。优点是较早的验证了系统的主要控制点和判断点。

三明治:即有自底向上也有自顶向下的测试方法,兼有两者的优点,缺点是测试工作量大。

测试阶段

单元测试:对单个模块进行测试,由程序员自己测试模块内部的接口、消息、功能,测试依据是软件详细说明书。在单元测试中,驱动模块(上层)用来调用被测模块,自顶向下的单元测试中,不需要另外编写驱动模块。桩模块(底层)用来模拟被测模块所调用的子模块。

集成测试:将模块组合起来进行测试,分为一次性组装(简单,节约时间,发现错误少,只适合于小项目)和增量式组装(能够发现更多错误,耗时长,又可分为:自顶向下,自底向上、混合式)。

确认测试:对已完成的软件进行功能上的测试,分为内部确认测试(无用户情况)、Alpha测试(用户在开发环境下进行测试)、Beta测试(用户在实际使用时进行的测试)、验收测试(用户根据SRS对项目进行验收)。

系统测试:对软件进行性能测试,主要测试三个方面,即负载测试(在极限情况下,系统各项性能指标)、强度测试(系统资源特别低的情况下)、容量测试(并发测试,系统可以处理的同时在线的最大用户数量)。其他还有可靠性等性能测试,系统测试采用的是黑盒测试方法。

回归测试:软件修改错误或变更后,进行回归测试以验证之前正确的代码是否引入了错误。

22、鲁棒性测试、缺陷探测率DDP和调试

鲁棒性测试指控制系统在一定(结构、大小)的参数摄动下,维持其它某些性能的特性。鲁棒测试是对各个模块的功能和系统进行容错性的测试。

DDP=Bugs(tester)/[Bugs(tester)+Bugs(customer)],Bugs(tester)为软件开发方测试者发现的Bugs数目,Bugs(customer)为客户方发现并反馈技术支持人员进行修复的Bugs数目。

DDP越高,说明测试者发现的Bugs数目越多,发布后客户发现的Bugs数目就越少,降低了外部故障不一致成本,达到了节约总成本的目的,可获得较高的测试投资回报率。

调试方法:

蛮力法(穷举法、枚举法):穷举出所有可能的方法一一尝试。

回溯法(试探法):按选优条件向前搜索,以达到目标,当发现原先选择并不优或达不到目标时,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。

演绎法:一般到特殊。

归纳法:特殊到一般。从测试所暴露的问题出发,收集所有正确或不正确的数据,分析它们之间的关系,提出假想的错误原因,用这些数据来证明或反驳,从而查出错误所在。

23、软件维护类型、软件容错技术

24、覆盖测试

语句覆盖要求被测程序中的每一条语句至少执行一次,这种覆盖对程序执行逻辑的覆盖很低。

判定/条件覆盖要求判定中每个条件的所有可能取值(真/假)至少出现一次,并使得每个判定本身的判定结果(真/假)也至少出现一次。

路径覆盖则要求覆盖被测程序中所有可能的路径。

路径>条件>语句。

25、AD采集

计数法工作原理

计数器从0开始,每次加1,计数值作为D/A转换器的输入,然后D/A转换器会产生一个输出电压V0,V0与输入模拟电压Vi进行比较。

如果V0<Vi,则继续加1;直到V0大于Vi,计数值就是A/D转换器的输出值。

双积分法工作原理

对模拟输入电压和参考电压进行两次积分,变换成与输入电压均值成正比的时间间隔;

利用时钟脉冲和计数器测出其时间间隔,完成A/D转换。

逐次逼近法(目前最普遍)工作原理

在进行A/D转换时,由D/A转换器从高位到低位逐位增加转换次数,产生不同的输出电压,把输入电压和输出电压进行比较而实现。

26、RS232、422、485

RS232:点对点,全双工,传输距离端(小于15m),速率低。

RS422:一对多,全双工,差分信号,传输距离可达上千米。最多可连10个设备,速率可达10Mb/s。

RS485:多点通信,半双工,差分信号,传输距离可达上千米。最多可连32个设备,速率可达10Mb/s。

  • 4
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值