Tuesday, June 06, 2006

Rational Software Development Process

Rational开发过程

 

 

 
 
级别: 初级
Philippe KruchtenIBM
2004 年 12 月 01 日
本文对 Rational 软件开发过程(Rational Software Development Process)的原理和结构给出了高度的描述, 它具有足够的普遍性,可以在规模与应用领域方面,为各个软件产品和项目量身订做。
1. 引言
本文对 Rational 软件开发过程(Rational Software Development Process)的原理和结构给出了高度的描述,它是:
迭代的、增量的开发过程
面向对象的开发过程
管理和控制的开发过程
它具有足够的普遍性,可以在规模与应用领域方面,为各个软件产品和项目量身订做。
 
 

 
 

 
2.总体软件生命周期
2.1 两种视角
Rational 过程可以从两种不同而又密不可分的视角来观察:
从管理的视角来看,涉及财务、战略、商业和人文方面
从技术的视角来看,涉及质量、工程和设计方法方面
2.2 周期和阶段


从管理的角度,即从业务和经济的角度来看,对应项目的进展,软件的生命周期包含四个主要阶段:
起始阶段(Inception)-- 有一个好的想法:详细构想出最终产品的设想和它的业务案例,确定项目的范围 。
细化阶段(Elaboration)--计划必要的活动和所需资源,详细确定功能并设计构架 。
构建阶段(Construction)-- 构建产品, 发展最初的设想、构架和计划,直到一个可以交付给用户的产品(完成后的设想)完成。
移交阶段(Transition)-- 将产品移交用户使用,包括:制造、交付、培训、支持、维护,直到用户满意。
完成这4个阶段称为一个开发周期, 它产生的软件称作第一代(generation)。 除非产品的生命结束, 一个现有产品可以通过重复下一个相同的起始、细化、构建和移交四阶段,各个阶段的侧重点与第一次不同,从而演进为下一代产品。 这个时期我们称之为演进(evolution)。最后伴随着产品经过几个周期的演进,新一代产品也不断被制造出来。
例如,演进周期的启动可能由以下这几项触发:用户建议增强功能、用户环境的改变、重要技术的变更,以及应对竞争的需要。


实际中,周期之间会有轻微重叠:起始阶段和细化阶段可能会在上一个周期的移交阶段未结束时就开始了。
2.3. 迭代
从技术的角度来看,软件开发可以视为一连串的迭代过程,通过这些迭代被开发的软件得以增量演进。 每次迭代都以一个可执行的产品的发布而结束, 该产品可能是完整版本的一个子集,但从工程的或用户的角度来看是有用的。 每次发布都伴随一些支持性工件:版本描述、用户文档和计划等。
 

一次迭代包括以下活动: 计划、分析、设计、实施和测试。 根据迭代在开发周期中所处位置的不同,这些活动分别占不同的比例。
管理角度和技术角度之间是协调的, 而且各个阶段的结束还和各次迭代的结束保持同步。
换句话说,每个阶段可以分为一次或多次迭代过程。

(注意:本图中每阶段的迭代数目仅为示意)

但是,这两个角度(管理角度和技术角度),不仅仅只是保持同步,它们还具有一些完全相同的里程碑,它们共同贡献出一些随时间演进的产品和工件。 一些工件更多地处于技术方面控制之下,另一些工件更多地处于管理方面的控制之下。见第五节。
这些工件的可用性、工件是否满足所建立的评估标准,是构成里程碑的主要具体元素,比日历牌上的日期提供了多得多的内容。
像周期一样,迭代之间也会有轻微重叠。即第N次迭代的计划和构架在第N-1次迭代还未结束时就开始了。有时候,迭代也会平行进行:一个工作于系统某一部分的小组,可能在某个迭代内没有可交付的工件。
2.4.区别
对于不同的项目而言,每个阶段的侧重点,入口和出口准则,一个开发周期的各个工件,以及各次迭代的数目和长度都会不同。这主要取决于作为过程判别式的的四个主要项目特征。按照影响程度降序排列,它们是:
业务环境
契约性工作,开发者基于给定的客户规格说明只为该客户开发软件。
推测性开发或商业开发,开发者开发软件以推向市场。
内部项目, 开发者和客户在同一个机构中。
软件开发工作量的规模:
按照一些度量标准来确定,比如 Delivered Source Instructions,或功能点、人-月数,或者只按照成本。
新颖程度:
对于软件开发组织,这个软件新颖程度如何有多新,尤其是该软件是否为第二次或更后面的周期。这项区别包括了组织和过程的成熟度、资产、技术水平,当前的技状况,以及诸如组建并培训团队、获取工具及其他资源这样的问题。
应用类型,目标领域:
MIS,命令和控制系统, 嵌入式实时系统, 软件开发环境工具等等, 尤其时具体的应用领域会给开发提出特殊的约束条件:安全性、性能、国际化、内存限制等。
本文首先描述适用所有类型软件开发的通用过程,然后描述了一些有区别价值的特定过程实例,并列举了几个例子。
2.5工作量和日程安排
各阶段在工作量和时间安排上是不同的。尽管由于不同项目类型之间相差会很大,一个典型的中等规模项目的最初开发周期可以预计为下面的比率:
 
