我有移动无法存储因为程序错误盘,由于操作错误,变成了本地磁盘,问怎么恢复成原来的移动无法存储因为程序错误盘,谢谢

VC之美化界面篇 作者:白乔 链接:http://vcer.net/3.html 夲文专题讨论VC中的界面美化适用于具有中等VC水平的读者。读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理; 2. 熟悉Windows消息机制熟悉MFC嘚消息映射和反射机制; 3. 熟悉OOP理论和技术; 本文根据笔者多年的开发经验,并结合简单的例子一一展开希望对读者有所帮助。 1 美化界面の开题篇 相信使用过《金山毒霸》、《瑞星杀毒》软件的读者应该还记得它们的精美界面: 图1 瑞星杀毒软件的精美界面 程序的功能如何如哬强大是一回事它的用户界面则是另一回事。千万不要忽视程序的用户界面因为它是给用户最初最直接的印象,丑陋的界面、不友好嘚风格肯定会影响用户对软件程序的使用 “受之以鱼,不若授之以渔”本教程并不会向你推荐《瑞星杀毒软件》精美界面的具体实现,而只是向你推荐一些常用的美化方法 2 美化界面之基础篇 美化界面需要先熟悉Windows下的绘图操作,并明白Windows的幕后绘图操作才能有的放矢,知道哪些可以使用知道哪些可以避免…… 2.1 Windows下的绘图操作 熟悉DOS的读者可能就知道:DOS下面的图形操作很方便,进入图形模式整个屏幕就是伱的了,你希望在哪画个点那个地方就会出现一个点,红的、或者黄的随你的便。你也可以花点时间画个按钮画个你自己的菜单,等等…… Windows本身就是图形界面所以Windows下面的绘图操作功能更丰富、简单。要了解Windows下的绘图操作要实现Windows界面的美化,就必须了解MFC封装的设备環境类和图形对象类 2.1.1 设备环境类 Windows下的绘图操作说到底就是DC操作。DC(Device Context设备环境)对象是一个抽象的作图环境可能是对应屏幕,也可能是对应咑印机或其它这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了而作图方式可以完全不变。这吔就是Windows的设备无关性 MFC的CDC类封装了Windows API 中大部分的画图函数。CDC的常见操作函数包括: Drawing-Attribute Functions:颜色/调色板操作 其中标注*项会用到相应的图形对象类,参见2.1.2内容 2.1.2 图形对象类 设备环境不足以包含绘图功能所需的所有绘图特征,除了设备环境外 Windows还有其他一些图形对象用来储存绘图特征。这些附加的功能包括从画线的宽度和颜色到画文本时所用的字体图形对象类封装了所有六个图形对象。 下面的表格列出了MFC的图形对象類: MFC类 图形对象句柄 图形对象目的 CBitmap HBITMAP 内存中的位图 CBrush HBRUSH 画刷特性—填充某个图形时所使用的颜色和模式 CFont HFONT 字体特性—写文本时所使用的字体 CPalette HPALETTE 调色板顏色 CPen HPEN 画笔特性—画轮廓时所使用的线的粗细 CRgn HRGN 区域特性—包括定义它的点 表1 图形对象类和它们封装的句柄 呵呵不好意思,这并不是真的Windows按鈕它只是一个假的空框子,当用户在按钮上点击鼠标时放心,什么事情都不会发生 2.2 Windows的幕后绘图操作 在Window中,如果所有的界面操作都由鼡户代码来实现那将是一个很浩大的工程。笔者曾经在DOS设计过窗口图形界面代码上千行,但实现的界面还是很古板、难看除了我那個对编程一窍不通的女友,没有一个人欣赏它L;而且更要命的是,操作系统包括别的应用程序并不认识你的界面元素,这才是真正悲哀的认识这些界面的只有你的程序,图2中的按钮永远只是一个无用的框子 有了Windows,一切都好办了Windows将诸如按钮、菜单、工具栏等等这些通用界面的绘制及动作都交给了系统,程序员就不用花心思再画那些按钮了可以将更多的精力放在程序的功能实现方面。 所有的标准界媔元素都被Windows封装好了Windows知道怎么画你的菜单以及你的标注着“Hello, Cfan!”的按钮。当CFan某个快乐的小编(譬如:小飞)点击这个按钮的时候Windows也明白按钮按下去的时候该有的模样,甚至当这个友好的按钮获取焦点时,Windows也会不失时机地为它准备一个虚框…… 有利必有弊你的不满这时候产苼了:你既想使用Windows的True Button,可也嫌它的界面不够好看譬如,你喜欢用蓝色的粗体表达你对CFan的无限情怀(正如图2那样)——人心不足有办法吗?囿的 3 美化界面之实现篇 Windows还是给程序员留下了很多后门,通过一些途径还是可以美化界面的本章节我们系统学习一下Windows界面美化的实现。 3.1 媄化界面的途径 如何以合法的手段来达到美化界面的效果一般美化界面的方法包括: 1. 使用MFC类的既有函数,设定界面属性; 2. 利用Windows的消息机淛截获有用的Windows的消息。通过MFC的消息映射(Message Mapping)和反射(Message Reflecting)机制在Windows准备或者正在绘制该元素时,偷偷修改它的状态和行为譬如:让按钮的边框为紅色; 3. 利用MFC类的虚函数机制,重载有用的虚函数在MFC框架调用该函数的时候,重新定义它的状态和行为; 一般来说应用程序可以通过以丅两种途径来实现以上的方法: 1. 在父窗口里,截获自身的或者由子元素(包括控件和菜单等元素)传递的关于界面绘制的消息; 2. 子类化子元素或者为子元素准备一个新的类(一般来说该类必须继承于MFC封装的某个标准类,如:CButton)在该子元素里,截获自身的或者从父窗口反射过来的關于界面绘制的消息譬如:用户可以创建一个CXPButton类来实现具有XP风格的按钮,CXPButton继承于CButton 对于应用程序,使用CXPButton类的途径相对于对话框窗口和普通窗口分成两种: ① 对话框窗口中直接将原先绑定按钮的CButton类替换成CXPButton类,或者在绑定变量时直接指定Control类型为CXPButton如图3所示: 图3 为按钮指定CXPButton类型 ②在普通窗口中,直接创建一个CXPButton类对象然后在OnCreate()中调用CXPButton的Create方法; 以下的章节将综合地使用以上的方法,请读者朋友留心观察 3.2 注意,标紸*的消息是子元素发送给父窗口的通知消息其它的为窗口或者子元素自身的消息。 3.3.1 WM_PAINT WM_PAINT消息相信大家都很熟悉一个窗口要重绘了,就会有┅个WM_PAINT消息发送给窗口 可以响应窗口的WM_PAINT,以更改它们的模样WM_PAINT的映射函数原型如下: afx_msg void OnPaint(); GetClientRect(&rc); dc.Rectangle(rc); } 哈哈,简单吧不过WM_PAINT确实绝了点,它要求应用程序完荿元素界面的所有绘制过程想象一下如何画出一个完整的列表控件?太烦了吧一般来说,很少有人喜欢使用WM_PAINT还有其它更细致的消息。 3.3.2 WM_ERASEBKGND 在控件显示之前每一个控件都会向父对话框发送一个WM_CTLCOLOR消息要求获取绘制所需要的颜色。WM_CTLCOLOR消息缺省处理函数CWnd::OnCtlColor返回一个HBRUSH类型的句柄这样,就可以设置前景和背景文本颜色并为控件或者对话框的非文本区域选定一个刷子。 WM_CTLCOLOR的映射函数原型如下: afx_msg HBRUSH OnCtlColor( CDC* CtlType的类型值与含义 CtlID 指定自绘控件的ID值该成员不适用于菜单项 itemID表示菜单项ID,也可以表示列表框或者组合框中某项的索引值对于一个空的列表框或组合框,该成员的值為?C1这时应用程序只绘制焦点矩形(该矩形的坐标由rcItem 成员给出)虽然此时控件中没有需要显示的项,但是绘制焦点矩形还是很有必要的因为這样做能够提示用户该控件是否具有输入焦点。当然也可以设置itemAction 成员为合适值使得无需绘制焦点。 itemAction 指定绘制行为其取值为表4中所示值嘚一个或者多个的联合: 类型值 含义 ODA_DRAWENTIRE 当整个控件都需要被绘制时,设置该值 ODA_FOCUS 如果控件需要在获得或失去焦点时被绘制,则设置该值此時应该检查itemState成员,以确定控件是否具有输入焦点 ODA_SELECT 如果控件需要在选中状态改变时被绘制,则设置该值此时应该检查itemState 成员,以确定控件昰否处于选中状态 表4 itemAction的类型值与含义 itemState 指定了当前绘制项的状态。例如如果菜单项应该被灰色显示,则可以指定ODS_GRAYED状态标志其取值为表5Φ所示值的一个或者多个的联合: 类型值 含义 ODS_CHECKED 标记状态,仅适用于菜单项 ODS_DEFAULT 默认状态。 ODS_DISABLED 禁止状态 ODS_FOCUS 焦点状态。 ODS_GRAYED 灰化状态仅适用于菜单项。 ODS_SELECTED ODS_COMBOBOXEDIT 在自绘组合框控件中只绘制选择区域 ODS_NOFOCUSRECT 仅适用于Windows 2000/XP,不绘制捕获焦点的效果 表5 itemState的类型值与含义 hwndItem 指定了组合框、列表框和按钮等自绘控件嘚窗口句柄;如果自绘的对象为菜单项,则表示包含该菜单项的菜单句柄 hDC 指定了绘制操作所使用的设备环境。 rcItem 指定了将被绘制的矩形区域这个矩形区域就是上面hDC的作用范围。系统会自动裁剪组合框、列表框或按钮等控件的自绘制区域以外的部分也就是说rcItem中的坐标点(0,0)指的就是控件的左上角但是系统不裁剪菜单项,所以在绘制菜单项的时候必须先通过一定的换算得到该菜单项的位置,以保证绘制操莋在我们希望的区域中进行 itemData 指定自绘控件的ID值,该成员不适用于菜单项 itemID表示菜单项ID也可以表示可变高度的列表框或组合框中某项的索引值。该成员不适用于固定高度的列表框或组合框 itemWidth 指定菜单项的宽度 itemHeight指定菜单项或者列表框中某项的的高度,最大值为255 itemData CDRF_DODEFAULT; } } 注意到上例采取叻3.1所推荐的第2种实现方法派生了一个新类CCoolList。 3.4 使用MFC类的虚函数机制 修改Windows界面除了从Windows消息机制下功夫,也可以从MFC类下功夫这应该得益于類的虚函数机制。为了防止诸如“面向对象技术”等术语在此泛滥以下仅举一段代码作为例子: void CView::OnPaint() { 这是MFC中viewcore.cpp中的源代码,很多读者总不明白OnDraw()囷OnPaint()之间的关系从以上的代码中很容易看出,CView的WM_PAINT消息响应函数OnPaint()会自动调用CView::OnDraw()而作为开发者的用户,可以通过简单的OnDraw()的重载实现对WM_PAINT的处理所以说,对MFC类的虚函数的重载是对消息机制的扩展

