首页资源分类嵌入式系统 > 领悟嵌入式

领悟嵌入式

已有 445476个资源

下载专区

上传者其他资源

文档信息举报收藏

标    签:嵌入式

分    享:

文档简介

本人结合10余年嵌入式设计的经验,撰写本书,只为广大嵌入式初学者提供良好的经验性帮助。

文档预览

领悟嵌入式 ——从硬件搭建到软件实现 版权说明:本文最终版权解权归鹏哥所有 写在前面...........................................................................................................................................3 绪论——方法与背景.......................................................................................................................6 背景介绍...................................................................................................................................6 嵌入式定义.......................................................................................................................6 对比单片机与嵌入式.......................................................................................................7 非嵌入式...........................................................................................................................8 嵌入式为何火...................................................................................................................9 嵌入式概论............................................................................................................................. 11 嵌入式设计..................................................................................................................... 11 嵌入式学习.....................................................................................................................13 思维方式——嵌入式哲学.............................................................................................................15 抽象哲学——嵌入式中物质与意识 ..................................................................................... 15 时域与频域.....................................................................................................................15 物理内存和寻址空间.....................................................................................................16 实际模型与理想模型.....................................................................................................18 具体哲学——设计准则.........................................................................................................19 认真调研,谨慎周密.....................................................................................................19 修改设计,适应环境.....................................................................................................20 顺藤摸瓜,由简入繁.....................................................................................................22 硬件设计——系统基石.................................................................................................................26 背景介绍.................................................................................................................................26 硬件核心(处理器+存储器) ..............................................................................................26 外设.........................................................................................................................................26 硬件实现.................................................................................................................................26 中间层——通向高层的桥梁.........................................................................................................26 背景介绍.................................................................................................................................26 硬件抽象.................................................................................................................................26 外设驱动.................................................................................................................................26 板级支持包.............................................................................................................................26 RTOS——系统核心.......................................................................................................................26 背景介绍.................................................................................................................................26 设计哲学.................................................................................................................................26 调度基础.................................................................................................................................26 通信机制.................................................................................................................................26 应用程序——用户的接口.............................................................................................................27 背景介绍.................................................................................................................................27 常用工具.................................................................................................................................27 中间件.....................................................................................................................................27 设计技巧.................................................................................................................................27 附录——.........................................................................................................................................27 堆和栈 内存管理...................................................................................................................27 写在前面 本文凝聚了我的心血,如果没有时间就不用继续看下去了。因为 这是对我的一种不尊重。浏览的方法不适用与本文,如果你快速浏览 只会得到一系列与嵌入式系统有关的玩笑,会误解我的意图。所以希 望大家认真、静下心来聆听。这样才能做到领悟嵌入式——鹏哥的期 望 学了嵌入式这么久没有做一个总结,这不是我的风格。早就想提 笔写点什么,可是总是不敢提笔。一是自己没时间怕写不好;二是整 个嵌入式体系所涉及的东西太多,怕误人子弟。各位到书店看看就知 道,凡是与计算机或 IT 有关的都敢说自己是嵌入式。其中有不少有 真才实学,但是更多的是挂羊头卖狗肉。更可恶的是国内大量(非常 大量)的书籍都是东搬西抄,买之=浪费。所以作为同门,学过一段时 间的嵌入式有必要,也有义务为大家以后嵌入式的学习提供一个方 向,各位同门可以把我的这篇文档作为整体了解嵌入式系统的指南。 本文档我打算长期写下去,原因有三: 我做嵌入式设计已经有了一段时间,有些经验想和大家分享; 我下一阶段的工作主要负责误码仪项目的控制平台,结合项目做做总 结非常利于自我的提升; 既然做一个东西我就想做好,不愿意“不上不下”(咱们施伟的名言 (&_&)),所以会持续的完善本文档。 大家都学过单片机和微机原理,不知道各位有没有这个感觉,两 者好像是同一个东西?其实我可以很负责任的告述大家,他们就是一 个东西!微机原理就是基于 X86 体系的 CPU,而单片机(一般本科院 校开设)是基于 51 系列体系的 CPU。两者都是计算机和核心芯片(CPU 及中央处理单元)。但是微机原理中的 X86 中的 CPU 是真实的 CPU 不包含内存,微机原理这门课更侧重于计算机体系结构。而单片机更 侧重与单芯片计算机。而无论是什么硬件平台,整个系统的构架方式 都是相通的。我这篇文档的目的:就是想归纳出他们的相通之处,然 后就能学一而知百。——鹏哥目的 经过这一段时间的训练我对技术有了许多感悟,为什么系统的构 架要如此复杂???简单的东西难道不更有利于技术本身的发展 吗?也许大家也考虑过这个问题,随着学习的深入,我们会慢慢发现, 技术的复杂性是与他的发展史十分相关的。历史越长的技术,它的复 杂性必然越高(也可以说为成熟)。他的复杂性事由其对于某一个领 域的倾向性决定的,而应用的领域又是多样的,所以他必然比较复杂。 用这种复杂性作为代价,来换取对现实环境(具有多样性)的适应。 但是任何技术的基本思想(设计哲学)必然是简单的,否者他是会走 向灭亡的!一个技术复杂到人类无法掌控,那么他还能存在吗?疏通 后,道理很简单,但是没疏通心里总是有疑问。 举个例子,如果我们的操作系统全部都用 windows Xp 多方便? 但是现实条件是不允许的,因为嵌入式系统的硬件条件很贫乏。例如 PIC24F 系列的单片机的 RAM 最大为 8K。这怎么可能跑 XP?所以对 于嵌入式系统而言,构架方式需要相应的修改,必然与通用计算机(PC 机)不同。 很多人都说嵌入式的开发现在只要学习基于 C 语言的就够了, 我不完全赞同。因为对于嵌入式系统的开发人员,不像应用程序的开 发人员。应用程序的开发人员已经完全和底层的东西隔离开了。 举个例子。如果你想做一个串口的调试程序,直接用 win32 的 API 函数即可。而嵌入式系统的设计人员必须告述 CPU 把数据从那 个地址(I/O 映射地址)读出,然后发送到那个地址(I/O)映射口。 现在的嵌入式芯片厂商提供了许多开发平台,例如 mircochip 公 司推出的 MPLAB IDE 他可以直接用 C 语言编程。而且,最近他又推 出了与外设相关的 C 库。据此,很多人认为做基于 PIC 的嵌入式开 发只要精通 C 就够了。其实这样是很不负责任的想法,我们的设计 时间,只是整个系统设计中花费时间中很小的一部分,调试才是最费 时的工作。如果整个系统有一个寄存器的某个位,没有弄清他的涵义 你就会在调试的时候陷入问题的汪洋大海。我深有体会,编写代码不 难,难的是调试。所以为了减轻自己将来调试的负担,还是从最底层 学习起吧!这样在遇到问题时,才能找到症结所在。而技术上无所不 能,追求卓越才是作为新时代技术人员的我们的最终目标!路漫漫其 修远兮,吾将上下而求索! 谨以本文档,与有志投身于祖国技术复兴的青年共勉! 本人水平有限,如有任何谬误真心欢迎各位的批评指正。 鹏哥 QQ:516190948 鹏哥邮箱:516190948@qq.com 绪论——方法与背景 嵌入所需的知识很多,整个计算机科学所需要的知识,他都有所 涉及。正如鹏哥前文所述,如果要学深入必须都要清楚。为了让大家 有个学习嵌入式的思路,本章主要介绍一下嵌入式的背景知识和学习 方法。这一章没有过多的理论知识,就当是热热身。引用咱们超哥的 一句话:“所有的文章绪论多是那个调调!”,希望除了“那个调调” 外,我能写出其他的调调。呵呵。 背景介绍 这里我不想拷贝网上的资源,拷贝了大家可能也不愿意看。我们 都在浪费时间,所以我这里以我自己的知识结构去讨论嵌入式背景。 另外,整篇文档我坚持自己的绝对原创。所有材料一律自己归纳及敲 入,也希望大家能够坚持看下去。 嵌入式定义 嵌入式系统就是在一个专用的系统中,嵌入有计算机系统的系 统。这是我对对嵌入式系统的鹏哥定义。红色标出的部分是嵌入式系 统的本质特征。那么我们可以得出嵌入式系统与其他系统的本质区 别:嵌入式系统只是系统的一个“附属品”,整个系统的核心功能不 是嵌入的计算机系统。整个系统的核心是那个专用系统。 这样说太抽象,举个例子就好理解了。例如在一个智能洗衣机(一 定要是智能的,不是机械的。否则是没有嵌入计算机系统,当然也就 不是嵌入式系统)中。他的核心功能是洗衣服,那么整个洗衣机系统 的核心就是洗衣服的那个桶和让那个桶旋转的马达。嵌入式只是整个 系统的一个“附属”设备。 再往深一步,我们做一下理想实验(爱因斯坦发明的,就是一种 逻辑推理方法)。假设我们的洗衣机没有了嵌入的计算机系统,那么 他还有滚桶和马达,我们还是可以做成一个机械式的洗衣机。但是如 果没有了滚桶和马达。只有嵌入的计算机系统,那么机械的洗衣机都 做不出来,你就只有手洗了&_&。 这样举例,大家应该就清楚了一点吧? 对比单片机与嵌入式 单片机与嵌入式有区别吗? 这一点是很多人的疑问,下面说说鹏哥的观点。 单片机顾名思义,就是单片计算机。他的本质特征是单片,也就 是整个计算机系统只有一片芯片,举个例子单片机在一个芯片上必须 有 CPU、存储器、IO,有这三大部分就是一个计算机系统了。那么 我们就称这类芯片为单芯片计算机,简称单片机。 嵌入式的基本特点前文已经说明,他必须是嵌入到专用系统中的 计算机系统。那么整个计算机系统是否为一个芯片实现的,不能决定 他是否是嵌入式。 这也可以理解很多单片机系统也叫嵌入式系统了,这些名称的混 淆都是商业化的恶果。所以我们可以得出以下鹏哥结论:钱不是个好 东西。因为商业,搞得我们单片机和嵌入式都分不清了。玩笑,玩笑 (^_^)继续正文。 这也就好理解嵌入式中有些系统的平台是单片机、有些是 ARM、 有些是 FPGA 了。只要计算机系统是整个系统中的非核心设备,广告 中爱叫什么就叫什么:用的单片机芯片就是基于单片机的嵌入式;用 的 ARM 芯片就是基于 ARM 的嵌入式;用的 FPGA 芯片就是基于 FPGA 的嵌入式、用鹏哥芯片就是基于鹏哥的嵌入式…… 非嵌入式 或许有同学想问,嵌入式有与之对应的非嵌入式吗? 这个问题问得好,因为你已经问到哲学层面了。起码,自然辩证 法是过关了的,知道事物具有两面性(^_^)。 很显然非嵌入式是有的,而且你很熟!不信,你现在用什么在看 我的文档?电脑!答对了,加 10 分!电脑,业界也称他为个人计算 机(PC)就是非嵌入式计算机。两点来证明: „ 它是计算机 „ 他是系统的核心 OK,所以我们得到非嵌入式系统的鹏哥定义。以计算机系统作 为系统核心的系统就是非嵌入式系统。这里出个思考题,看看大家概 念是否清晰。如果设计出了一个图像处理算法,怎样使实现它的系统 为嵌入式系统;怎样实现它就是非嵌入式系统呢?想一会在往后看哦 (&_&)。 如果你用硬件实现这个算法。例如,首先,用 HDL(硬件描述语 言)设计;然后,用综合器综合;最后,在硬件(ASIC、FPGA 都可以) 上实现它。并且,用一个处理核(可硬,可软)来做相应辅助的配置类 工作,这就是嵌入式。注意:这里的处理核不可少!否者计算机系统 就没了,也就不是嵌入式了(那叫做纯硬件实现,如果你把所有的算 法都这么实现只能说明一个问题,你很牛!你们公司更牛!因为这是 很需要技术的,这是很需要钱的!这是很需要……。记住鹏哥忠告: 嵌入式系统实现可以达到性能要求的算法,永远不要去用纯硬件实 现!)。 如果你用 matlab、perl、python、C、C++、java、C#……实现它 那么就是非嵌入式。通常情况下,这是基于 PC 机这一通用硬件平台 实现的。当然,如果你足够牛。自己搭建一个嵌入式平台,然后编写 相应的编译器(例如针对你硬件平台的 C 编译器)。这样就可以在你自 己的硬件板上跑算法了。这很好,但是你得很牛!认真看完本文档后 你就可以这么牛,当然看完文档后你得花时间领悟。鹏哥就是这么悟 过来的。 嵌入式为何火 好的,你是个爱提问的同学,问题又来了。既然嵌入式不是系统 核心,业界为何炒得这么火? 这个问题在偷换概念哦。我把这个问题重复一遍:既然嵌入式不 是系统核心,业界为何炒得这么火。 注意我标红的部分,懂了吗?不太懂?好吧,那我多罗嗦两句: 嵌入式不是系统的核心,所以设计整个系统的项目组中最核心的成员 当然不是设计嵌入式的人,而是设计那些专用系统的人。 例如洗衣机项目组中最核心的成员是设计洗衣桶的和马达的成 员,做嵌入式的成员跳槽了。咱就做成机械式的洗衣机,不用计算机 系统(整个系统的一个非核心子系统)。但是做洗衣桶和马达的人跳槽 了,那我们只有用手洗了(^_^)。也就没有洗衣机了。 业界之所以把嵌入式炒得这么火,是因为嵌入式是业界的核心。 整个 IT 产业的基石就是计算机技术,正因为计算机牛,我们(IT 人) 就像让其他行业的人也“沐浴”在计算机技术的阳光下。而嵌入式就 是我们 IT 人员的切入点,无论那个行业,只要我们会嵌入式就能去 挖他们的墙角。所以嵌入式很火,从后文可以看出嵌入式就是计算机 系统在不同行业背景下的不同表现形式。 总之对于我们学通信的人,必须学好通信原理,数字信号处理等 核心课程,这是我们看家本领,这是根本。嵌入式学好了,我们就可 以预防别人挖我们墙角(这如同:有女朋友的要保护好,千万别被人 家挖走了),所以二者不可偏废。女朋友得有(这是看家本领),还得防 着别人计算机的挖墙角(这也很重要)。 总结一点哲学上的东西,掌握一个概念要掌握它的本质,就像学 习嵌入式要学习他的本质。否则毫无用处或则用处不大。整个背景部 分都没记住也没关系,只要记住嵌入式的鹏哥定义就行了。 信鹏哥,得永生! 嵌入式概论 新手进入嵌入式领域有两大问题急需解决: 一个是如何设计嵌入式系统需要有一个宏观上的把握; 二是如何学习嵌入式系统的设计。 鹏哥对此很同情,为你们量身定制了本节,所以尽情的感动吧! 但是不要企图爱上鹏哥,因为鹏哥只是个传说(&_&)。呵呵,玩笑, 玩笑。正文继续。 嵌入式设计 简单说来,嵌入式的设计方法就是如下两步: z 把整个系统分为子系统 z 每个子系统分别设计 其中,每个子系统可以多小组并行设计。大事(整个系统)化小(小 系统),小事(小系统)化了(设计成功)是我们的设计方法。这个大家都 能理解,但是怎么才能划分系统。用什么原则来划分呢?划分的原则 就是分层(后文会详细介绍),硬件人员负责硬件部分,HAL(硬件抽象 层)人员负责 HAL,RTOS(嵌入式操作系统)人员负责 RTOS,应用人 员负责应用程序……。这样划分我们的每个小组就可以明确的负责某 一部分,这样便于经验的积累。这是一种管理哲学!任何人(团队) 只要专注于某一部分,时间长了高效率是必然结果。例如,让你做十 年应用设计,你绝对可以精通应用软件的设计。 所以我们在项目分工的时候,项目管理人员必须依据系统的上层 对项目整体把握项目。下层涉及的细节太多,对于项目决策没有好处。 上层对于项目所要完成的功能定义明确了,项目就处于可控制的状 态。各小组的分工也就会明确。这其实也就是我们的黄老师天天说的 整体了解啊! 这里我不得不重复荣哥口中的真理:信元哥,得永生!&_& 嵌入式学习 设计归设计,嵌入式学习是否和设计一样呢?相信,进入研究所 的同学,都不仅仅是想混口饭吃而已。我们是有理想的,有理想需要 奋斗。什么是奋斗?奋斗就是:有困难克服困难要上,没有困难制造 困难也要上!——鹏哥定义(引自子赵本山的小品^_^) 为什么要制造困难呢?这么说吧,如果我们的嵌入式学习如果只 关注与最上层的相关的一些问题,那么一旦调试时出现问题怎么办? 例如,当你用 VC++写一个程序,在程序中定义一个宏如下: #define DEBUG 恭喜你,中奖了!VC++会告诉你,你的程序有链接错误!昏了 吧?只听说过编译,没听说过链接?这就是你不关注底层的后果。如 果你不了解底层,你永远找不出这段代码的问题所在。因为 VC++编 译器在编译代码时会自动加上许多的内置宏,很不幸其中有一个宏名 字也叫做 DEBUG。在编译完成后就有两个标示符(编译器会自动生成) 是 DEBUG,后续工作的链接器就不知道如何处理了(两个 DEBUG 分 不清)。这时他就告诉你出现了一个连接错误,DEBUG 宏重名! 如果上面这个例子读不懂,很不幸你应该不是计算机专业的,没 有学过编译原理,看看书吧,没你想的那么难。如果你是计算机专业 的也看不懂。哎!你更不幸!看家的本领都没学好啊,趁别人不知道 赶快看书去吧!再不努力,小心我们通信的会抢你饭碗,挖你墙角(抢 走你女朋友)啊&_&。 所以底层必须关注,必须了解。这样才是技术性人才的王道!学 习嵌入式设计和做房子是一个道理,根基不牢房子早晚会跨! 所以总结一下,学习嵌入式自底向上,设计嵌入式自顶向下。 最后,还是那句话…… 信鹏哥,得永生!当然这一节还得加一句:信元哥,得永生! 思维方式——嵌入式哲学 行文到这里,我深深的体会到了哲学家的伟大。哲学是最抽象科 学,它具有普片适用性。学习嵌入式这么久,还没有悟出一点点哲学, 说出来大家也不信。哲学悟倒是悟出了一些,但是表达不出来。自己 从小语文就不好,所以唯一能做的就是尽力表达了。没有说清楚的地 方,大家给我邮件。抱歉! 这部分的内容绝对不是说教,所以希望大家认真看下去。这对你 以后实际的项目操作必定大有好处。所有的内容都是自己的总结,绝 无拷贝,我能坚持写下去,希望大家可以坚持看下去。相信你会有收 获的!下面先讨论第一点: 抽象哲学——嵌入式中物质与意识 刚学哲学觉得马克思很无聊,搞出物质和意识来“欺骗”鹏哥这 种纯情小少男(&_&)。随着鹏哥年龄的增长,知识结构的日趋全面, 设计经验的日趋丰富。深深的体会到了马克思哲学的神社与深刻!从 此鹏哥不再是纯情小少男,而是成熟的男人!(&_&) 信思哥,得永生! 时域与频域 学过信号与系统的同学很熟悉这两个概念,但是这两个概念的本 质是什么?你说的清楚吗? 物质就是一种客观实在,这种客观实在不以人的意识为转移。我 们的时域就是物质。时域是信号不以人的意识为转移的“域”,所以 他是物质的。他是永恒不灭的,我们从出生到死亡都是处于时域之中 的。信号和我们一样,它从出生(产生)到死亡(衰减到零)也是处于是 与之中的。 意识是物质在人脑中的抽象。他是人脑对客观世界的一种反应。 频域就是意识的,他是存在与我们人脑中的抽象。他会受我们的大脑 作用而变化。例如傅里叶变化的频域和小波分析的频域……等等。他 们基波不一样(正弦波、小波),所以频域的描述方式和适用范围就不 一样。 咱么斯哥说:“物质决定意思,意识对物质具有反作用”。我们的 时域和频域也一样,时域决定频域。因为他是物质的,他是真实的。 频域只是我们更好(直观)的表达信号的一种意识的东西。他很重要, 但不是客观存在的!这样你就好理解为什么有了傅里叶变换又会有小 波变换,而且两个都是频域。到底哪个才是真正的频域。永远要记住 我们斯哥的话:“时域决定频域,频域可以反映出时域”,小波和正弦 波都是为了更好的描述时域信号的,他们都是频域,都是意识。 插入方波时域和频谱图 matlab 时域是物质的,他是我们信号分析的基础。必须以它为基础,不 能脱离这个基础。频域仅仅是一种数学抽象!它存在的唯一原因是能 简化我们的分析,如果时域的分析比频域分析要简单就绝不要有频域 分析。所以在学过信号与系统、数字信号处理、现代数字信号处理等 一系列课程后丢掉时域这个基础,是非常错误的!客观世界是以时域 为唯一法则的。我们示波器里的原始信号永远是时域的! 物理内存和寻址空间 计算机内存是它的核心器件(计算机的硬件结构参见后文),所有 的微机原理书上在关于编程模型的部分,都有物理内存和寻址空间这 两个容易混淆的概念。 在这里物理内存就是物质的,寻址空间就是意识的。物理内存就 是你在电脑城买电脑时花钱买的内存。寻址空间是 CPU 对物理内存 的一种逻辑上的抽象。这种抽象存在的唯一原因就是帮助我们的编 程,简化我们的设计。 举个例子:我们现在的 PC 机一般都是 32 位(地址总线位宽为 32) 的。那么他的寻址空间就是 232 = 4Gbit ,但是有几个人的电脑内存(物 理内存)是 4G 的?所以如果用最简单的寻址方式(这里只讨论平坦模 式,复杂的寻址方式这里不考虑,例如段页式寻址),我们是无法寻 址到很高的地址空间的,这些空间只是一种逻辑(意识)上的内存。这 种情况是由我们物理内存的大小限制决定的。 加入一个内存寻址空图。 如上图所示,我们的寻址空间,高地址好像没有使用。其实是有 大作用的。我们的外部设备可以映射到内存的寻址空间,这样操作起 来更统一。编程的时候,把外设也当做内存来使用,设计会简化许多。 我们驱动程序的编写也是以这个客观事实为基础的。 再举个例子,有些单片机的寄存器其实也是内存映射的。单片机 的芯片内有物理内存(客观存在的内存),而寄存器实际上是不存在 的,他们都是映射到特殊地址的实体内存后,“虚拟”出硬件。这就 要求我们设计时,要确保这些寄存器的特殊地址不会被用户程序覆 盖,否则寄存器系统就混乱了。 插入 51 寄存器地址图。 实际模型与理想模型 去耦电容的电路模型 理想电容,实际电容 RLC 传输线,实际传输线 具体哲学——设计准则 认真调研,谨慎周密 一个项目来了,开始调研最枯燥的时候。我个人在技术工作上, 是个慢性子。在项目的开始阶段,先在网上查找一些表面的东西。根 据这些内容看几本书。这样做我感觉可以达到质量与效率的平衡。 在网上找的资料,比较通俗和便捷。可以直奔主题,比较适合对 项目有一个整体的把握和理解。鹏哥认为,大家在这一步对项目有个 整体的思路就可以了。 由于网上的资料很杂,不成系统。这一点只有通过看书来解决。 技术类的书一般都是针对某个主题全面深入的。对于我们深入理解项 目的某个问题大有好处。 例如,学习 C 语言时上网可以查到 C 语言大概的相关要点,但 是让你找出函数指针如何实现基于对象的编程关系你找的到吗?一 般很难找到。一个学科的内部联系建立不起来,这个学科是学不牢的。 经典的书肯定是面面俱到,如果能够通读,自己就可以建立起每个知 识点间的联系,这样可以学习得很牢固。这里推荐几个买书的网站: 当当:http://www.dangdang.com/ 当当的书很全,但是比较贵。 卓越:http://www.amazon.cn/ 卓越的书没有当当的全,但是便宜点。 淘宝:http://www.amazon.cn/ 书最全,但是单本购书时运费较高。 修改设计,适应环境 现实世界是多种多样的,我们设计中出现的问题也会是多种多样 的。我承认现代的软件很完善,但是最精确的还是现实世界。如果仿 真和实物结果不一致大家一定不要怀疑是现实世界出了问题,出问题 的一定仿真。仿真是意识的(仿的是真实世界,只能无限接近,不能 精确相等),真实世界才是物质的! 对 EDA 工具有一定了解的同学肯定知道,所有的仿真都是基于 数学模型的。现实的多样性未必能用数学模型中的有限参数描述。所 以当设计出现和预期不一致的情况时,绝对是设计的不完善。所以我 们不要去试图修改环境来获得结果,而是修改设计来适应环境。否则, 这是假技术、伪科学。 举个 C 语言例子,如果我们设计一个除法函数。我们可以写如 下代码(请注意此代码仅供说明,上机调试无法通过的): divide(int a,int b,int result) { return result=a/b; } OK,正常情况下可以很好的执行除法运算。但是设想一下,如 果哪天你的小外甥(假设不知道 0 不能作为除数)被他父母带到你家来 玩。他想运行一下你的程序,完成老师布置的作业。但是很不幸,他 给的第二个参数(b)是 0,然后期待结果出现。这是他会得到一个 error, 这不是他的错,而是你的错。这个 error 属于你!因为你的设计没有 考虑到现实中所有可能的情况。 这时,你不能责怪你的小外甥输入错误,而是去改正这个 bug。 因为当你的这个程序那天用在一个大型的项目中,调用这个函数的是 系统本身。它和你的小外甥一样,不知道不能传给 b 一个 0。如果他 传入的是 0,那你的调试就会很痛苦,几千行的代码,你从那里查 起?? 所以你应该感谢你的小外甥(因为他帮你完成了程序的测试,实 际的系统测试也是这样的),然后修正这个 bug 以免系统集成时的痛 苦。真正的设计应该是这样: divide(int a,int b,int result) { if(0==b) //常数写前面,避免将“= =”写为“=”时 Debug 困难。如 //果是 0=b,编译时报错,但是如果 b=0 编译不报错,运行//时才报错 printf(“您的除数为零!请重新输入\n”); else return result=a/b; } 总结一下,这个简单的例子的很好的说明了以下几点: z 设计时尽量适应环境 z 不要对系统的输入做主观臆断 z 好的系统测试不应该由系统设计人员来做 第一点是这个小结的标题,不再讨论。 第二点,我们设计人员的一种基本素养,严谨性是所有实用系统 的必然要求。我们现在是在实验室。但是不会永远在实验室,我们的 设计不应该永远只能用于理想环境下。所以严谨是设计人员的永恒要 求! 第三点,……哎!没办法又得说道人性了。不得不承认,我们都 是普通人,每个人都有只我保护的倾向,自己的代码怎么忍心去否定? (测试就是一种否定、正常人谁愿意否定自己) 还有一个原因,项目是自己设计的,自己对他有一些假定所以肯 定会正确使用。所以,一般而言大公司中测试人员和设计人员不是同 一个人,建议我们实验室也可以这样。如果做不到,自己测试也行。 那就这样操作,找一个对你的设计的项目不熟悉的人站在你旁边,向 他解释你的设计。这时你不得不对他说明你对项目所作的假设(而这 种假设通常是问题的根源!),然后你自己也会发现这个假设在现实世 界中是不存在的,那么你设计中的 bug 也就 debug 了。怎么样,自己 否定自己比被别人否定自己要好受点吧?那么以后项目的测试就这 么操作吧! 顺藤摸瓜,由简入繁 z 傅里叶谐波分析 插入阶跃信号的谱图分析,一阶二阶等。 z 分层设计,简化实现 计算机技术中的所有问题,都可以通过设计出一个新的设计层次 来解决!——鹏哥定理。 由此可以得出:分层设计,简化实现这个思想很重要! 当然,说这个是鹏哥定理是开个玩笑,但这句话的确出自一位计 算机大师之口这是千真万确得,但这个大师不是我。具体是谁,我…… 我……搞忘了。可能是 Dennis M Ritchie(C 语言之父 Unix 之父)、Linus Torvalds(Linux 之父)、Richard Stallman(GNU 之父)当然也可能能是 Bill Gates(microsoft 前老大)……不管是谁说的,这句话的确是真理, 不信?下一节,我将用一节的篇幅介绍一下分层设计方法。如果看完 了还不信,那么请你看一遍目录。我整篇文档的结构都是按照分层设 计来组织的!还不信?那我只有说:同志啊! 信鹏哥,得永生! 呵呵,开了个玩笑,下面言归正传。这里我给出几个层次图。这 几个层次图可是绝对原创哦,任何书上都不会有的,就算有也不会全。 1 1 1 1 API MP3 JEPG FFT RTOS API 应用层 RTOS CPU RTOS内核 硬件抽象层 CPU 从左向右越来越复杂。 最简单的单片机系统(也可以做成嵌入式系统,结合前文的定 义),只要有硬件软件就可以。因为系统简单不分层(其实还是分为硬 件和软件程)也可以设计成功,早期的单片机系统就是这样。 其次是稍复杂一点的系统,加入了一层中间层可以把硬件的细节 屏蔽掉。例如前文中的逻辑地址和物理内存,我们使用逻辑地址就可 以屏蔽掉硬件的不通用性。通过地址映射建立起外部设备和地址空间 的关系。然后应用层的设计就无需考虑具体的硬件细节,简化了设计。 我们做的许多的 51 试验就是这样的。不相信,那么大家看看自己的 keil51 是否有一个很特殊的头文件叫做 reg51.h。(具体名字可能 keil 版本有关,但是和寄存器有关)这个头文件就是中间层。他把寄存器 映射为物理地址(二进制的数)。大家可以自己先研究一下,后文中我 会比较详细的说明。 现在给大家一个鹏哥公理:人类是一种智慧生物,但是这种智慧 生物每次只能处理一定数据量的信息。超过这个数据量,人类就无法 处理。但是人类可以多次处理销量数据。所以如果把大量的信息加以 分组,然后按照分组处理。那么人类的可以处理的信息量是无穷的! 设计也是一样的。我们如果把大的系统划分,每次处理一个小系 统。系统外的东西概不考虑,这样就可以简化设计。最后再把所有的 小系统集成,大系统也就设计完成了。 后面两个结构图基本上就是嵌入式了。他们都有 RTOS(实时操 作系统)。简单的嵌入式第三个图的分层,已经可以使每个小系统足 够小,凭人类的智慧可以设计,所以小系统一般采用第三个。 但是一个大的嵌入式系统,例如火星探测车。他需要完成的功能 太复杂,以至于第三个分层图的子系统也不够小。那么就继续分,分 为如下的分层图(上面的封层图太小看不清,重绘如下): 这个结构图看起来挺复杂,但是他能能使设计简化。因为抽出结 构图中的每一个模块,都有专家(专家当然也是人类,难道这你也不 信?)能够精通。也就是说,每个小系统都可以设计出来并且设计得 足够好。那么集成后系统的性能和稳定性就足以使我们的火星车在火 星上完成任务。再次赞美,伟大的“勇气”号和“机遇”号!但愿我 们的祖国也能早日登上火星! 由于分层思想的重要性,所以后文的行文都是以上方结构图为框 架继续的。每一层的具体作用,后文会有详细的介绍。 硬件设计——系统基石 背景介绍 硬件核心(处理器+存储器) 外设 硬件实现 中间层——通向高层的桥梁 背景介绍 硬件抽象 外设驱动 板级支持包 RTOS——系统核心 背景介绍 设计哲学 调度基础 通信机制 应用程序——用户的接口 背景介绍 常用工具 中间件 设计技巧 附录—— 堆和栈 内存管理

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。