起始阶段
细化阶段
构建阶段
移交阶段
工作量
5%
20%
65%
10%
日程安排
10%
30%
50%
10%
可以用下图表示:


但是对于一个演进周期来说,起始阶段和细化阶段可能大大缩减。使用特定工具和技术(如应用程序构建器),构建阶段可以远远小于起始阶段和细化阶段的总和。
 



 
 

3. Rational 过程的各个阶段
3.1. 起始阶段
这个阶段产生一个预测产品的最初设想,并将其转换为一个实际的项目。本阶段的目的是建立一个新产品或一次大的更新的业务案例,并且指定项目的范围。
对于一个新产品的开发,本阶段的主要结果是得到一个"做还是不做"的决定以进入下一阶段,并投入一定的时间和资金来详细分析构建什么、能否构建,以及如何构建。
对于一个现有产品的演进,这会是一个简短的阶段, 主要看用户或客户的要求、问题报告,或是新的技术动态。
对于一个契约性的开发,是否进行项目的决定取决于在特定领域的经验、以及组织在此领域的竞争力和市场情况。这里起始阶段可以归结为一个参加投标的决定,或投标活动本身。该决定可能是基于一个现有的研究原型,其结构对最终软件可能合适,也可能不合适。
入口准则:
对于一项需要的描述,可以采用以下形式:
一份最初的设想
一个遗留系统
一份建议请求(An RFP --request for proposal)
先前一代的产品和一个增强要求清单
一些资产(软件, 专门技能, 财务资产)
一个概念原型或实物模型
出口准则:
一个初始的业务案例至少要包含以下内容:
对产品设想的明确表达即核心需求,表述为功能、范围、性能、容量和技术等。
成功标准 (如收入的数目)
最初的风险评估
完成细化阶段所需的资源估算
通常在初试阶段结束时,我们将得到:
一个最初的域分析模型(完成大约10%-20%), 确定最关键的用例, 并且足以进行进构架工作。
一个最初的构架原型,在这个阶段可以是一个一次性原型
3.2. 细化阶段
本阶段的主要目的是更彻底地分析问题域,定义构架并使之稳定,确定项目的最大风险。这样在本阶段结束时,我们可以得到一个关于下2个阶段如何工作的综合计划:
一个基于分析模型的基线产品设想(即最初的需求集合)。
至少对第一次构建迭代的评价准则。
一个基线软件构架。
开发和部署产品的必需资源,尤其是人员和工具。
一份日程安排。
足以对构建阶段的成本、日程安排和质量做出"精确"的评估的一份风险决议。
在这个阶段,建立了一个可执行的构架原型;它至少实现了初始阶段识别出的最关键的用例 ,解决了项目的最大技术风险;根据范围、规模、风险和项目新颖程度的不同构架原型需要一次或多次迭代。这是一个生成高质量代码(这些代码成为架构基线)的演进原型,但是也不排除开发出一个或几个试探性的、一次性原型,以降低开发的风险:对需求、可行性、人机界面研究、向投资者演示等的精化。在本阶段的结束时,仍然会产生一个"做还是不做"的决定, 以确定是否要真正投资构建这个产品(或参与合同项目的竞标)。
此时产生的计划一定要足够详细,风险也必须充分降低,可以对开发工作的完成进行精确的成本和日程估算。
入口准则:
前一阶段出口准则所描述的产品和工件
被项目管理者和投资者认可的计划,和细化阶段所需的资源
出口准则:
一份详细的软件开发计划,包含:
更新后的风险评估
一份管理计划
一份人员配置计划
一份显示迭代内容和次数的阶段计划
一份迭代计划,详细计划下次迭代
开发环境和所需的其他工具
一份测试计划
一个基线设想,以对最终产品的一个评估准则的集合的形式
用于评估构建阶段最初的迭代结果的客观、可测量的演进标准
一个域分析模型(80%完成),相应的构架可以称之为是"完整的"
一个软件构架描述(说明约束和限制)
一个可执行的构架基线
3.3. 构建阶段
本阶段可以划分为数次迭代,不断充实构架基线,向最终产品逐步演进或增量演进。在每次迭代过程中,上个阶段(细化阶段)的工件得到扩充和修正, 但它们最终将随着系统向正确和完整的方向的演进而稳定下来。在这个阶段,除了软件本身,还生成一些新的工件:文档(既有内部使用的文档,也有面向最终用户的文档)、测试床及测试套件、部署附件,以及用于支持下一阶段的部署辅助(例如销售辅助)。
对每次迭代,都具有:
入口准则:
上次迭代的产品和工件。 迭代计划必须阐明迭代的特定目标:
将要开发的新增功能,覆盖了哪些用例或场景
本次迭代过程中减少的风险
本次迭代过程中修改的缺陷
出口准则:
更新后的产品和工件,另外还有:
 
