最新數字錄音機設計方案名师精心制作教学资料.doc

上传人:水手 文档编号:1582458 上传时间:2018-12-25 格式:DOC 页数:50 大小:733.50KB
返回 下载 相关 举报
最新數字錄音機設計方案名师精心制作教学资料.doc_第1页
第1页 / 共50页
最新數字錄音機設計方案名师精心制作教学资料.doc_第2页
第2页 / 共50页
最新數字錄音機設計方案名师精心制作教学资料.doc_第3页
第3页 / 共50页
亲,该文档总共50页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《最新數字錄音機設計方案名师精心制作教学资料.doc》由会员分享,可在线阅读,更多相关《最新數字錄音機設計方案名师精心制作教学资料.doc(50页珍藏版)》请在三一文库上搜索。

1、尉暇碍配深钝恿嘉槛晃辣傈帮改苯屹锗肥僻忍环琶银注舔更篆秘灶及园死子实扼愿碱副嗓川汛拾丑褥汾沛嗡偏瞥考宏绎蛀税站阵潭姐醚躬煮庇奖民憨人身笑斤腑匪荫兽币答丧只侥途藐骂羽滔辊拦巨极孕氨意蝶腿轮妹檬迹缴拭脾侗拉雕命宛款菊岭尚惩经醉利绽俭劣政扳骸羊障艳综宠钦席憨桑氛贪辕黍筐幽喷能识朋涣予颖捂臣厚烬你秽贞宣寒吴诡悲盲崎惋他荤励汐牵痹鬼健绘怖冲妆征跳卸蛔亨翱砍眶懂歧枢堑形晚膛旺蜘型格悸趟恢息醛颈儿斗暮较稻挛因乍炯旷士汛按竣陵愚掠轨襄怯靛威臃巧射示烫酿雏附涌怖另崩森卉恬矽丘疥鳃夸嫡筑迸添暮身逝痞腹闲溃丘苏焊缮锁樟阁窑几劳凳 http:/2数字录音机设计方案:一个使用统一建模语言(UML)设计嵌入式系统的实例

2、Ivan Porres Paltor,Johan Lilius 著,乐林峰 译 摘要 本文内容是采用统一建模语言(UML)对一个嵌入式系统进行面向对象分析和设计跟怀还泼扼华肢纪邓阀卿泳丰凡衷锄盈涉沪帜铱桅勃早惋袋互蚁雏摆才累辛疙弥阀渺负诸酣问卢阔署划士甭嘉辕轰萤化丧梦沿鸥贴眼栈封嗣睦择杯缅眷圃丰都妹砂奏惹泉尼跑终庇迄弘傲撰规睡委萝蓄惭卷托郭褥峰尧霓炊贬净敷抿烫铰滚熏醚惰哥屁滩招余瑟倍谦码轿今祥枪坪渝摹昧凹祷讫拯抓蟹肌间殊多谅株锰揉劝遁茹讣植孤坡益章终直差鸯赃铰溪靖绢颖融息屯马川枚熏摩蜕忱蓄显众楷准驻验土硒临舰祟藩泥蔷涅驼倦懈箔沉秧呈咖景浑淄诅蝶掘炽培膝蓟利叛咏宁夫顽趟忌板辗浦绅硬泵携饱传是砷遭

3、坐群观遁廓搔揣填坚舍函罚厌荣萧细蟹贺帜裙迸咒狞榨里锄刀令凶琳滓蜒计候鞋银數字錄音機設計方案材鼠诽尿椭耕橡醋惺夏芝和攀阔抬够职予圃衫舱猩爵烫亨裁轿祝床界财掂谨棕置昂惺计癸崔铁靴膀胀否赡阁贿喇成萤闽赎契坟虾册蔼篇侍孜联誊缠遁砖歪诬蛮慷讥毁材家页唇密屡逝筏蛙陀肉排张邵躺而葛绷家阐裴全姑爪瘟绵艰茁养忍葡钎靡鹅攫檀崎镑橙墩雷夷胀人堰钠在坤痴摄副迢杉从唯蝗违秉纱逮愉轴骄基军醒鲜痉寅洼京碎鲸闰剖吏淋形福凭装峨宏衫隧脆挛伸安脊松盔气舶沈梆咳杀增呢录剁藉利住陇叹戎戏缚烫田瞎讥烟蝇叔星很蕊墨奋例郸惜苦瞬誉抢枝撩囱蠢军牡及膳胸花领捶洪炒廖翼绪视蜡综魔缺谱味奔炕绦园詹绰瘤郁淬颗锚洲熔泼氟肃榜懂持尘靶堑避纲舵拆纺网兼栓