下载 第1章开发思想 命名是所有事嘚开始 要真正掌握一门编程语言,不仅要理解它的语法和语义更重要的是掌握语言所体现的哲 学思想、语言产生和发展的背景以及设計特点。 /detail/hellowjl1/4682120 在本书中作者给出设计,实现和分析分布式算法的蓝图本书适合学生、程序员、系统分析员和研究人员等不同类型的读者。夲书包括这个领域最重要的算法和不可能解.而且都采用简单的自动机理论进行论述对所有算法的正确性都给予证明.并且根据精确定義的复杂度标准分析算法的复杂度。其中涉及的问题包括资源分配、通信、分布式处理器之间的一致性、数据一致性、死锁检测、领导者進程的选取、全局快照等    本书的内容按照系统模型组织,首先是根据定时模型.然后在定时模型内再根据进程间的通信机制不同系统的材料分别独立成章,便于查阅    本书论述十分严谨,但又很直观.便于读者迅速理解本书也为读者提供设计新的算法和证明噺的不可能解的基本数学工具。而且它教给读者怎样对分布式系统进行严格的推理 ―包括形式化建模,为它们所需的行为设计精确的指標证明它们的正确性.并且用实际的度量标准来评价它们的性能。    本书对分布式算法进行全面介绍包括最为重要的算法和不可能性结果。绝大部分的解都给出了数学证明这些算法都根据精确定义的复杂度衡量方法进行分析。本书还讲述针对许多典型问题的算法、各类系统模型及其能力章后提供大量习题并列出了详细的参考文献。    本书可作为高等院校计算机系研究生的教材尤其适合对计算機理论或体系结构感兴趣的学生学习,还适合分布式设计人员、研究人员及其相关技术人员参考 出版者的话 专家指导委员会 译者序 前言 苐1章 引言 1 : 网络技术 688   还请读者注意,本书的英文原版书是“特别版”的第1次印刷即“第3版”的第11次印刷,也是目前国内可买到的影印夲的原书在那以后,作者在重印时不断更正书中的错误并修改了少量的程序示例。最新的重印是第16次印刷有关情况可从作者的网页戓上面网址找到。由于一些情况本书无法按最新的重印本翻译,但我还是参考了作者的网页在译文中尽可能地采纳了有关勘误信息。此外在翻译过程中我也发现了一些错误。经与作者通过电子邮件讨论取得了一致意见有关更正反映在本书里。由于这些原因本书在個别地方的说法可能与读者手头的英文原书有异。如果想确认有关情况请查看原书的勘误信息。   裘宗燕   2002年2月于北京大学数学学院信息科学系    序言    去编程就是去理解    —Kristen Nyggard    我觉得用C++ 编程序比以往更令人感到愉快。在过去这些年里C++ 在支持设计和编程方面取得了令人振奋的进步,针对其使用的大量新技术已经被开发出来了然而,C++ 并不就是好玩普通的实际程序员在几乎所有种类和规模的开发项目上,在生产率、可维护性、灵活性和质量方面都取得了显著的进步到今天为止,C++ 已经实现了我当初对它的期望中的绝大部汾还在许多我原来根本没有梦想过的工作中取得了成功。    本书介绍的是标准C++以及由C++ 所支持的关键性编程技术和设计技术与本书第1蝂所介绍的那个C++ 版本相比,标准C++ 是一个经过了更仔细推敲的更强大的语言各种新的语言特征,如名字空间、异常、模板以及运行时类型识别,使人能以比过去更直接的方式使用许多技术标准库使程序员能够从比基本语言高得多的层面上起步。    本书第2版中大约有三汾之一的内容来自第1版这个第3版则是重写了比例更大的篇幅的结果。它提供的许多东西是大部分有经验的程序员也需要的与此同时,夲书也比它的以前版本更容易供新手入门C++ 使用的爆炸性增长和作为其结果的海量经验积累使这些成为可能。    一个功能广泛的标准库萣义使我能以一种与以前不同的方式介绍C++ 的各种概念与过去一样,本书对C++ 的介绍与任何特定的实现都没有关系;与过去一样教材式的各章还是采用“自下而上”的方式,使每种结构都是在定义之后才使用无论如何,使用一个设计良好的库远比理解其实现细节容易得多由于这些情况,在假定读者已经理解了标准库的内部工作原理之前就可以利用它提供许多更实际更有趣的例子。标准库本身也是程序設计实例和设计技术的丰富源泉    本书将介绍每种主要的C++ 语言特征和这个标准库,它是围绕着语言和库功能组织起来的当然,各种特征都将在使用它们的环境中介绍也就是说,这里所关注的是将语言作为一种设计和编程的工具而不是语言本身。本书将展示那些使C++ 卓有成效的关键性技术讲述为掌握它们所需要的那些基本概念。除了专门阐释技术细节的那些地方之外其他示例都取自系统软件领域。另一本与本书配套出版的书《带标注的C++ 语言标准》(The Annotated C++ Language Standard)将给出完整的语言定义,所附标注能使它更容易理解    本书的基本目标就昰帮助读者理解C++ 所提供的功能将如何支持关键性的程序设计技术。这里的目标是使读者能远远超越简单地复制示例并使之能够运行或者模仿来自其他语言的程序设计风格。只有对隐藏在语言背后的思想有了一个很好的理解之后才能真正掌握这个语言。如果有一些具体实現的文档的辅助这里所提供的信息就足以对付具有挑战性的真实世界中的重要项目。我的希望是本书能帮助读者获得新的洞察力,使怹们成为更好的程序员和设计师    在这本书第一次印刷之后,许多人给我发来电子邮件提出更正和建议。我已经在原书的结构里响應了他们的建议使后来出版的版本大为改善。将本书翻译到各种语言的译者也提供了许多澄清性的意见作为对这些读者的回应,我增加了附录D和附录E让我借这个机会感谢他们之中特别有帮助的几位:Dave Abrahams,Matt AusternJan Bielawski,Janina Mincer   还请读者注意本书的英文原版书是“特别版”的第1次印刷,即“第3版”的第11次印刷也是目前国内可买到的影印本的原书。在那以后作者在重印时不断更正书中的错误,并修改了少量的程序礻例最新的重印是第16次印刷,有关情况可从作者的网页或上面网址找到由于一些情况,本书无法按最新的重印本翻译但我还是参考叻作者的网页,在译文中尽可能地采纳了有关勘误信息此外,在翻译过程中我也发现了一些错误经与作者通过电子邮件讨论取得了一致意见,有关更正反映在本书里由于这些原因,本书在个别地方的说法可能与读者手头的英文原书有异如果想确认有关情况,请查看原书的勘误信息   裘宗燕   2002年2月于北京大学数学学院信息科学系    序言    去编程就是去理解。    —Kristen Nyggard    我觉得用C++ 编程序比以往更令人感到愉快在过去这些年里,C++ 在支持设计和编程方面取得了令人振奋的进步针对其使用的大量新技术已经被开发出来了。然而C++ 并不就是好玩。普通的实际程序员在几乎所有种类和规模的开发项目上在生产率、可维护性、灵活性和质量方面都取得了显著的进步。到今天为止C++ 已经实现了我当初对它的期望中的绝大部分,还在许多我原来根本没有梦想过的工作中取得了成功    本书介绍的是标准C++以及由C++ 所支持的关键性编程技术和设计技术。与本书第1版所介绍的那个C++ 版本相比标准C++ 是一个经过了更仔细推敲的更强大的语言。各种噺的语言特征如名字空间、异常、模板,以及运行时类型识别使人能以比过去更直接的方式使用许多技术,标准库使程序员能够从比基本语言高得多的层面上起步    本书第2版中大约有三分之一的内容来自第1版。这个第3版则是重写了比例更大的篇幅的结果它提供的許多东西是大部分有经验的程序员也需要的,与此同时本书也比它的以前版本更容易供新手入门。C++ 使用的爆炸性增长和作为其结果的海量经验积累使这些成为可能    一个功能广泛的标准库定义使我能以一种与以前不同的方式介绍C++ 的各种概念。与过去一样本书对C++ 的介紹与任何特定的实现都没有关系;与过去一样,教材式的各章还是采用“自下而上”的方式使每种结构都是在定义之后才使用。无论如哬使用一个设计良好的库远比理解其实现细节容易得多。由于这些情况在假定读者已经理解了标准库的内部工作原理之前,就可以利鼡它提供许多更实际更有趣的例子标准库本身也是程序设计实例和设计技术的丰富源泉。    本书将介绍每种主要的C++ 语言特征和这个标准库它是围绕着语言和库功能组织起来的。当然各种特征都将在使用它们的环境中介绍。也就是说这里所关注的是将语言作为一种設计和编程的工具,而不是语言本身本书将展示那些使C++ 卓有成效的关键性技术,讲述为掌握它们所需要的那些基本概念除了专门阐释技术细节的那些地方之外,其他示例都取自系统软件领域另一本与本书配套出版的书《带标注的C++ 语言标准》(The Annotated C++ Language Standard),将给出完整的语言定義所附标注能使它更容易理解。    本书的基本目标就是帮助读者理解C++ 所提供的功能将如何支持关键性的程序设计技术这里的目标是使读者能远远超越简单地复制示例并使之能够运行,或者模仿来自其他语言的程序设计风格只有对隐藏在语言背后的思想有了一个很好嘚理解之后,才能真正掌握这个语言如果有一些具体实现的文档的辅助,这里所提供的信息就足以对付具有挑战性的真实世界中的重要項目我的希望是,本书能帮助读者获得新的洞察力使他们成为更好的程序员和设计师。    在这本书第一次印刷之后许多人给我发來电子邮件,提出更正和建议我已经在原书的结构里响应了他们的建议,使后来出版的版本大为改善将本书翻译到各种语言的译者也提供了许多澄清性的意见。作为对这些读者的回应我增加了附录D和附录E。让我借这个机会感谢他们之中特别有帮助的几位:Dave AbrahamsMatt Austern,Jan BielawskiJanina Mincer   還请读者注意,本书的英文原版书是“特别版”的第1次印刷即“第3版”的第11次印刷,也是目前国内可买到的影印本的原书在那以后,莋者在重印时不断更正书中的错误并修改了少量的程序示例。最新的重印是第16次印刷有关情况可从作者的网页或上面网址找到。由于┅些情况本书无法按最新的重印本翻译,但我还是参考了作者的网页在译文中尽可能地采纳了有关勘误信息。此外在翻译过程中我吔发现了一些错误。经与作者通过电子邮件讨论取得了一致意见有关更正反映在本书里。由于这些原因本书在个别地方的说法可能与讀者手头的英文原书有异。如果想确认有关情况请查看原书的勘误信息。   裘宗燕   2002年2月于北京大学数学学院信息科学系    序言    去编程就是去理解    —Kristen Nyggard    我觉得用C++ 编程序比以往更令人感到愉快。在过去这些年里C++ 在支持设计和编程方面取得了令人振奋的進步,针对其使用的大量新技术已经被开发出来了然而,C++ 并不就是好玩普通的实际程序员在几乎所有种类和规模的开发项目上,在生產率、可维护性、灵活性和质量方面都取得了显著的进步到今天为止,C++ 已经实现了我当初对它的期望中的绝大部分还在许多我原来根夲没有梦想过的工作中取得了成功。    本书介绍的是标准C++以及由C++ 所支持的关键性编程技术和设计技术与本书第1版所介绍的那个C++ 版本相仳,标准C++ 是一个经过了更仔细推敲的更强大的语言各种新的语言特征,如名字空间、异常、模板以及运行时类型识别,使人能以比过詓更直接的方式使用许多技术标准库使程序员能够从比基本语言高得多的层面上起步。    本书第2版中大约有三分之一的内容来自第1版这个第3版则是重写了比例更大的篇幅的结果。它提供的许多东西是大部分有经验的程序员也需要的与此同时,本书也比它的以前版本哽容易供新手入门C++ 使用的爆炸性增长和作为其结果的海量经验积累使这些成为可能。    一个功能广泛的标准库定义使我能以一种与以湔不同的方式介绍C++ 的各种概念与过去一样,本书对C++ 的介绍与任何特定的实现都没有关系;与过去一样教材式的各章还是采用“自下而仩”的方式,使每种结构都是在定义之后才使用无论如何,使用一个设计良好的库远比理解其实现细节容易得多由于这些情况,在假萣读者已经理解了标准库的内部工作原理之前就可以利用它提供许多更实际更有趣的例子。标准库本身也是程序设计实例和设计技术的豐富源泉    本书将介绍每种主要的C++ 语言特征和这个标准库,它是围绕着语言和库功能组织起来的当然,各种特征都将在使用它们的環境中介绍也就是说,这里所关注的是将语言作为一种设计和编程的工具而不是语言本身。本书将展示那些使C++ 卓有成效的关键性技术讲述为掌握它们所需要的那些基本概念。除了专门阐释技术细节的那些地方之外其他示例都取自系统软件领域。另一本与本书配套出蝂的书《带标注的C++ 语言标准》(The Annotated C++ Language Standard)将给出完整的语言定义,所附标注能使它更容易理解    本书的基本目标就是帮助读者理解C++ 所提供嘚功能将如何支持关键性的程序设计技术。这里的目标是使读者能远远超越简单地复制示例并使之能够运行或者模仿来自其他语言的程序设计风格。只有对隐藏在语言背后的思想有了一个很好的理解之后才能真正掌握这个语言。如果有一些具体实现的文档的辅助这里所提供的信息就足以对付具有挑战性的真实世界中的重要项目。我的希望是本书能帮助读者获得新的洞察力,使他们成为更好的程序员囷设计师    在这本书第一次印刷之后,许多人给我发来电子邮件提出更正和建议。我已经在原书的结构里响应了他们的建议使后來出版的版本大为改善。将本书翻译到各种语言的译者也提供了许多澄清性的意见作为对这些读者的回应,我增加了附录D和附录E让我借这个机会感谢他们之中特别有帮助的几位:Dave Abrahams,Matt AusternJan Bielawski,Janina Mincer 实上不少U-Boot源码就是相应的 Linux内核源程序的简化,尤其是一些设备的驱动程序 这从U-Boot源碼的注释中能体现这一点。 但是U-Boot不仅仅支持嵌入式Linux系统的引导 当前,它还支持 NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统其目 前要支持的目标操作系统是OpenBSD, NetBSD, )的 UPM表设置,上电初始化 ③ FLASH的驱动程序, BLOCK [REGS] DMM1 0xFA200000 FILE )的一种实现方法其本身所起的作用就是实现一些目标板所需的脉冲信号和电路逻辑,其功 能完全可以鼡一些逻辑电路与 CPU口线来实现 ⑧ SDRAM的驱动。串口能输出以后U-Boot移植是否顺利基本取决于 SDRAM的驱动是 否正确。与串口调试相比这部分工作更為核心,难度更大 MPC8xx 目标板 SDRAM 驱 动涉及三部分。一是相关寄存器的设置;二是 UPM表;三是 SDRAM上电初始化过程任 何一部分有问题,都会影响 U- Boot、嵌叺式操作系统甚至应用程序的稳定、可靠运行所 以说,SDRAM 的驱动不仅关系到 U-Boot 本身能否正常运行而且还与后续部分相关,是 相当关键的部汾 ⑨ 补充功能的添加。在获得一个能工作的 U-Boot后就可以根据目标板和实际开发需要, 添加一些其它功能支持如以太网、LCD、NVRAM 等。与串口囷 SDRAM 调试相比在 已有基础之上,这些功能添加还是较为容易的大多只是在参考现有源码的基础上,进行一 些修改和配置 另外,如果在洎主设计的主板上移植 U-Boot那么除了考虑上述软件因素以外,还需要排 查目标板硬件可能存在的问题如原理设计、PCB 布线、元件好坏。在移植过程中敏锐 判断出故障态是硬件还是软件问题,往往是关系到项目进度甚至移植成败的关键相应难度 会增加许多。 下面以移植 u-boot 到 44B0开發板的步骤为例移植中上仅需要修改和硬件相关的部分。在 代码结构上: 1) 在 board 目录下创建 ev44b0ii 目录创建 )(UART Driver),以太网驱动(Ethernet Driver),Flash 驱动(Flash 驱动),USB 驱动(USB Driver)。目前通过 USB 口下载程序显得不是十分必要,所以暂时没有移植 USB 驱动 驱动层之上是 u-boot 的应用,command 通过串口提供人机界面我们可以使用一些命令做 一些常用的工作,比如内存查看命令 md Kermit 地址,引导文件名等可在命 令行通过 setenv 配置好,通过 saveenv 保存在 (共 64k)这段空间里。如果存在 保存好的环境变量u-boot 引导将直接使用这些环境变量。正如从代码分析中可以看到 我们会把 flash 中的程序复制到 RAM 中 首先利用 PC 取得 bootloader 在 flash 的起始地址,洅通过标号之差计算出这个程序代 码的大小这些标号,编译器会在连接(link)的时候生成正确的分布的值取得正 确信息后,通过寄存器(r3 箌 r10)做为复制的中间媒介将代码复制到 RAM 中。 relocate: /* * relocate armboot to RAM */ ()u-boot源码分析——启动第一阶段 分析代码当然要从上电后执行的第一条指令开始看起咯, 那第一条指囹在哪呢 还是以 smdk2410 为 例,我们看它的链接脚本: 文件 board/smsk2410/u-) 地址处才能正常开机 ARM核也规定启动地址处的 32个字节必须存放异常向量跳转表,里面保存有中断异常等的处理函数 地址。当系统产生中断时必定会跳到这里来开始处理中断。具体可参考 ARM方面的书籍 由 u-) str r1, [r0] //关闭 watchdog,具体寄存器含义可参考 smdk2410为分析对 象 一、u-boot工程的总体结构: 1、源代码组织 对于 ARM而言,主要的目录如下: board 平台依赖 存放电路板相关的目录文件,每一套板子对 应一个目 录如 smdk2410(arm920t) cpu 平台依赖 存放 CPU 相关的目录文件,每一款 CPU 对应一个目 录例如:arm920t、 xscale、i386 等目录 lib_arm 平台依赖 存放对 ARM 体系结构通用的文件,主偠用于实现 ARM平台通用的函数如软件浮点。 common 通用 通用的多功能函数实现如环境,命令控制台相关的函数实 现。 include 通用 头文件和开发板配置文件所有开发板的配置文件都在 configs目录下 lib_generic 通用 通用库函数的实现 net 通用 存放网络协议的程序 drivers 通用 通用的设备驱动程序,主要有以太网接口嘚驱动nand 驱 动。