一个版本描述文档,记录了迭代的结果
测试用例和根据产品得出的测试结果
一个详细描述下一次迭代的计划
对下一次迭代的客观度量标准
到构建阶段的后期,必须完成以下工件,及本阶段最后一次迭代额外的出口准则:
一个部署计划,指定必需的事项:
打包
定价
演示
支持
培训
移交策略 (例如一个现有系统的更新计划)
产品 (软盘和手册)
用户文档
3.4. 移交阶段
移交阶段是将产品交付给最终用户的阶段。 它涉及销售、打包、安装、配置、支持用户社区和做出修正等.
从技术角度来看,伴随本阶段迭代的是一次或多次发布:`beta' 版发布、正式版发布、修补bug , 或增强版发布。
当用户对产品满意时,本阶段即告结束。 例如,契约性开发时正式验收, 或者产品有关的所有活动都已结束。 此时,某些积累的资产可以加以整理,以为下一个周期或其他项目重用。
入口准则:
上一次迭代的产品和工件, 尤其是足够成熟可以交付给用户的软件产品
出口准则:
前一阶段某些文档的更新,以及必要时根据原始及修订后的成功标准,进行"事后"项目性能分析,从而替换原有计划。
一个简短的清单,列出本次开发周期给组织带来的新的资产
3.5. 演进周期
对于重要的演进,我们应用整个过程递归,仍从起始阶段开始一个新的周期。因为我们已经有了一个产品,所以比起一个初次开发的产品,起始阶段可能大大缩短。细化阶段也可能缩小范围,而在计划方面的关注程度要大于分析或构架的演进方面。需要指出:周期之间可以略有重叠。
较小的演进可以通过延长移交阶段或增加一两次迭代来完成。
移交阶段可以以一个终结过程而结束,即产品不再演进了,但是为了终结它,需要采取一些特定的动作。
 



 
 

 
4. Rational过程中的活动
Rational 过程中各个阶段的名称(如起始、细化、构建、移交)与描述高级活动的术语(如分析、设计、测试等)相差甚远。 因此我们容易理解某种活动的进行并不局限于某个特定阶段,也与其他作者、标准及特定领域的所使用的术语无关。这些活动确实发生,但它们在每个阶段和每次迭代中的程度有所不同。下图表明了活动重点如何随时间的推进而发生演进。
 

图中活动重点的变化也说明尽管每次迭代在形式上都是"相似"的,但它们的性质和内容却是随时间而改变的。
这还表明,一项活动的结束并不总意味着另一项活动的开始,即并不是分析完成了才开始设计,而是这些活动相关的各种"工件"在随着开发者对问题或需求的理解的加深也不断得到更新。
最后,在一个迭代过程中,计划、测试和集成这些活动不是集中堆积在开发活动的开始和结束阶段,而是增量地分布在整个开发周期的各个阶段、每次迭代之中。 它们并不表现为开发过程的某个独立的阶段或步骤。
尽管具体的项目有具体的区别,但对于一个中等规模、初次开发的典型项目来说,其开发周期中各种活动的比例如下:
计划与管理
15%
分析/需求
10%
设计/集成
15%
实施/功能测试
30%
度量/评估/验收测试
15%
工具/环境/变更管理
10%
维护(开发过程中的修补)
5%
 


 
 
5. 生命周期工件
开发过程不是文档驱动的:它的工件中必须一直包括软件产品自身。文档应该十分精简,数目不能太多,应只保留那些确实从管理或技术的角度有真正价值的文档。 Rational 建议保留以下典型的文档集。
5.1管理工件
管理工件不是产品,而是用来驱动或监控项目进展、估计项目风险、调整项目资源,以及使客户或投资者对项目保持一定的"可见性" 的。
一份机构策略文档,是机构开发过程的明文规定。 它包含一个此类项目的实例。
一份远景文档, 描述系统级需求,质量要求和优先级。
一份业务案例文档, 描述财务环境、合同,以及项目的投资回报等等。
一份开发计划文档, 包括总体的迭代计划和当前及近期迭代的详细规划。
一份评估标准文档,包括需求、验收标准及其他特定的技术目标,它们由各个阶段演进的主要"里程碑"组成。包含迭代的目标和验收水平。
每次发布的版本描述文档。
部署文档, 包含对交付、培训、安装、销售、制造和交割相关的有用信息。
状态评估文档: 项目状态的阶段性"快照", 具有进展、人力、开销、结果、关键风险、活动等的度量标准。
5.2技术工件
它们或者是交付的产品,可执行的软件及手册,或者是一些用于制造产品的蓝图,这些产品包括软件模型、源代码和其他有助于理解和演进产品的工程信息。
用户手册, 在生命周期早期开发。
软件文档, 最好以源代码自建文档和模型的形式,其中模型是用合适的CASE工具捕获并维护的这些模型包括用例、类图和过程图等。
一个软件构架文档, 描述软件的整体构架,及它的主要组成元素的分解说明: 类的分组、类、过程、子系统、关键接口的定义和关键设计决策的依据。
本文第3部分中列举的入口准则和出口准则可以映射到这11类文档之中。
上面介绍的这套文档可以依照具体项目的类型进行扩充和删减,一些文档可以合并。 文档不必一定是纸张形式---也可以是电子表格、文本文件、数据库、源代码的注释、超文本文档等等---但相应的信息资源必须被清楚地识别,易于访问,也要保存一些历史记录。
5.3需求
Rational 软件开发过程也不是需求驱动的。 在产品演进的周期中,需求表现为不同的形式:
业务案例给出了主要约束,多是些可用的资源。
远景文档从用户角度仅描述了系统的关键需求,它在开发过程中将缓慢演进。
更详细的需求在第二阶段(细化阶段)以用例和场景的形式进行阐明,并在第三阶段(构建阶段)随着对产品和用户需求了解的加深进一步精化。这些更详细的需求记录在评估标准文档中,它们驱动了构建阶段和移交阶段迭代内容的定义, 并在迭代计划中引用。
 


 
 
6. Rational过程的例子
按照2.4节中所述的区别,Rational 过程采用不同的形式。 这里有两个极端的例子。
6.1大型契约性软件开发的Rational过程
对这个软件开发项目,Rational 过程分为3个阶段建立招标, 对应3个不同类型的合同。
一个研究与设计阶段, 包含了生命周期的起始阶段和细化阶段, 通常以风险分担方式投标,举例来说,成本加奖金合同( cost plus award fee contract ,CPAF)。
一个生产阶段,包含了生命周期的构建和移交阶段, 通常作为一个公司、固定的价格合同(a firm, fixed price contract ,FFP)来投标。
一个维护阶段,对应生命周期的演进阶段,通常作来工作量水平合同( a level of effort contract ,LOE)来投标。
因为用户需要更高的可视性来评估项目,还因为项目涉及大量人员和组织,开发过程应更加正规化,要比小型、内部的项目更加重视书面工件。第5部分列出的11类文档都以某种形式或名称存在。


6.2小型商业软件产品的Rational过程
在按规模分类的过程家族的另一端,是小型的商业软件开发。它的流动性更强一些,只有有限的正规性, 表现为一些主要的里程碑和有限的文档集:
一个产品远景 (A product vision)。
一份开发计划,显示资源和日程安排
版本描述文档,在每次迭代的开始指明本次迭代的目标,在迭代结束时 作为版本说明(release notes)进行更新。
必要的用户手册
软件结构、软件设计、开发过程可以通过代码本身或软件开发环境来进行文档化。
 


 
 
7. 结束语
Rational 过程强调通过快速开发出一个定义了构架的系统的初始版本,从而尽早处理风险问题。它并没有假设您在项目的初试阶段就有一个固定不变的需求集合,而是允许随着项目的演进不断精化需求。它认可并支持需求的变化。 过程不过分倚重文档或"仪式", 它自身就解决了与软件开发相关的那些繁杂任务的自动化。重点主要放在软件产品本身及产品质量上,即最终用户对它的满意程度,以及它要满足的投资回报目标。
一个从本文描述的Rational过程所派生的软件开发过程完全能够符合ISO 9000标准的要求。
 


 
 
 

 
更进一步的读物
B. W. Boehm, "A Spiral Model of Software Development and Enhancement," IEEE Comp., 21 (5), May 1988, pp. 61-72.
G. Booch, Object Solutions: Managing the Object-Oriented Project, Addison-Wesley , Redwood City, California, 1996.
M. T. Devlin, and W. E. Royce, Improving Software Economics in the Aerospace and Defense Industry, Technical paper TP-46, Rational Software Corp., Santa Clara, CA, 1995.
T. Gilb, Principles of Software Engineering Management, Addison-Wesley, Wokingham, UK, 1988.
W. Humphrey, Managing the Software Process, Addison-Wesley, Reading MA, 1989.
Ph. Kruchten, "Un processus de dévelopment de logiciel itératif et centré sur l'architecture," Proceedings of the 4th International Conference on Software Engineering, Toulouse, France, December 1991, EC2.
D. L. Parnas, & P. C. Clements, "A Rational Design Process: How and Why to Fake It," IEEE Trans. on Soft. Eng., SE-12 (2), February 1986, pp. 251-257
 


 
 
 

 
术语表
工件(Artifact):软件产品本身之外的任何文档或者软件。
基线(Baseline ):从属于变更管理和配置控制的版本发布。
构建(Construction): 过程的第三个阶段,在该阶段软件从可执行的架构基线进入准备交付给用户的状态。
周期(Cycle):包含四个阶段的完整的过程,这四个阶段是起始阶段,细化阶段,构建阶段和移交阶段。时间跨度为从起始阶段的开始到移交阶段的结束。
细化(Elaboration ):过程的第二个阶段,在这个阶段定义产品远景及其构架。
演进(Evolution):初次开发周期之后的一个软件生命阶段;产品进行演进的任何一个后续周期。
代(Generation) 一次软件开发周期的成果。
起试(Inception): 过程的第一个阶段,在该阶段,构思、RFP、前一代作为进入细化阶段的开始。
迭代(Iteration) :使用基线规划和评估标准的一个清晰的活动序列。
里程碑(Milestone):采取一个事件来正式初始化并总结一次迭代过程。
阶段(Phase ):在一个过程的两个主要的里程碑之间的时间,在此期间,定义的目标集合与预期相吻合,工件也完成了,并且要做出决定是否进入下一个阶段。
产品(Product):包括作为开发结果的软件,和一些与之相关的工件(文档,发布媒体,培训)
原型(Prototype):不必从属于变更管理和配置控制的一次发布。
发布(Release):最终产品的子集,它是一个主要里程碑的评估目标。(参见:原型,基线)
风险(Risk):正在发生的或者将要发生的一些利害关系,在很大程度上可能阻碍成功地达到主要里程碑。
移交(Transition ) :过程的第四个阶段,在该阶段软件将交付到用户手中。
远景(Vision ):从用户的角度来看,将要开发的产品。
 
 




Sunday, April 23, 2006

Linux 2.6 内核的嵌入式系统应用

Linux 2.6 内核的嵌入式系统应用
摘 要:在分析Linux2.6内核新特性的基础上,在S3C2410开发板上移植了2.6内核和新的文件系统,并成功地对H.264编解码多媒体系统提供了支持。

关键词:Linux 内核 嵌入式系统 S3C2410


  随着多媒体技术与通讯技术相结合的信息技术的快速发展和互联网的广泛应用,PC 时代也过渡到了后PC时代。在数字信息技术和网络技术高速发展的后PC时代,嵌入式技术越来越与人们的生活紧密结合。
  操作系统为用户使用计算机及其外部设备提供最基本的接口程序,管理计算机上的资源。随着应用领域的扩大,为了适应不同的应用场合,考虑到系统的灵活性、可伸缩性以及可裁剪性,一种以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗要求严格的专用计算机系统——嵌入式操作系统随之延生。
  Linux 操作系统是一种性能优良、源码公开且被广泛应用的免费操作系统,由于其体积小、可裁减、运行速度高、良好的网络性能等优点,可以作为嵌入式操作系统。随着2.6内核的发布,Linux向现有主流的RTOS提供商在嵌入式系统市场提出了巨大挑战,例如VxWorks和WinCE,具有许多新特性,将成为更优秀的嵌入式操作系统。
  Linux的低成本和开放性,为其在嵌入式系统领域的应用营造了肥沃的土壤。本文着重介绍Linux 2.6内核的新特性及其嵌入式应用中的优势,并将其移植到嵌入式平台中,成功支持H.264编解码多媒体系统。
1 Linux 2.6内核针对嵌入式开发显著特点
  实时可靠性是嵌入式应用较为普遍的要求,尽管Linux 2.6 并不是一个真正的实时操作系统,但其改进的特性能够满足响应需求。Linux 2.6 已经在内核主体中加入了提高中断性能和调度响应时间的改进,其中有三个最显著的改进:采用可抢占内核、更加有效的调度算法以及同步性的提高[4]。在企业服务器以及嵌入式系统应用领域,Linux 2.6 都是一个巨大的进步。在嵌入式领域,Linux 2.6 除了提高其实时性能,系统的移植更加方便,同时添加了新的体系结构和处理器类型——包括对没有硬件控制内存管理方案的 MMU-less系统的支持,可以支持大容量内存模型、微控制器,同时还改善了I/O子系统,增添更多的多媒体应用功能[4]。
1.1 可抢占内核
  在先前的内核版本中(包括2.4内核)不允许抢占以核心态运行的任务(包括通过系统调用进入内核模式的用户任务),只能等待它们自己主动释放CPU。这样必然导致一些重要任务延时以等待系统调用结束。
  一个内核任务可以被抢占,为的是让重要的用户应用程序可以继续运行。这样做最主要的优势是极大地增强系统的用户交互性。
  2.6内核并不是真正的RTOS(Real Time Operation System),其在内核代码中插入了抢占点,允许调度程序中止当前进程而调用更高优先级的进程,通过对抢占点的测试避免不合理的系统调用延时。2.6内核在一定程度上是可抢占的,比2.4内核具备更好的响应性。但也不是所有的内核代码段都可以被抢占,可以锁定内核代码的关键部分,确保CPU的数据结构和状态始终受到保护而不被抢占。
  软件需要满足最终时间限制与虚拟内存请求页面调度之间是相互矛盾的。慢速的页错误处理将会破坏系统的实时响应性,而2.6内核可以编译无虚拟内存系统避免这个问题,这是解决问题的关键,但要求软件设计者有足够的内存来保证任务的执行。
1.2 有效的调度程序
  2.6版本的 Linux内核使用了由 Ingo Molnar开发的新的调度器算法,称为O(1)算法,如图1所示。它在高负载情况下执行得极其出色,并且当有很多处理器并行时也可以很好地扩展[2]。过去的调度程序需要查找整个ready task队列,并且计算它们的重要性以决定下一步调用的task,需要的时间随task数量而改变。O(1)算法则不再每次扫描所有的任务,当task就绪时被放入一个活动队列中,调度程序每次从中调度适合的task,因而每次调度都是一个固定的时间。任务运行时分配一个时间片,当时间片结束,该任务将放弃处理器并根据其优先级转到过期队列中。活动队列中任务全部调度结束后,两个队列指针互换,过期队列成为当前队列,调度程序继续以简单的算法调度当前队列中的任务。这在多处理器的情况更能提高SMP的效率,平衡处理器的负载,避免进程在处理器间的跳跃。


图1 O(1)调度算法

1.3 同步原型与共享内存
  多进程应用程序需要共享内存和外设资源,为避免竞争采用了互斥的方法保证资源在同一时刻只被一个任务访问。Linux内核用一个系统调用来决定一个线程阻塞或是继续执行来实现互斥,在线程继续执行时,这个费时的系统调用就没有必要了。Linux2.6所支持的Fast User-Space Mutexes 可以从用户空间检测是不是需要阻塞线程,只在需要时执行系统调用终止线程。它同样采用调度优先级来确定将要执行的进程[4]。 多处理器嵌入式系统各处理器之间需要共享内存,对称多处理技术对内存访问采用同等优先级,在很大程度上限制了系统的可量测性和处理效率。Linux2.6则提供了新的管理方法——NUMA(Non Uniform Memory Access)。NUMA根据处理器和内存的拓扑布局,在发生内存竞争时,给予不同处理器不同级别权限以解决内存抢占瓶颈,提高吞吐量。
1.4 POSIX线程及NPTL
  新的线程模型基于一个1:1的线程模型(一个内核线程对应一个用户线程),包括内核对新的 NPTL(Native POSIX Threading Library)的支持,这是对以前内核线程方法的明显改进。2.6内核同时还提供POSIX signals和POSIX high-resolution timers。POSIX signals不会丢失,并且可以携带线程间或处理器间的通信信息。嵌入式系统要求系统按时间表执行任务,POSIX timer可以提供1kHz的触发器使这一切变得简单,从而可以有效地控制进度。
1.5 微控制器的支持
  Linux2.6内核加入了多种微控制器的支持。无MMU的处理器以前只能利用一些改进的分支版本,如uClinux,而2.6内核已经将其整合进了新的内核中,开始支持多种流行的无MMU微控制器,如Dragonball、ColdFire、Hitachi H8/300。Linux在无MMU控制器上仍旧支持多任务处理,但没有内存保护功能。同时也加入了许多流行的控制器的支持,如S3C2410等。
1.6 面向应用
  嵌入式应用有用户定制的特点,硬件设计都针对特定应用开发,这给系统带来对非标准化设计支持的问题(如IRQ的管理)。为了更好地实现,可以采用部件化的操作系统。Linux2.6采用的子系统架构将功能模块化,可以定制而对其他部分影响最小。同时Linux2.6提供了多种新技术的支持以实现各种应用开发,如Advanced Linux Sound Architecture(ALSA)和Video4Linux等,对多媒体信息处理更加方便;对USB2.0的支持,提供更高速的传输,增加蓝牙无线接口、音频数据链接和面向链接的数据传输L2CAP,满足短距离的无线连接的需要;而且在2.6内核中还可以配置成无输入和显示的纯粹无用户接口系统。
2 应用研究
  在S3C2410开发板上移植嵌入式Linux 2.6.11.7内核系统,应用于构建H.264多媒体系统。
2.1 建立交叉编译环境
  在RedHat9的主机上进行内核移植开发,首先需要建立交叉编译环境。由于2.6内核中采用了一些新的特性和指令,需要采用较新的工具集,采用binutils-2.15、gcc-3.4.2、glibc-2.2.5、linux-2.6.8、glibc-linuxthreads-2.2.5来建立交叉编译工具链,建立之后将工具链路径加入系统路径$PATH中。
2.2 内核修改
  Linux 2.6.11.7内核加入了对S3C2410芯片的支持,不再需要任何补丁文件。修改内核源码中Makefile的交叉编译选项ARCH=arm,CROSS_COMPILE=arm-linux-。针对硬件配置,需要在arch/arm/mach-s3c2410/devs.c或者smdk2410.c中添加FLASH的分区信息s3c_nand_info,如表1。

表1 NAND FLASH分区表
分区名 起始地址 大 小
Vivi 0x00000000 0x00020000
Param 0x00020000 0x00010000
Kernel 0x00030000 0x001c0000
Root 0x00200000 0x00200000
Usr 0x00400000 0x03c00000

  然后在s3c_device_nand中增加.dev={.platform_data= &s3c_nand_info},在arch/arm/mach-s3c2410/mach-smdk2410.c中的__initdata部分增加&s3c_device_nand,使内核在启动时初始化NAND FLASH信息。
2.3 内核编译加载
  对内核进行适当的配置是一个量体裁衣的过程。由于2.6内核会根据本地系统配置进行初始设置,可以导入内核源码默认s3c2410的配置文件,方便加载内核基本配置,然后再选择所需选项。对MTD配置选择支持MTD设备驱动以及NAND FLASH驱动;选择支持要用到的各类文件系统(DEVFS、TMPFS、CRAMFS、YAFFS、EXT2、NFS)以及网络设备和协议,本系统加载了网络芯片CS8900以及USB支持;在H.264多媒体系统中还需要加载Frame buffer以支持LCD显示功能。使用交叉编译工具编译内核源码后, 会在arch/arm/boot/下生成名为zImage的内核映像,在Boot loader的命令提示模式下使用下载命令完成内核加载到开发板的存储设备FLASH中。编译过程(相对以前版本的编译过程,2.6内核编译有所简化):
  make mrproper
  make menuconfig(字符界面,或者用make xconfig图形界面,但需要Qt库的支持,而make gconfig则需要GTK库的支持)
  make
  make bzImage
2.4 文件系统
  Linux采用文件系统组织系统中的文件和设备,为设备和用户程序提供统一接口。Linux 支持多种文件系统,本系统使用CRAMFS格式的只读根文件系统,而将FLASH中的USER区使用支持可读写的YA FFS文件系统格式,方便添加自己的应用程序。
  在根文件系统中,为保护系统的基本设置不被更改,采用CRAMFS格式。采用DEVFS来实现基本设备的建立挂载,同时使用BusyBox也是一个缩小根文件系统的办法,提供了系统的基本指令;还需要建立一些必备的目录,添加所需配置文件,如fstab、inittab等;还有一个重要的工作就是添加系统应用必备的动态函数库。使用生成工具mkcramfs 将整个根文件目录里的内容制作成映像文件。
  mkcramfs rootfs rootfs.ramfs
  YAFFS文件系统格式的支持需要将驱动加入到内核代码树下fs/yaffs/,修改内核配置文件,就可以在内核编译中加载对该文件系统的支持。使用mkyaffs工具将NAND FLASH分区格式化为YAFFS分区,将mkyaffsimage生成的应用程序镜像烧写进YAFFS分区,在启动时通过写入fstab自动加载YAFFS分区即可。
2.5 网络设备驱动
  系统中采用CS8900A的10M网络芯片,它使用S3C2410的nGCS3和IRQ_EINT9,相应修改linux/arch/arm/mach-s3c2410/irq.c,并在mach-smdk2410.c的smdk2410_iodesc[]中增加{SMDK2410_ETH_IO,S3C2410_CS2, SZ_1M, MT_DEVICE},内核源码中加入芯片的驱动程序drivers/net/arm/cs8900.h和cs8900.c,并且配置网络设备驱动的Makefile和Kconfig文件,加入CS8900A的配置选项,这样可以在内核编译时加载网络设备的驱动。
  在Linux2.6应用的同时,也要看到其与以前版本内核比较存在的一些问题。在内核的编译时间、内核镜像大小、内核占用RAM空间大小、系统启动时间相对Linux2.4而言都存在不同程度的不足,但在硬件条件日益进步的现今可以接受,而且一部分也是由于功能加强必然带来的。虽然Linux并非一个真正的实时操作系统,但2.6内核的改进能够满足大部分的应用需求,所以Linux2.6内核将会在嵌入式系统领域大展身手。

Wednesday, September 15, 2004

DSP 应用优化技术

http://www.ti.com.cn/customer/article/2004/01/0112_02.asp

Wednesday, July 28, 2004

Multi-threaded Client/Server Socket class Posted by Hello