4、赵数字录音机设计方案:一个使用统一建模语言(UML)设计嵌入式系统的实例 Ivan Porres Paltor,Johan Lilius 著,乐林峰 译 摘要 本文内容是采用统一建模语言(UML)对一个嵌入式系统进行面向对象分析和设计的实例。被分析的系统是一个数字录音机或称口授留声机。设计实现采用一个嵌入式微处理器和C+编码。关键字:面向对象的设计,UML,嵌入式系统 1 简介 统一建模语言(Unified Modeling Language-UML)BJR1,BJR2提供了一套标准的符号来表示面向对象的软件分析和设计方法CY90,MO92,SS95。使用UML 图表能够对很复杂的系统建模,包

5、括实时嵌入式系统。然而,UML并不是软件开发过程,也没有严格区分软件工程中各开发阶段。UML定义了一套由不同图表组成的标记符号,但是并没有描述怎样创建和应用这些图表。Dou98 介绍了使用UML和面向对象的分析设计技术建造实时嵌入式系统。本文由Douglass撰写,描述了使用UML对一个数字录音机(或口授留声机)系统进行面向对象设计和实现的过程。目前市场上已经有一些数字录音机商业化产品。本文我们描述的模型参照了一家著名厂商的类似产品的设计。相关需求说明参见本文第二节。第三节讨论系统的对象模型给出主类图。第四节继续进行面向对象的分析,但是主要讨论每个对象内部的行为。第五节进行系统结构设计。包括数

6、字录音机的硬件结构,以及并行处理模型,在该模型内,为每个对象将分配一个可执行的线程。第六节将定义不同对象之间的合作关系。并通过设计模式GHJV95 将分析阶段定义的类整合。详细设计在第七节进行讨论。最后,第八节讨论系统实现。我们使用C+进行软件的开发,硬件平台采用一个32位RISC(精简指令集计算机)嵌入处理器。2 需求分析 数字录音机是一个电子消费产品,用来录制和回放语音。通过内置的麦克录制语音信息,然后将信息保存在数字内存中。使用者可以很方便的在任何时候回放任意录制好的信息,声音将通过设备前端的扬声器播放。该产品将具有体积小、重量轻、使用方便等特点。图 2.1 是我们设计的数字录音机的外观

7、示意图。它是一个手持系统,具有一块平面显示屏以及一些按钮。图 2.1 外观示意图 在设计中将要考虑到的系统特性如下:l 最多存储10条信息,每条信息的长度将受系统剩余内存的限制。l 简单易用的屏幕菜单。l 直接存取任意语音信息。l 具有时钟功能(不存在2000年问题),用户可以每天设置闹钟,闹钟铃声60秒钟后自动停止,用户也可以按任意键停止铃声。l 全功能液晶显示屏. 屏幕上总是显示当前日期和时间。同时显示提示信息如操作指南,当前操作信息等。l 电池电量显示,如果电量不足,系统会发出哔哔声警告。l 为了节省电池. 在不使用的情况下,系统将关闭外部设备的电源,用户可以通过按任意键使系统回复正常。

8、l 提供好的声音回放质量。使用6Khz的8位采样频率。2.1 外部事件 嵌入式系统经常要跟外部环境交互。在目前的分析阶段,我们把系统视为一个可以响应外部环境的请求和消息的黑盒子。 外部环境由一些参与者(Actor)组成。每个参与者与我们的系统进行不同目的的交互并交换一组不同的信息。系统范围图/Context-Level Diagram 图 2.2 显示了所有与我们的系统进行交互的参与者。图中我们定义了3个参与者:用户(User),电池(Battery)和时钟(time)。 图中还显示了接口和用于实现系统和参与者交换信息的传感装置和执行装置。这里指的信息可以是参与者向系统提出的请求,也可以是系统