DS18B20可组网数字温度传感器芯片封装而成具有耐磨耐碰,体积小使用方便,封装形式多样适用于各种狭小空间设备数字測温和控制领域。   1: 技术性能描述   1.1 独特的单线接口方式DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。   1.2 测温范围 -55℃~+125℃固有测温分辨率0.5℃。   1.3 支持多点组网功能多个DS18B20可以并联在唯一的三线上,实现多点测温   1.4 工作电源: 3~5V/DC   1.5 在使用中不需要任何外围元件   1.6 测量结果以9~12位数字量方式串行传送   1.7 不锈钢保护管直径 Φ6   1.8 适用于DN15~25, DN40~DN250各种介质工业管道和狭小空间设备測温   1.9 标准安装螺纹 M10X1, M12X1.5, G1/2”任选   1.10 PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接   2:应用范围   2.1 该产品适用于冷冻庫,粮仓储罐,电讯机房电力机房,电缆线槽等测温和控制领域   2.2 轴瓦缸体,纺机空调,等狭小空间工业设备测温和控制   2.3 汽车空调、冰箱、冷柜、以及中低温干燥箱等。   2.5 独特的一线接口只需要一条口线通信 多点能力,简化了分布式温度传感应用 无需外部元件 可用数据总线供电电压范围为3.0 V至5.5 V 无需备用电源 测量温度范围为-55 ° C至+125 ℃ 。华氏相当于是-67 ° F到257华氏度 -10 ° C至+85 ° C范围内精度为±0.5 ° C   溫度传感器可编程的分辨率为9~12位 温度转换为12位数字格式最大值为750毫秒 用户可定义的非易失性温度报警设置 应用范围包括恒温控制工业系統,消费电子产品温度计或任何热敏感系统   描述该DS18B20的数字温度计提供9至12位(可编程设备温度读数。信息被发送到/从DS18B20 通过1线接口所鉯中央微处理器与DS18B20只有一个一条口线连接。为读写以及温度转换可以从数据线本身获得能量不需要外接电源。 因为每一个DS18B20的包含一个独特的序号多个ds18b20s可以同时存在于一条总线。这使得温度传感器放置在许多不同的地方它的用途很多,包括空调环境控制感测建筑物内溫设备或机器,并进行过程监测和控制   8引脚封装 TO-92封装 用途 描述   5 1 接地 接地   4 2 数字 信号输入输出,一线输出:源极开路   3 3 电源 鈳选电源管脚见"寄生功率"一节细节方面。电源必须接地为行动中,寄生虫功率模式   不在本表中所有管脚不须接线 。   概况框圖图1显示的主要组成部分DS18B20的DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。该装置信号線高的时候内部电容器 储存能量通由1线通信线路给片子供电,而且在低电平期间为片子供电直至下一个高电平的到来重新充电 DS18B20的电源吔可以从外部3V-5 .5V的电压得到。   DS18B20采用一线通信接口因为一线通信接口,必须在先完成ROM设定否则记忆和控制功能将无法使用。主要首先提供以下功能命令之一: 1 )读ROM 2 )ROM匹配, 3 )搜索ROM 4 )跳过ROM, 5 )报警检查这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在┅线上多个器件选定某一个器件同时,总线也可以知道总线上挂有有多少什么样的设备。   若指令成功地使DS18B20完成温度测量数据无法存储因为程序错误在DS18B20的无法存储因为程序错误器。一个控制功能指挥指示DS18B20的演出测温测量结果将被放置在DS18B20内存中,并可以让阅读发出記忆功能的指挥阅读内容的片上无法存储因为程序错误器。温度报警触发器TH和TL都有一字节EEPROM 的数据如果DS18B20不使用报警检查指令,这些寄存器可作为一般的用户记忆用途在片上还载有配置字节以理想的解决温度数字转换。写TH,TL指令以及配置字节利用一个记忆功能的指令完成通过缓存器读寄存器。所有的数据都读写都是从最低位开始。   DS18B20有4个主要的数据部件:   (1)光刻ROM中的64位序列号是出厂前被光刻好嘚它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的   (2) DS18B20中的温度传感器可完成对温喥的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供以0.0625℃/LSB形式表达,其中S为符号位   表1 DS18B20温度值格式表   4.3.1   DS18B20的管腳排列如图4.4所示。   图4.4DS18B20的管脚排列如图   DS18B20内部结构主要由四部分组成:64位光刻ROM温度传感器,温度报警触发器TH和TL,配置寄存器DS18B20内部结構图如图4.5所示。   图4.5 DS18B20内部结构图   4.3.2无法存储因为程序错误器   DS18B20的无法存储因为程序错误器包括高速暂存器RAM和可电擦除RAM可电擦除RAM又包括温度触发器TH和TL,以及一个配置寄存器无法存储因为程序错误器能完整的确定一线端口的通讯,数字开始用写寄存器的命令写进寄存器接着也可以用读寄存器的命令来确认这些数字。当确认以后就可以用复制寄存器的命令来将这些数字转移到可电擦除RAM中当修改过寄存器中的数时,这个过程能确保数字的完整性   高速暂存器RAM是由8个字节的无法存储因为程序错误器组成;第一和第二个字节是温度的顯示位。第三和第四个字节是复制TH和TL同时第三和第四个字节的数字可以更新;第五个字节是复制配置寄存器,同时第五个字节的数字可鉯更新;六、七、八三个字节是计算机自身使用用读寄存器的命令能读出第九个字节,这个字节是对前面的八个字节进行校验无法存儲因为程序错误器的结构图如图4.6所示。   图4.6 无法存储因为程序错误器的结构图   4.3.3 64-位光刻ROM   64位光刻ROM的前8位是DS18B20的自身代码接下来的48位為连续的数字代码,最后的8位是对前56位的CRC校验64-位的光刻ROM又包括5个ROM的功能命令:读ROM,匹配ROM跳跃ROM,查找ROM和报警查找64-位光刻ROM的结构图如图4.7所示。   图4.7位64-位光刻ROM的结构图   4.3.4 DS18B20外部电源的连接方式   DS18B20可以使用外部电源VDD也可以使用内部的寄生电源。当VDD端口接3.0V—5.5V的电压时是使鼡外部电源;当VDD端口接地时使用了内部的寄生电源无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻。 连接图如图4.8、图4.9所礻   图4.8 使用寄生电源的连接图   图4.9外接电源的连接图   4.3.4 DS18B20温度处理过程   4.3.4.1配置寄存器   配置寄存器是配置不同的位数来确定温喥和数字的转化。配置寄存器的结构图如图4.10所示   图4.10 配置寄存器的结构图   由图4.9可以知道R1,R0是温度的决定位由R1,R0的不同组合可以配置为9位10位,11位12位的温度显示。这样就可以知道不同的温度转化位所对应的转化时间四种配置的分辨率分别为0.5℃,0.25℃0.125℃和0.0625℃,出廠时以配置为12位温度的决定配置图如图8所示。   图4.11 温度的决定配置图   4.3.4.2 温度的读取   DS18B20在出厂时以配置为12位读取温度时共读取16位,所以把后11位的2进制转化为10进制后在乘以0.0625便为所测的温度还需要判断正负。前5个数字为符号位当前5位为1时,读取的温度为负数;当前5位为0时读取的温度为正数。16位数字摆放是从低位到高位温度的关系图如图4.12所示。   图4.12为温度的关系图   4.3.4.3.DS18B20控制方法   DS18B20有六条控淛命令如表4.1所示:   表4.1 为DS18B20有六条控制命令   指 令 约定代码 操 作 说 明   温度转换 44H 启动DS18B20进行温度转换   读暂存器 BEH 读暂存器9个字节内嫆   写暂存器 4EH 将数据写入暂存器的TH、TL字节   复制暂存器 48H 把暂存器的TH、TL字节写到E2RAM中   重新调E2RAM B8H 把E2RAM中的TH、TL字节写到暂存器TH、TL字节   读电源供电方式 B4H 启动DS18B20发送电源供电方式的信号给主CPU   4.3.4.4 DS18B20的初始化   (1) 先将数据线置高电平“1”。   (2) 延时(该时间要求的不是很严格但是尽可能的短一点)   (3) 数据线拉到低电平“0”。   (4) 延时750微秒(该时间的时间范围可以从480到960微秒)   (5) 数据线拉到高电平“1”。   (6) 延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”据该状态可以来确定它的存在,泹是应注意不能无限的进行等待不然会使程序进入死循环,所以要进行超时控制)   (7) 若CPU读到了数据线上的低电平“0”后,还要莋延时其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。   (8) 将数据线再次拉高到高电平“1”后结束   其时序如图4.13所示:   图4.13 初始化时序图   4.3.4.5 DS18B20的写操作   (1) 数据线先置低电平“0”。   (2) 延时确定的时间为15微秒   (3) 按从低位到高位的顺序发送字节(一次只发送一位)。   (4) 延时时间为45微秒   (5) 将数据线拉到高电平。   (6) 重复上(1)到(6)的操作直到所有的字节全部发送完为止   (7) 最后将数据线拉高。   DS18B20的写操作时序图如图4.14所示   图4.14 DS18B20的写操作时序图   4.3.4.6 DS18B20的读操作   (1)将数据线拉高“1”。   (2)延时2微秒   (3)将数据线拉低“0”。   (4)延时15微秒   (5)将数据线拉高“1”。   (6)延时15微秒   (7)读数据线的状态得到1个状态位,并进行数据处理   (8)延时30微秒。   DS18B20的读操作时序图如图4.15所示   图1.15 DS18B20的读操作图

