admin 管理员组文章数量: 887032
2023年12月25日发(作者:台历模板王)
从软件工程的角度来说,嵌入式应用软件也有一定的生命周期,如要进行需求分析、系统设计、代码编写、调试和维护等工作,软件工程的许多理论对它也是适用的。
但和其他通用软件相比,它的开发有许多独特之处:
·在需求分析时,必须考虑硬件性能的影响,具体功能必须考虑由何种硬件实现。
·在系统设计阶段,重点考虑的是任务的划分及其接口,而不是模块的划分。模块划分则放在了任务的设计阶段。
·在调试时采用交叉调试方式。
·软件调试完毕固化到嵌入式系统中后,它的后期维护工作较少。
下面主要介绍分析和设计阶段的步骤与原则:
1、
需求分析
对需求加以分析产生需求说明,需求说明过程给出系统功能需求,它包括:
·系统所有实现的功能
·系统的输入、输出
·系统的外部接口需求(如用户界面)
·它的性能以及诸如文件/数据库安全等其他要求
在实时系统中,常用状态变迁图来描述系统。在设计状态图时,应对系统运行过程进行详细考虑,尽量在状态图中列出所有系统状态,包括许多用户无需知道的内部状态,对许多异常也应有相应处理。
此外,应清楚地说明人机接口,即操作员与系统间地相互作用。对于比较复杂地系统,形成一本操作手册是必要的,为用户提供使用该系统的操作步骤。为使系统说明更清楚,可以将状态变迁图与操作手册脚本结合起来。
在对需求进行分析,了解系统所要实现的功能的基础上,系统开发选用何种硬件、软件平台就可以确定了。
对于硬件平台,要考虑的是微处理器的处理速度、内存空间的大小、外部扩展设备是否满足功能要求等。如微处理器对外部事件的响应速度是否满足系统的实时性要求,它的稳定性如何,内存空间是否满足操作系统及应用软件的运行要求,对于要求网络功能的系统,是否扩展有以太网接口等。
对于软件平台而言,操作系统是否支持实时性及支持的程度、对多任务的管理能力是否支持前面选中的微处理器、网络功能是否满足系统要求以及开发环境是否完善等都是必须考虑的。
当然,不管选用何种软硬件平台,成本因素都是要考虑的,嵌入式Linux正是在这方面具有突出的优势。
2、
任务和模块划分
在进行需求分析和明确系统功能后,就可以对系统进行任务划分。任务是代码运行的一个映象,是无限循环的一段代码。从系统的角度来看,任务是嵌入式系统中竞争系统资源的最小运行单元,任务可以使用或等待CPU、I/O设备和内存空间等系统资源。
在设计一个较为复杂的多任务应用系统时,进行合理的任务划分对系统的运行效率、实时性和吞吐量影响都极大。任务分解过细会不断地在各任务之间切换,而任务之间的通信量也会很大,这样将会大大地增加系统的开销,影响系统的效率。而任务分解过粗、不够彻底又会造成原本可以并行的操作只能按顺序串行执行,从而影响系统的吞吐量。为了达到系统效率和吞吐量之间的平衡折中,在划分任务时应在数据流图的基础上,遵循下列步骤和原则:
·进行数据流分析
在系统需求分析的基础上,以数据流图作为分析工具。首先,从系统的功能需求开始分析系统中的数据流,分析数据在各状态转换之间的作用。然后,扩展数据流图,并分解到足够的深度,识别出主要的子系统和每个子系统的主要成分。
·划分任务
识别出系统的所有功能和它们之间的数据流后,下一步是要判断哪些操作是并行,哪些是串行,以划分任务。
在将一个软件系统分解为并行任务时,主要考虑的是系统内功能的异步性。这需要分析数据流图中的各功能变换,确定哪些变换可以并行,而哪些在本质上又是顺序的。一般并行的功能变换应属于不同的任务,而串行的可以属于同一任务。任务的划分包括确定哪些变换属于哪个任务,及确定各任务的优先级。它们的划分原则如下:
1)
I/O依赖性
如果功能变换依赖I/O,那么它的运行速度常常受限于它的互操作的I/O设备的速度。在这种条件下,功能变换应单独成为一个任务。
2)
功能的时间关键性
具有时间关键性的功能需求以高优先级运行,因此不能把它加到其他任务中运行,应成为一个独立的高优先级任务。
3)
计算需求
需要进行大量计算但又不具有时间紧迫性的功能或功能集合,可以作为较低优先级的任务运行,以消耗CPU的剩余时间。
4)
功能内聚
完成功能紧密相关的变换可以组成一个任务,因为这些功能间的数据通信较多,把它们作为一个个独立的任务反而会增加系统开销。反之,把每个变换作为同一任务中的一个独立模块,不仅保证了模块级的功能内聚,而且保证了任务的功能内聚。
5)
周期执行
一个需要周期执行的变换可以作为一个独立的任务,按一定的时间间隔被激活。
·定义任务接口
在划分好任务之后,要确定任务间的接口。在数据流图中,接口是以数据流或数据存储的形式存在,在这里要把它们具体化下来,确定采用何种格式的接口。
通常由两种任务接口模块来处理接口问题,即任务间通信模块和任务同步互斥模块,这些模块对调用它的任务来说一般是操作系统级的任务调用。
任务通信模块处理任务间的所有通信情况。一般它会定义一个数据结构,并定义对该数据结构的访问过程,如对消息队列、管道等结构的访问。任务通信模块总是运行在调用它的任务中,因而,它有可能在两个任务中并发执行,所有在访问过程中必须提供必要的同步和互斥条件来确保数据的一致性和正确性。
任务同步互斥模块是当任务之间不需要传送真正的信息时使用的,它用事件来实现同步目的。目标任务等待一个或几个事件的发生,源任务发送事件信号激活目标任务。
上述的划分原则仅能作为一个初步参考,真正的设计还需要详细分析,才能使系统达到预定的效率和吞吐率
软件开发流程
软件开发流程分为:需求确认——概要设计——详细设计——编码——单元测试——集成测试——系统测试——维护
需求确认:需求规格说明书
概要设计:系统用例图,用例场景
详细设计:系统设计报告,数据库设计报告
测试:测试用例报告
详细设计
详细设计的主要任务是设计每个模块的实现算法、所需的局部数据结构。详细设计的目标有两个:实现模块功能的算法要逻辑上正确和算法描述要简明易懂。
传统软件开发方法的详细设计主要是用结构化程序设计法。详细设计的表示工具有图形工具和语言工具。图形工具有程序流程图、PAD(Problem Analysis Diagram)图、NS(由 Nassi和 Shneidermen开发,简称 NS)图。语言工具有伪码和 PDL(Program Design Language)等。
主要任务
1.为每个模块确定采用的算法,选择某种适当的工具表达算法的过程,写出模块的详细过程性描述;
2.确定每一模块使用的数据结构;
3.确定模块接口的细节,包括对系统外部的接口和用户界面,对系统内部其它模块的接口,以及模块输入数据、输出数据及局部数据的全部细节。在详细设计结束时,应该把上述结果写入详细设计说明书,并且通过复审形成正式文档。交付给下一阶段(编码阶段)的工作依据。
4.要为每一个模块设计出一组测试用例,以便在编码阶段对模块代码(即程序)进行预定的测试,模块的测试用例是软件测试计划的重要组成部分,通常应包括输入数据,期望输出等内容。
详细设计的工具
1.图形工具
利用图形工具可以把过程的细节用图形描述出来。
2.表格工具
可以用一张表来描述过程的细节,在这张表中列出了各种可能的操作和相应的条件。
3.语言工具
用某种高级语言(称之为伪码)来描述过程的细节
嵌入式开发学习步骤
1、Linux 基础
安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务能够独立安装Linux操作系统 能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务 Shell 编程基础使用vi编辑文件 使用Emacs编辑文件 使用其他编辑器
2、Shell 编程基础
Shell简介 认识后台程序Bash编程熟悉Linux系统下的编辑环境 熟悉Linux下的各种Shell 熟练进行shell编程熟悉vi基本操作 熟悉Emacs的基本操作 比较不同shell的区别 编写一个测试服务器是否连通的shell脚本程序 编写一个查看进程是否存在的shell脚本程序 编写一个带有循环语句的shell脚本程序
3、Linux 下的 C 编程基础
linux C语言环境概述 Gcc使用方法 Gdb调试技术 Autoconf Automake Makefile 代码优化 熟悉Linux系统下的开发环境 熟悉Gcc编译器 熟悉Makefile规则编写Hello,World程序 使用 make命令编译程序 编写带有一个循环的程序 调试一个有问题的程序
4、嵌入式系统开发基础
嵌入式系统概述 交叉编译 配置TFTP服务 配置NFS服务 下载Bootloader和内核 嵌入式Linux应用软件开发流程熟悉嵌入式系统概念以及开发流程 建立嵌入式系统开发环境制作cross_gcc工具链 编译并下载U-boot 编译并下载Linux内核 编译并下载Linux应用程序
4、嵌入式系统移植
Linux内核代码 平台相关代码分析 ARM平台介绍 平台移植的关键技术 移植Linux内核到 ARM平台 了解移植的概念 能够移植Linux内核移植Linux2.6内核到 ARM9开发板
5、嵌入式 Linux 下串口通信
串行I/O的基本概念 嵌入式Linux应用软件开发流程 Linux系统的文件和设备 与文件相关的系统调用 配置超级终端和MiniCOM 能够熟悉进行串口通信 熟悉文件I/O 编写串口通信程序 编写多串口通信程序
6、嵌入式系统中多进程程序设计
Linux系统进程概述 嵌入式系统的进程特点 进程操作 守护进程 相关的系统调用了解Linux系统中进程的概念
能够编写多进程程序编写多进程程序 编写一个守护进程程序 sleep系统调用任务管理、同步与通信 Linux任务概述任务调度 管道 信号 共享内存 任务管理 API 了解Linux系统任务管理机制 熟悉进程间通信的几种方式 熟悉嵌入式Linux中的任务间同步与通信编写一个简单的管道程序实现文件传输 编写一个使用共享内存的程序
7、嵌入式系统中多线程程序设计
线程的基础知识 多线程编程方法 线程应用中的同步问题了解线程的概念 能够编写简单的多线程程序编写一个多线程程序
8、嵌入式 Linux 网络编程
网络基础知识 嵌入式Linux中TCP/IP网络结构 socket 编程 常用 API函数 分析Ping命令的实现 基本UDP套接口编程 许可证管理 PPP协议 GPRS 了解嵌入式Linux网络体系结构 能够进行嵌入式Linux环境下的socket 编程 熟悉UDP协议、PPP协议 熟悉GPRS 使用socket 编写代理服务器 使用socket 编写路由器 编写许可证服务器 指出TCP和UDP的优缺点 编写一个web服务器 编写一个运行在 ARM平台的网络播放器
9、GUI 程序开发
GUI基础 嵌入式系统GUI类型 编译QT 进行QT开发熟悉嵌入式系统常用的GUI 能够进行QT编程使用QT编写“Hello,World”程序 调试一个加入信号/槽的实例 通过重载QWidget 类方法处理事件
10、Linux 字符设备驱动程序
设备驱动程序基础知识 Linux系统的模块 字符设备驱动分析 fs_operation结构 加载驱动程序了解设备驱动程序的概念 了解Linux字符设备驱动程序结构 能够编写字符设备驱动程序编写Skull驱动 编写键盘驱动 编写I/O驱动 分析一个看门狗驱动程序 对比Linux2.6内核与2.4内核中字符设备驱动的不同Linux 块设备驱动程序块设备驱动程序工作原理 典型的块设备驱动程序分析 块设备的读写请求队列了解Linux块设备驱动程序结构 能够编写简单的块设备驱动程序比较字符设备与块设备的异同 编写MMC卡驱动程序 分析一个文件系统 对比Linux2.6内核与2.4内核中块设备驱动的不同
11、文件系统
虚拟文件系统 文件系统的建立 ramfs内存文件系统 proc文件系统 devfs 文件系统 MTD技术简介 MTD块设备初始化 MTD块设备的读写操作了解Linux系统的文件系统 了解嵌入式Linux的文件系统 了解MTD技术 能够编写简单的文件系统为 ARM9开发板添加 MTD支持 移植JFFS2文件系统 通过proc文件系统修改操作系统参数 分析romfs 文件系统源代码 创建一个cramfs 文件系统
版权声明:本文标题:嵌入式Linux应用软件开发流程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1703440257h451476.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论