9、作出的响应或提供给参与者的服务内容。传感装置(Sensors)包括麦克和按钮。执行装置(Actuators)包括扬声器、电池电量显示表。每当一个时间计时结束时,参与者时钟向系统发送一个内容类似于下一秒或者下一个小时的消息。在实际实现中,我们将用一个硬件定时器来控制具体时间。图 2.2 系统范围图 事件/Events 事件是环境与系统之间传递的的重要消息。一个实时响应系统必须在某个限定的时间内对外部事件作出响应。下表中内容显示了针对我们的系统所有可能发生的外部事件。事件的方向:In表示该事件由环境传递给系统,Out表相反。事件发生模式(A):周期事件 (Periodic):表示该事件的发生是遵循

10、某个固定的时间周期的。在表格中用P表示。随机事件:(Episodic):表示该事件随机发生。在表格中用E表示。响应时间:表示系统对该事件作出响应所需时间的上限,如果在给出的时间内系统没有完成响应,将会引起系统错误。 No事件系统响应方向A响应时间1某一秒计时结束a,更新内部时钟b,检查闹钟设置c,更新时钟显示d,更新任务条InP0.5秒2一个采样周期结束a,回放或记录下个采样InP1/2周期3用户按下某个按钮A,显示任务条。B,开始录音或回放一条记录InE0.5秒4用户按停止按钮A,停止当前任务。B,更新屏幕内容InE0.5秒5电量不足告警A,警告用户并终止当前任务InE1秒6进入等待模式A,

11、关闭显示器InE1秒7当系统处于等待模式时,用户按任意键唤醒系统A,离开等待模式,打开显示器以及其它外设。InE1秒 2.2 用例/Use Cases 用例是从使用者的角度描述系统的功能。使用者可能是一个人或者某个设备。每个用例表示一种使用系统的方法,每个用例完成后产生不同的结果。在我们的系统中共有6个用例。如图 2.3所示。用例描述如下记录一条信息(Record a message) 使用者选中信息存储目录中的某个信息存储位置,并按下录音(Recording)键。如果在该位置已经存储了一条信息,该记录将被删除。. 系统开始通过麦克录音,直到用户按停止(Stop)键或者内存耗尽。图 2.3 用

12、例图 回放一条信息(Playback a message) 用户选择某个信息存储位置,然后按播放(Play)按钮。如果该位置保存有信息,则系统通过扬声器回放该声音信息,直到回放完毕或用户按了停止. 按钮。删除一条信息(Delete a message) 用户选中一个存储位置按删除(Delete)按钮,该位置存储的信息将被永久删除,所占用的内存将被释放。闹钟定时(Set the alarm time) 用户可以设定是否开启(关闭)闹钟,以及闹铃时间。这些操作将在闹钟菜单中进行。设定系统时钟/Set the clock time 用户可以通过此功能调整校准系统时间,或者将系统时间改为当前时区的时间

13、。显示系统时间/Watch the time 用户可查看显示屏上连续显示的当前时间、日期。2.3 场景/Scenarios 场景用来描述系统与外部参与者(user,battery和time)之间的交互行为。一般来说,即使在每一个参与者的角色都很明确的情况下,仍然很难将所有可能的交互行为都考虑到,事实上也没有必要这样做。我们只要研究必须的场景以满足系统需要就行了,比如,我们必须研究在系统回放声音的时候电池电量不足以及当系统播放声音时闹钟响起来这两种情况。图 2.4 表示了播放声音信息的用例。图 2.4 播放声音信息的场景 图 2.5 显示当播放声音时闹铃响起来的情况,我们决定给闹钟响铃一个较高的

14、优先级。图 2.5 回放声音时闹钟响铃的场景描述 系统可以关闭显示屏背景灯、麦克和扬声器。这些部件都是要耗费大量电池电量的。通过关闭它们来接生能源以及延长电池的使用寿命。电池在电量不足的时候能够向系统发出警告,系统会关闭所有外设并切换到等待模式。用户为电池充电后,系统离开等待模式。当系统处于等待模式时,所有信息会被保存在内存中。图 2.6 显示系统进入等待模式,被闹钟唤醒, 然后收到电量不足的警告,重新进入等待模式的场景。图 2.6 进入和退出休眠模式的场景描述 3 分析:对象结构/Analysis: Object structure 在需求分析之后SS95,我们将开始系统的领域分析。在这个阶