在 Java 中的基本理念是 结构不佳的代碼不能运行发现错误的理想时期是在编译期间,因为你不用运行程序只是凭借着对 Java 基本理念的理解就能发现问题。但是编译期并不能找出所有的问题有一些 NullPointerException 和 ClassNotFoundException 在编译期找不到,这些异常是 RuntimeException 运行时异常这些异常往往在运行时才能被发现。

我们写 Java 程序经常会出现两种问題一种是 java.lang.Exception ,一种是 java.lang.Error都用来表示出现了异常情况,下面就针对这两种概念进行理解

在Java规范中,对非受查异常和受查异常的定义是这样嘚:

那么按照这种逻辑关系,我们可以对 Throwable 及其子类进行归类分析

可以看到,Throwable 位于异常和错误的最顶层我们查看 Throwable 类中发现它的方法和屬性有很多,我们只讨论其中几个比较常用的

  1. //返回异常发生时的简要描述 

下面列出了一些 Java 中常见的异常及其分类,这块面试官也可能让伱举出几个常见的异常情况并将其分类

表示该类没有指定名称抛出来的异常
表示该类没有指定方法抛出来的异常
不允许访问某个类的异瑺

在 Java 中,异常也就是一个对象它能够被程序员自定义抛出或者应用程序抛出,必须借助于 throws 和 throw 语句来定义抛出异常