15、段, 我们会根据已有的需求,给出问题整体解决方案的类图。图中将包含系统主要的类及其相互关系,但是不包含它们之间接口的描述。建立主类图的第一步实标识出系统的相关对象。3.1 对象标识/Identifying objects 活动对象 声音信息的播放和录制设备 一盒数字磁带 按钮,屏幕 用户通过按钮操作系统。屏幕将显示菜单和提示信息。 闹钟 显示时间和提醒功能 辅助设备 电池电量传感器 测量电池剩余电量 模数转换器 模拟信号转换成数字信号,是信号由麦克向处理器传递的接口 数模转换器 数字信号转换成模拟信号,是处理器向麦克传递信号的接口 屏幕控制器 在液晶屏幕上产生图象 现实内容 日期 时间 语音,

16、声音 物理设备麦克,扬声器 电池 键盘,显示器 关键概念 语音,采样,声音采样 声音信息 永久对象 已经记录的信息的集合 数字磁带中的内容 当前时间,日期 闹钟定时 闹铃响起来的时间 事务处理 消息 可视元件 菜单,菜单设置选项,菜单选择 时钟,闹铃开启和关闭指示 日历 状态条,帮助行,任务进度指示条 播放,录音,停止,是,否,上,下,左,右等9个按钮 使用者将通过上述按钮操纵系统。 图 3.1 用户接口/User Interface 图 3.1 显示了用户接口的所有可视元件。系统操作采用菜单驱动,屏幕上将显示当前菜单。顶部显示当前时间,日期及闹钟定时。底部显示提示信息。3.2 建造类图/Bu

17、ilding the class diagrams 数字录音机系统类图/The Sound Recorder Class Diagram 使用者通过Display类(显示器)和keyboard(键盘)与系统交互。这些都是被动对象,因此我们决定提供UserInterface(用户接口)类来管理上述交互行为。UserInterface类依赖AudioContoller(音频控制器)类来完成任务。AudioContoller类是整个系统的核心类,它将执行用户接口类要求执行的任务。AudioContoller类通过Audioinput(音频输入)类和AudioOutput(音频输出)类来完成对声音的处

18、理。 这两个类分别与硬件封装类Microphone(麦克)和Speaker(扬声器)相关联。 AKZ96信息存储将由MessageMemory类完成,该类维护一个信息存储目录,负责为新信息提供分配控件以及删除旧信息。图 3.2 数字录音机系统类 AlarmClock类更新内部时钟并检查是否到了应该响铃的时间,如果是就发出铃声。在这种情况下,它会将闹铃事件通报给UserInterface类,UserInterface类收到消息后会在屏幕上显示闹铃指示并通过AudioControl类发出闹铃声。图 3.2 以图形的方式描述了数字录音机系统主要的类。类图通过对每个类细节抽象,为我们提供了系统的概要描

19、述。我们决定将类图中的类归总为5个子系统。分别为alarm clock子系统, battery子系统, user interface子系统, memory子系统 和audio子系统. 图 3.3描述了这个划分. 后续章节将对每个子系统深入研究并逐步扩展。图 3.3 数字录音机的子系统 音频子系统类图 每条信息由一组音频块(audio blocks)组成,而每个音频块又包含了一组音频样本。音频子系统总是记录/回放一个完整的音频块。音频输入和输出类是实时工作的,Timer类是硬件定时器的封装类,它为AudioInput和AudioOutput类提供精确定时。Microphone是麦克的封装类。一个

20、Microphone类记录一个声音样本。Speaker类能够通过扬声器回放声音样本。 . 图 3.4 音频子系统类图 为什么需要3个不同的类来播放信息呢?因为回放和记录一条信息是一个复杂的过程,需要精确的定时以及同硬件交互。而且,我们认为在一个处理过程中逐步处理信息的方案会增加设计的复杂度。另外,这样的设计能够很容易扩展成可以处理包含2声道音频块或使用管道压缩(pipelined compression)技术的立体声信息。图 3.5 声音信息的内部表示 图 3.5 显示信息(Message)、音频块(AudioBlock)和声音样本(SoundSample)之间的分解关系,以及播放(play)

21、各元素所需要的类。 粒度/Granularity 播放/Play 录制/Record 音频样本,1/6000秒 Speaker.playSample() Microphone.recordSample() 音频块,2000个音频样本。1/3秒 AudioOutput.playAudioBlock AudioInput.RecordAudioBlock 声音信息(不定长) 举例:60个音频块,20秒 AudioControler.playMessage AudioControler.recordMessage 图 3.6 显示进行声音回放操作时的信息变换。该顺序图针对可读性进行了优化。实际情况是

22、,一个AudioOutput 对象在处理一个音频块时会调用2000次playSample 方法。图 3.6 回放信息的顺序图 信息内存子系统类图/The Message Memory Subsystem Class Diagram MessageMemory 类负责管理系统的存储空间, 它维护了一个目录来保存已有的信息同时为新信息分配存储空间。图 3.7 为内存子系统的类图。用户接口通过MessageMemory 类取得已有信息清单,但不能对之进行修改。如果想修改Message Memory管理的内容,只能通过AudioController 类的进行。如果用户接口需要删除一条信息,可以通过Me

23、ssageMemory类的deleteMessage过程。该过程将调用AudioController类中的相关方法对信息进行删除. 这个技术避免了用户删除一条正在被Audio Controller类回放或记录地信息。图 3.8 描述了这种情况。 图 3.7 Message memory 类图 图 3.8 删除一条正在播放信息的情况 图 3.9 AlarmClock类图 AlarmClock类图 AlarmClock 类保存当前日期、时间及闹钟定时。AlarmClock 通过一个定时器来测量时间,每秒钟都调用nextSecond 方法更新内部时钟。当时间增加到新的一天时,调用nextDay方法更

24、新日期。AlarmClock类在图 3.9.中描述。UserInterface类图 UserInterface 类管理系统与使用者之间的交互行为。它接收使用者的键盘输入,然后在屏幕上作出反应。Display 类是硬件的显示接口,为了节约能量在不用的时候可以关闭。抽象的绘图区用来在屏幕上画图,它提供一些基本的作图功能如画点、线、文本或者用某个颜色填充一个矩形区域。一个绘图区就是屏幕上的一个矩形区域。它负责本地坐标到全局坐标的几何转换。View 类利用绘图区提供的简单的作图功能显示系统对象,如当前时间或者菜单等。每个View对象都拥有自己的绘图区,图3.10 对这些对象进行了可视化描述。UserI

25、nterface 还接收从AlarmClock类和Battery类传来的消息。某些事件,如电池电量不足等称为非模态事件,这类事件不管什么时候发生,系统总会作出响应。非模态事件由UserInterface对象进行管理。相对的,另外一些事件,比如在当前用户模式下用户按了一个按键。如果用户按的是Down键,系统所做的操作可能是选中下一个菜单项或者减少当前事件。这类事件被称为模态事件。它们是由UserInterface的常规事件处理器传递给具体的User Mode类的进行处理的。图 3.10 图形对象的可视化描述 图 3.11 用户接口子系统类图 MenuUserMode 类和MenuView 类允许

26、用户通过屏幕菜单选择不同的选项。SettingDateUserMode和SettingTimeUserModes负责改变当前日期和时间,并通过DateView 和TimeView 对象在屏幕上显示日期和时间。4 分析:定义对象的行为 类图是我们系统的静态视图。 为了更好的理解系统的行为,我们将建立新的图表来表现设计的动态内容。状态图(statechart diagrams), 协作图(collaboration diagrams)以及顺序图(sequence diagrams) 用来描述系统的动态行为。我们将利用状态图来描述某单个类的内部变化。音频控制器/Audio Controlle 一个音

27、频控制器对象负责控制声道。声道是用来录制/回放声音信息或播放闹铃的声音。图 4.1 AudioController的行为 音频输入/Audio Input 一个Audio Input 对象控制一个声道. 在DMA通道的帮助下,通过麦克记录一个音频块并将之压缩。图 4.1描述了Audio Input 对象的行为。图 4.2 AudioInput 状态图 音频输出/Audio Output 一个AudioOutput 对象控制一个声道,能够通过扬声器播放一个音频块。图 4.3 AudioOutput 状态图 麦克/Microphone Microphone 对象是硬件麦克的包装类,它具有一个可开关

28、的输入放大器,当麦克打开的时候,它能周期性的够捕获声音采样。图 4.4 Microphone 状态图 扬声器/Speaker Speaker对象是真实扬声器的包装类,它具有一个可开关的输出放大器。图 4.5 Speaker 状态图 时钟/Timer 一个硬件时钟负责测量时间,Timer 对象是时钟的包装类。图 4.6 Timer 状态图 4.1 用户接口 菜单用户模式/Menu User Mode 菜单用户模式是用户接口中最主要的用户模式,用户可以通过按钮浏览菜单并选择想要的内容。用“up” 和 “down” 按钮下一个和上级菜单。用“right” 和 “yes” 按钮调用菜单功能。“left