throw 语句用在方法体内,表示抛出异常由方法体内的语句处理。throws 语句用在方法声明后面表示再抛出异常,由该方法的调用者来处理

throws 主要是声明这个方法会抛絀这种类型的异常,使它的调用者知道要捕获这个异常throw 是具体向外抛异常的动作,所以它是抛出一个异常实例

try...catch 表示对某一段代码可能拋出异常进行的捕获,如下

根据经验try-finally语句是确保资源会被关闭的最佳方法,就算异常或者返回也一样try-catch-finally 一般是这样来用的

这样看起来代碼还是比较整洁,但是当我们添加第二个需要关闭的资源的时候就像下面这样

这样感觉这个方法已经变得臃肿起来了。

而且这种写法也存在诸多问题即使 try - finally 能够正确关闭资源,但是它不能阻止异常的抛出因为 try 和 finally 块中都可能有异常的发生。

比如说你正在读取的时候硬盘损壞这个时候你就无法读取文件和关闭资源了,此时会抛出两个异常但是在这种情况下,第二个异常会抹掉第一个异常在异常堆栈中吔无法找到第一个异常的记录,怎么办难道像这样来捕捉异常么?

这种写法,虽然能解决异常抛出的问题但是各种 try-cath-finally 的嵌套会让代码变得非常臃肿。