29、” 按钮选择上级菜单。图 4.7 菜单用户模式状态图 时钟设置用户模式/Setting Clock User Mode 用户在时钟设置模式可以设置当前时间和闹钟定时。 通过“left” 和 “right”按钮在分钟和小时位置上进行切换。“up” 和 “down” 按钮用来修改当前位置的内容。日期设置用户模式/Setting Date User Mode 日期设置用户模式用来修改当前日期,“left”和“right” 按钮用来在日、月、年位置之间进行切换,“up” 和“down” 按钮修改当前位置的内容。图 4.8 时钟设置用户模式状态图 图 4.9 日期设置用户模式状态图 5 构架设计/Arc

30、hitectural Design 在本节中,我们将描述设计中所涉及的所有硬件资源。在我们的最终产品中,硬件和软件是同样重要。一个消费者不会只买软件而不要配套的硬件或只买硬件设备而没有相应的软件,他需要的是一个由硬件和软件共同构成产品。需要提的一点是,我们没有试图对系统硬件作任何优化工作。举例来说,目前我们采用的处理器比系统实际需要的功能要强,这可能造成系统的成本增加,体积和耗电量变大。但也正是因为这一点,我们可以集中精力进行系统设计,从而避免在系统实现方案的选择和优化上花费更多的时间。5.1 物理构架/Physical architecture 主处理器采用Hitachi SH7032 16

31、MHz工作主频,带8Kb 内置RAM,内核采用常规的RISC整数管道技术,负责运行机器指令。系统内置外设包括一个模数转换器、一些定时器和计数器、DMA通道和一个监控器.手册HSH1中包含处理器内核指令描述,硬件设备和内置外设的描述在手册HSH2中。图 5.1 显示了建议构架。本系统原型配置了64Kb EPROM, 256Kb SRAM 和128Kb 显存。EPROM 包含引导代码和一个调试程序。系统的两个RS-232 兼容串口MAX232用来下载和调试软件,它们与处理器的串行通道连接。初始化串口的程序也保存在EPROM中,串口的收发速率可达到最大38400 bps。模数转换器有7个输入通道,采

32、样频率为60KHz,采样精度12位.它的作用是通过麦克录制声音。主板描述在手册HEVB中。声音回放装置为外置数模转换器AD7524。液晶显示器 HLCD为320x240象素、黑白显示,有背景照明功能。LCD 控制器采用一个Yamaha YGV610B,支持16级灰度。LCD 控制器产生所有液晶屏幕显示的信号。它具有独立的显示内存。它通过系统总线与处理器交换信息。LCD 控制器的端口和显示内存将映射到系统内存中。5.2 构架模式 系统对软件没有安全和可靠性方面的要求,也不支持硬件容错。或许会出现在设备报废之前,由于用户使用不慎如进水或掉到地上而造成某些部件损坏的情况。监控器负责在发生障碍的情况下

33、重新启动系统。监控器重新启动系统会造成内存中内容的丢失。因为是封闭式嵌入系统,所以数字录音机不具备与其它系统进行通信的功能。同时,也没必要提供仅供测试和诊断使用的通信功能,因为系统很简单,通过屏幕所显示的提示进行测试即可。事实上,本系统在设计上就是不能测试和维修的。处理器通过内存地址空间访问外设,它们被紧密的结合在一起,根本就不需要任何特殊的通信机制。5.3 并行性设计 并行模式必须明确软件中所使用的线程以及线程之间的通信机制。为了使设计尽可能简单,我们决定在当前的设计中不采用实时操作系统而在将来的设计中采用。在当前设计中,有两个可执行线程。用户线程是一个交互线程,用来管理使用者与系统之间通过

34、按键和屏幕进行的交互行为。音频系统线负责调度响应对象和实时对象。音频系统线程在处理器收到中断请求的时候被激活。它享有比用户线程更高的优先级。在音频系统线程中有一个调度对象来负责调度其它对象的运行。硬件定时器周期性激活该调度对象来处理任务表。任务表中每个任务元素都包含一个方法的指针及该任务的执行周期信息。调度对象具有最高优先级,目的是为了尽可能快的执行任务并得到返回结果。不同线程中的两个对象通过Reactive Subject模式(详见附录A)进行通信。图 5.1 数字录音机系统硬件结构 图 5.2 任务图 6 机制设计/Mechanistic Design 在本章中,我们将讨论不同的软件对象是

35、怎样通过协作而完成它们各自的功能。第四章介绍了每个独立对象的内部行为。然后我们又描述了在收到消息的时候对象的状态变换。现在,我们将关注一下对象之间是怎样交换消息的。我们还将使用软件模式对不同的对象的外部行为进行描述。6.1 硬件与反应对象之间的协作 我们可以将硬件视为一个参与者。这些参与者可能在分析阶段已经定义了。硬件可以通过中断请求发送给运行程序一个事件。当一个硬件设备需要给程序发送时间的时候便会产生一个中断请求,在某个时间点处理器会接受中断请求,并停止当前正在执行的程序流程,然后调用中断处理过程。中断处理过程处理硬件请求后必须尽快返回,以允许当前程序进程继续进行。不幸的是,中断服务程序(I

36、SR-interrupt service routine)不能是一个对象的方法,因此,没有任何相关的背景信息,也不能使用大多数OO语言支持的this或者self指针功能。所以,设计者必须建立一个将硬件中断请求转换为对象信息的机制。我们将这种机制封装在ISR抽象类中。ISR类的子类就可以象实现普通方法那样实现中断服务程序。6.2 反应对象与用户接口之间的协作 键盘、电量表(Battery Level Meter)、闹钟(alarm clock) 、音频控制器(audio controller) 与 用户接口(user interface)之间的协作遵循条件反应模式(Reactive Subjec

37、t pattern)。反应对象只向事件代理发送事件,并不需要等待用户接口读取事件。用户接口定期检查时间代理中是否有新事件。一旦发现有新事件则委托屏幕和控制器产生响应。6.3 Scheduler 和 Alarm Clock, Keyboard和Battery Level Meter之间的协作 Scheduler 对象为依赖时间信息的类提供精确定时和时序安排。AlarmClock 从scheduler类订阅信息。每秒钟Scheduler都会通报AlarmClock类有一秒钟时间已经结束。图 6.1 Scheduler类图 Keyboard 对象需要定期取得物理键盘所有按键的状态。我们决定每秒钟检测

38、10次键盘输入。所以,如果用户按下并放开一个按键的时间小于1/20秒,则该按键输入会丢失。图 6.2 Scheduler对象与其客户对象之间的协作 物理键盘还能够在按键时产生一个硬件中断,与定时检测方法相比,中断法能够减轻CPU的负载,但是需要增加所需的硬件。BatteryLevelMeter 类每5秒钟测量一次电池的电量。Scheduler负责周期性的激活Keyboard 和BatterylevelMeter类。图 6.2 显示了scheduler是如何周期性的唤醒系统的反应类的。6.4 MessageMemory、Message和AudioController对象之间的协作 Message

39、Memory 是Message对象的容器. 这种协作关系遵循Container模式。AudioController在需要访问Message对象的时候会用到MessageMemory类。6.5 SettingTimeUserMode, AlarmClock,Keyboard 和ClockView 对象之间的协作 这些对象都遵循Model View Controller模式. AlarmClock为ClockView提供一个模型用来在显示屏上显示时间。UserMode 对象控制系统与用户之间的交互行为。由于AlarmClock 是反应对象,ClockView 是交互对象。它们之间的协作将遵循Rea

40、ctive Subject 模式。Keyboard 对象向UserInterface类通告用户按键事件也遵循该模式。图 6.3 显示了当前用户模式为SettingTimeUserMode.时,用户按下up 键后所产生一系列消息的顺序过程。6.6 UserInterface, AudioController, Messages 和AudioOutput 对象之间的协作 UserInterface 和AudioController 之间的协作采用了Reactive Subject 模式。AudioController, Message,AudioInput 和AudioOutput 之间的协作采用

41、Observer模式。图 6.4 显示了播放一条声音信息所的消息传递顺序。为了简化,声音信息用一个音频块表示。这种合作有点复杂但支持回放和录制两个不同的信息。同时,还支持录制和回放立体声声音,但每条信息将有两个音频块流组成。图 6.3 Model-View-Controller 协作 图 6.4 UserInterface 和AudioController对象之间的协作关系 7 详细设计/Detailed Design 7.1 硬件的对象建模 一个硬件封装类是对一个硬件设备的软件对象化描述,是应用程序与硬件之间的接口。硬件封装类的构造函数将初始化硬件设备,然后该类所对应的硬件就可以使用了。可以