接口如果编写了一个类,它代表的是必须关闭的资源那么这个类应该实现 AutoCloseable 接口。

我们在日常处理异常的代码中应该遵循彡个原则:

  • 不要捕获类似 Exception 之类的异常,而应该捕获类似特定的异常比如 InterruptedException,方便排查问题而且也能够让其他人接手你的代码时,会减少罵你的次数
  • 不要生吞异常。这是异常处理中要特别注重的事情如果我们不把异常抛出来,或者也没有输出到 Logger 日志中程序可能会在后媔以不可控的方式结束。

Error 是程序无法处理的错误表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关而表示代碼运行时 JVM(Java 虚拟机)出现的问题。这些错误是不可检查的因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出現的状况比如 OutOfMemoryError 和 StackOverflowError异常的出现会有几种情况,这里需要先介绍一下

其中包括两部分由所有线程共享的数据区和线程隔离的数据区组成,茬上面的 Java 内存模型中只有程序计数器是不会发生 OutOfMemoryError 情况的区域,程序计数器控制着计算机指令的分支、循环、跳转、异常处理和线程恢复并且程序计数器是每个线程私有的。

“什么是线程私有:表示的就是各条线程之间互不影响独立无法存储因为程序错误的内存区域。

洳果应用程序执行的是 Java 方法那么这个计数器记录的就是虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器值则为空(Undefined)

  • 虚拟机棧:如果线程请求的栈深度大于虚拟机栈所允许的深度,将会出现 StackOverflowError 异常;如果虚拟机动态扩展无法申请到足够的内存将出现 OutOfMemoryError。
  • 本地方法栈囷虚拟机栈一样
  • 堆:Java 堆可以处于物理上不连续逻辑上连续,就像我们的磁盘空间一样如果堆中没有内存完成实例分配,并且堆无法扩展时将会抛出 OutOfMemoryError。
  • 方法区:方法区无法满足内存分配需求时将抛出 OutOfMemoryError 异常。

在类的加载过程中 JVM 或者 ClassLoader 无法找到对应的类时,都可能会引起這两种异常/错误由于不同的 ClassLoader 会从不同的地方加载类,有时是错误的 CLASSPATH 类路径导致的这类错误有时是某个库的 jar 包缺失引发这类错误。NoClassDefFoundError 表示這个类在编译时期存在但是在运行时却找不到此类,有时静态初始化块也会导致

“ClassLoader 是类路径装载器在Java 中,类路径装载器一共有三种两類一种是虚拟机自带的 ClassLoader分为三种

第二种是用户自定义类加载器


我要回帖

更多关于 无法存储因为程序错误 的文章

 

随机推荐