42、通过封装类的方法对硬件进行配置、启动或停止等操作。由于硬件的状态将由封装类的状态表示,通常情况下封装类都不会有太多的属性。详细设计和实现硬件封装类需要很准确的硬件方面的知识。本系统中的硬件封装类包括speaker, microphone, timer和keyboard 对象。7.2 音频压缩算法 一个很明确的需求就是,必须以6Khz频率,8位采样样本录制声音。这表示在录制过程中,每秒钟需要至少6KB内存。我们可以通过对输入信号的压缩处理来减少内存的需要量。最简单的音频压缩是适应性Delta脉冲编码调制技术(Adaptive Delta Pulse Code Modulation ADPCM)

43、ITU727. ADPCM 很容易实现并且CPU占用率很低。7.3 使用直接内存访问通道 在录制声音信息的时候,一个AudioInput 对象每秒钟需要从麦克获得6000个样本。有多个途径可以完成这个任务。第一个方案是使用scheduler来计时,由一个定时器在每秒钟内激活Scheduler6000次。scheduler 被激活后便通过AudioInput对象采集一个声音样本。很显然,由于只需要传输一个字节,CPU周期的大部分事件被浪费了。另一个解决方案是通过一个新的定时器直接激活AudioInput 对象采集声音样本。这种情况下,CUP占用率会低一些但仍是相当可观的。中断服务程序在大多数RI

44、SC处理器系统中的表现都大打折扣,也不宜采用。所以第三个可选方案是使用直接内存访问通道(direct memory access channelDMAC)。一个DMAC 一次可以将几个word由内存的一处移到另一处而不需要占用CPU资源。由于所有内置外设的端口都映射到了内存地址空间中,所以通过DMAC实现外设之间和外设与内存之间的数据传送是可能的。在我们的设计中,我们将使用DMAC由麦克向一个音频块传输声音样本,或者将音频块传送给扬声器。一个DMAC 单元拥有一些寄存器来控制它的行为,其中主要有源地址寄存器、目的地址寄存器、传输计数寄存器和一些标志寄存器。标志寄存器用来保存是否在每次传输结束后

45、需要增加源/目的地址的空间,或者用来标识被传输的单元是一个word还是一个byte。寄存器的使用使数据能够以更快的速度传输并与定时器保持同步。在编程时,我们将DMAC的A/D转换器的地址作为录制声音操作的源地址。目的地址指向一个能够在每次传输后根据传输内容自动调整空间的内部缓冲区。传输单元是一个字节与声音样本的大小相同。我们使用一个定时器,通过编程实现每秒产生6000次中断以及对每次传输初始化。当定时器向CPU发送中断请求后,DMAC 单元开始传输数据。如果CPU的中断响应被屏蔽的话,DMAC也会传输数据,但不会被接收。因此而造成数据丢失。实际上,我们需要中断被屏蔽,所以定时器不干扰CPU。在

46、声音样本被存储到缓冲区后,DMAC单元产生并发送中断请求给AudioInput。AudioInput对象接收到请求后,将缓冲区的内容压缩成一个音频块。图7.1 显示了录制一个音频块的过程。一条声音信息的所有音频块都是重复此过程而获得的。 图 7.1 记录一个音频块 设计中还需要讨论的一点是音频块的尺寸。如果太小,CPU将花费大量时间用于对象间的信息传递以及控制DMAC操作同步上。所有声音信息都是由n(n为整数)个音频块组成。一条声音信息回放时间长短以及尺寸大小取决于音频块的长度和尺寸大小。如果音频块的尺寸过大则造成内存浪费和系统响应缓慢。声音回放与声音录制的机制很类似的。先由AudioOutput对象将音频块解压缩为声音样本并存储到缓冲区。然后由DMAC将声音样本传送给D/A转换器。此机制只有在CPU能够很快速的压缩和解压声音样本的情况下才能被接受。否则,用户会在两个回放音频块的间隙听到低频噪音。但这个问题可以通过以下途径解决:优化传输音频块的过程或者考虑以音频块流的方式传输音频块。由于CPU和DMAC是同步工作的,我们可以通过一个管道(pipeline)处理音频流,使DMAC在传输一个音频块的时候,CPU解压下一个音频块。 图 7.2 回放一个音频块 7.4 硬件资源的分配 我们必须将硬件和外设资源分配给不同的反应对象。由于中断向量、DMA通道、定时器和输

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1