截至眼下,单片机入门篇的介绍就告一段落了。从本文開始将进入思想篇的学习。
思想篇对后面的详细知识学习进行总体的框架介绍,解释一些基础名词。以及对学习思想方法进行总结。
思想篇的内容,对于后面的学习有非常大的指导作用。尤其是模块化思想将会贯穿整个学习篇的知识体系。
思想篇并不仅限于接下来的几篇文章。还会在学习篇中通过话题的形式穿插解说。
阅读建议:假设还没有涉及到实践。阅读时不一定能对思想方法有深刻的认识,看的时候有个大致的认识就能够了。
在详细实践的时候,能够依据须要再回来看一看。
==================================
为了让大家更好的理解单片机,从本文開始,会先对单片机/计算机系统进行一个总体的介绍。
让大家对单片机的学习和单片机系统的设计有个比較准确的把握,更好的分清后面各种知识点之间的联系,以及它们之间的轻重主次。学习起来更加得心应手。
在这几篇里,会涉及到大量新的名词术语,而这些也正是非常多刚開始学习的人遇到的巨大的困难。
我会用通俗的语言对它们进行介绍,不须要理解的非常透彻,仅仅要有一个大致的认识就能够了。同一时候。也会涉及单片机和计算机系统的各种设计思想。以及学习时的思路技巧等。
由于单片机和计算机本质上没有太大的差别。所以这里介绍的内容绝不是只局限于51单片机,也不不过单片机,而是包括计算机在内的各种微机系统。
废话不多说,以下进入正题。
模块化思想
模块化是一个非常重要的思想,它的应用不只局限在单片机等技术方面。还体如今我们的身体构造,体如今人类社会生产生活中的方方面面。
何为模块化思想呢?依照我的理解,模块化思想有几个特点,以下一一道来。
1、分工合作与专一
对生物学有基本认识的人都知道,包含人在内的非常多动物是由多种器官构成的,比如大脑负责思考,心脏负责输送血液等。
每一个器官或组织负责几项功能。各个器官之间协调工作。共同构成一个复杂的总体。
在人类社会中。分工合作的现象也是非经常见的。
生活中须要吃饭穿衣,在比較落后的年代,可能有一些自给自足的经济形式,自己劳动满足最主要的生活需求。而在现代社会,人的需求越来越多。不可能所有靠自己生产。
每一个人都专注于自己的特长。比如农民负责种植粮食,服装工人负责制造衣服,养殖户负责养殖,程序猿负责编敲代码等。
各种人分工合作。最后互相交换劳动成果。
当一个人长期专注于一件事,而不用操心自己其它的需求时。这个人能把这件事做得更好,整体上来看。社会的生产力也就大大提高了。
2、模块抽象
假设对电脑的基本组成有所了解。能够知道电脑由CPU、内存、硬盘、主板、显示器等几部分组成。假设想在电脑中存储很多其它的电影,能够考虑更换更大的硬盘。我们仅仅须要知道硬盘是电脑中负责存储的部件,而不关注硬盘内部的构造。
由于每一个模块都是高度抽象的。内部原理可能非常复杂,可是对外部而言。它仅仅是一个能完毕特定功能的黑盒子。
这样抽象的优点,就是在更换硬盘时。仅仅须要从外部对硬盘有一个抽象的认识。就能轻松解决这个问题,剩下的就仅仅是花钱购买硬盘了。
3、分层
假设让你管理一个庞大的公司,你会怎么管理?分层管理将会是一个非常好的选择。
你能够依据实际情况将公司分为几个部门。研发部、营销部、財务部、人事后勤部等。每一个部门指派几个负责人进行管理,每一个部门负责指定的工作。
而详细到研发部,管理人员为了便于管理,又可能将其分为软件部、硬件部等;而到了软件部,又会有不同的团队,移动client开发、server端开发等等。这样一层一层进行分下来,每一个人各司其职,也体现了分工合作的特点。
假设你是公司的老总。当发现这个月公司的软件产品开发进度很慢时,可能会直接叫来研发部的总管大发雷霆:“公司的XX软件开发太慢了,你看人家公司的同类产品早就公布出去了。这件事你得尽快给我搞定,要不然就走人!”然后指令一层一层的下达到了最下层的员工。最底层的程序员们就又要加班加点拼命的干活了。研发进度慢也许仅仅是由于有几个程序员近期有事请假了。可是在这个过程中,你不须要过多关注底层的细节。你也没有太多精力去关注,而仅仅是把整个研发部当做一个抽象的总体去对待,这也体现了模块抽象的特点。
模块化设计的方法原则
前面说了模块化思想的特点。模块化思想应用非常广泛。而依据这样的思想设计系统,就是模块化设计了。
不仅仅是单片机系统,计算机软硬件系统也能够充分利用模块化设计。
这里先说一说模块化设计的方法思路。
对于刚開始学习的人。对此仅仅须要先有个大概的认识。没有实际设计过,对这些思想也不easy有所感触;后来须要设计实际系统时,有须要回来再看看这篇就好了。
1、自顶向下。逐步求精;逻辑设计与物理实现分离;自底向上
当要设计一个比較复杂的系统时,经常会先画框图,每一个框表示一个抽象的功能模块。
通过框图能够设计这些模块之间的逻辑关系,然后再细化去设计每一个模块。而这样一个模块可能也比較复杂。这时又会将其拆分为更小的模块。这样一步一步的拆分模块,直到最后技术细节实现。
这就是自顶向下的设计方法,将一个复杂问题进行分解,逐步求精。而框图的设计则是模块之间的逻辑设计,逻辑设计与每一个模块的详细物理实现能够全然分离。
和自顶向下的设计方法相比,另一种恰恰相反的思路:自底向上。
先设计出一些核心模块,然后再逐步进行扩展和完好。全然的自底向上的方法仅仅适合设计小型的系统。在实际应用中,往往是结合这两种方法进行设计。
2、模块独立。减小耦合度
模块化设计中非常重要的一个思想是模块独立。减小模块之间的耦合度。也就是说,每一个模块负责完毕自己的功能,不同的模块之间关联要尽可能小,以免互相影响。
想给电脑换一个更大的硬盘时。一般不用考虑内存等其它模块会不会受到影响,要不然实在是太麻烦了。由于电脑的模块化设计非常规范。模块之间的关联非常小。
减小耦合度这样的看似简单的问题。实际上在设计的时候却相当麻烦,为了减小耦合度,须要使用非常多技术来完毕。后面会在实际操作中进行介绍。
3、模块标准化,可代换
有同学认为自己的电脑反应太慢,网上一查。原来电脑慢非常大可能是由于机械硬盘的速度太慢。相比硬盘,CPU和内存要快非常多。所以就如木桶效应,电脑被最慢的硬盘给拖慢了速度。于是就给电脑换上了固态硬盘,顿时速度快了非常多。
固态硬盘和机械硬盘的内部结构是全然不一样的。机械硬盘是依靠磁性盘片存储数据的。读写时须要机械结构带动盘片转动,机械转动速度不能太快(2.5寸机械硬盘以7200转每分钟的速度旋转,盘片边缘的速度能达到86km/h)。太快了盘片可能会直接破裂,或者发热量巨大。所以读写速度远远没有电子器件快。而固态硬盘使用的就是电子芯片来实现数据存储,所以速度很快。
两种硬盘尽管原理和性能差距都非常大,可是却能非常轻松的安装在同一台电脑上,仅仅要保证一些參数匹配。比如都是2.5寸的。
这是由于现有的不同硬盘设计的都是标准化的,硬盘的尺寸、接口等都有标准规范,所以能非常轻松的代换。
4、模块通用性,适用于多种产品
几年曾经的手机等数码产品,不同品牌、不同设备分别由不同的人和公司设计,充电的接口各不同样,充电器也都是每一个数码产品专门配备一套,出门旅行带的数码产品一多,不过大大小小的各种充电器就够让人烦了。并且充电器坏了只能又一次买配套的充电器。这种设计浪费了非常多资源,也给人们的生活带来了非常大的不便。
而近几年,MP3、MP4、手机等数码产品的充电器接口慢慢被统一起来,非常多设备都能够使用通用的USB充电头和数据线进行充电。
对于用户来说方便多了;对于设备制造商来说,也不是非常有必要单独设计充电器。直接用标准充电器就能够了。还节约了资源,比如有些数码设备充电器是能够选配的,有充电器就不用再进行购买了。通用的充电头和手机充电接口设计,使得一个充电器能够用于多种产品。
通用性和前面一点标准化,两者事实上都能够理解成。设计一个模块或系统,都要遵循一定的标准化规范。一个标准化的模块,能够应用于不同的系统(通用充电器给多种设备充电);而符合统一标准的多个同类模块,能够用于同一个系统(机械硬盘和固态硬盘都能装进电脑)。
模块化设计的优缺点
前面通过举例。已经明白的体现了模块化设计的非常多长处,这里对其特点进行一个总结。
1、便于分工合作
对于一个实际产品。非常多时候不是一个人开发的,而是非常多人共同开发。这里的原因有非常多。可能是由于时间比較紧。比如公司之间的竞争。谁最先开发并公布新的产品,就最有可能抢占市场。可能是由于系统太庞大,一个人一辈子也做不完,比如操作系统的代码量往往能达到几百万行;分工合作还会提高总体效率。前面已经说过了。
多个人开发同一个系统,模块化开发是最好的选择。
一些人专注于一个领域,比如安卓程序、平面设计、server等。每一个人负责开发和他的专注领域匹配的小模块,而另外一些知识面比較广、经验丰富的人。负责模块之间的逻辑组合。最后将整个系统整合到一起。这个过程也可能会有分层,系统分成大的模块,再拆分成小的模块,逐层分解并实现。
2、提高开发效率
一方面,分工合作的方式能提高效率。还有一方面,运用已经实现好的模块。像积木一样搭建新的系统,更是让效率大大提高。
模块的开发。可能是非常多人分别完毕的。也可能是同一个人在不同一时候期完毕的,还有可能是从别人那免费获得或购买的。
详细到单片机的学习,事实上一開始我们就在使用别人的模块。
单片机、各种元件都是别人生产好的,运用这些模块。我们非常快的搭建了自己的开发板。
相同的道理,在后面的具体学习过程中,我希望大家每次学完一个技术知识,就自己实现一个程序模块,比如数码管的驱动程序(尽管如今你可能还不理解这是什么)。到整个知识都快学完了,就有了一套自己的程序库,也就是全套的模块程序。
时间久了,也许你就有点记不清数码管驱动当初是怎么写的了。可是没关系,仅仅要你写好了自己的程序模块,而且给出了规范的使用说明,须要时直接照着说明去用就能够了,而不须要再去复习一遍前面的知识。所以在后面开发自己的单片机系统时,直接用自己开发好的模块。就能极大的提高开发效率。
而在后面具体技术的学习中。我也会具体的分析,怎样才干尽可能好的实现每个模块,用到哪些技术知识,帮助大家一起搭建自己的程序库。
3、能开发出复杂系统
分工合作,使得人们能开发出一个人有生之年根本完毕不了的、非常庞大的系统。
而对于个人开发系统来说。假设你花几个月写一个比較庞大的程序。写到后面可能就忘记了前面的程序是怎么写的。这样可能会影响程序的继续编写。
这时你可能须要回过头来再看曾经的程序。但程序毕竟不是自然语言。看起来还是比較费劲的。非常可能后来你自己也非常难看懂了。至少是须要非常多时间才干看懂。
等你最终看懂了前面的东西。发现后面的代码又忘了。
而模块化的设计方法。你能够在一个小的时间段里,设计一个小的模块,并把它做的足够好,然后对整个模块编写一个自己能看懂的使用说明。
以后要用这个模块,就把它当做一个抽象的总体,不须要关注模块内部细节实现。直接看使用说明即可了。这样,你才更有可能独立开发一个比較庞大的程序。
4、便于维护和查错
便于维护也是模块化非常重要的一个特点。模块化讲究减少模块间的耦合度,一个不是非常核心的模块出了问题,往往不会对其它模块造成非常大影响。仅仅会表现出系统中的一些功能无法使用(当然,假设核心模块比如电脑CPU出了问题。可能会导致整个系统崩溃)。这时你能够直接推断出哪个模块有问题。然后去修复那个模块。大大缩小了检查错误的范围。
不知道大家对前面《单片机程序下载失败总结》的那篇文章还有没有印象,文中提到,下载失败时。假设你能有一套正常下载程序的电脑、下载线、单片机系统板装备,通过替换的方法,非常快就能确定问题是否出在你的电脑上。从这里能够看出来模块化思想在查错时的重大意义。
5、缺点
不论什么事物都有两面性。模块化思想也不例外。
这里我简单说一下。
不知道大家有没有听说过这种话。非常多互联网公司都是“三个人拿四个人的钱干五个人的活”。为什么非常多互联网公司工作非常累,工资非常高,可是老板却不愿意减少工资多招聘一些人,同一时候让员工能更轻松呢?
有本书叫《人月神话》。里面就解释了这个问题的解决办法。人月是一个单位,表示一个人一个月能完毕的工作量。依照人月理论。6个人月的工作两个人须要三个月完毕,而三个人则仅仅须要两个月。而事实是,在互联网公司,三个人往往须要远远不止两个月,甚至三个月还完毕不了任务,人月理论仅仅是一个不可能的神话。
为什么会这样呢?原因是多个人设计同一个系统,人与人之间须要沟通,人越多沟通须要的成本越大。所以招聘很多其它的人,意味着浪费掉很多其它的沟通成本。
假设把每一个人看做一个模块,人月神话说明了,过多的模块会添加模块之间的交流成本,从而减少系统效率;而在模块特别多、关系非常密切的时候,保持模块的独立性和模块之间的匹配,本身就成了非常大的难题。
可是整体来说,模块化的长处远大于缺点。有些时候模块化也是不得已而为之的。而一些缺点往往是在特定情况下才有的。
=======================================================
《单片机小白学步》系列教程(原名《单片机入门指南》)介绍
本系列教程从最主要的入门知识開始。逐步深入介绍单片机系统设计。内容包含:
1、入门篇:单片机等基本概念、各种电子设计基本知识
2、思想篇:单片机/计算机系统设计的project思想
3、学习篇:单片机学习过程、方法和技巧。以51单片机为例介绍,并推广到其它单片机
4、应用篇:遵循规范的project方法,设计单片机系统实例(计划设计的系统有:计算器、电子表、password锁、简易手机,详细看有没有时间再确定)
5、原理篇:从模拟电路、数字电路開始。逐步深入介绍单片机/计算机系统原理。并自行设计简易的CPU(因为个人水平有限,这部分没有把握写好。详细内容视情况而定)
教程特点
1、技术知识点全面,从入门到精通
包括了各种基本知识,尤其是对单片机基本概念的介绍、为什么要用单片机等,在非常多同类书籍教程中都被忽略了。同一时候也包括了一些深入的知识。包括原理篇考虑对单片机的基本原理进行介绍,有助于深入理解单片机。
本系列教程以51单片机为例进行介绍。通过51介绍完单片机的基本知识,我会再把430进行简要介绍,尤其是对照两者之间的优缺点。让大家非常快感受到430的巨大优势,而学习51正好为高速了解430打下了坚实的基础。
2、除了单片机知识,还有思想、方法、技巧的介绍
本系列教程中。介绍单片机各种模块编程知识的主要是学习篇。而学习篇仅仅是整个教程的一部分。在学习篇中我会贯穿各种方法技巧。怎样理解一些模块功能,怎么看时序图。严格遵守project思想进行编程,程序发生了错误怎么调试等等。而在思想篇中会整体介绍非常多重要的思想,为后面的学习做好准备工作。
3、知识先后顺序的设计
单片机学习过程中,涉及大量的知识,并且非常多知识之间相互依赖,关联非常强。
本系列教程对知识的先后顺序进行比較明白的规划,尽最大可能符合人的认知过程。可是实际规划时发现,不管怎么调整知识的顺序,总有一些知识之间相互依赖。关系复杂。
比如開始讲IO口的时候肯定会提到寄存器,而寄存器这个词的理解。须要深厚的背景知识。
可是这些背景知识在没有进行实践的时候也非常难理解。
刚開始学习的人经常就会在这种地方感觉疑惑不解,不知所措。而每次遇到类似这种知识。我会向刚開始学习的人指出,应该怎样对待。这个知识是应该自己去学习补充,还是等到学完原理篇再做理解。而如今又应该怎么去看待这个名词。
另外,在整个教程的学习前,须要掌握一定的C语言等基础知识,详细可參考教程第〇篇《序》中的相关说明
http://www.hainter.com/mcu-primer-0
4、语言通俗易懂
本系列教程力求语言通俗易懂,而不会用一堆新手不懂的词语去解释还有一个不懂的词语。可是受限于个人语言表达能力,可能有些地方表述的比較繁琐,或者不清楚,希望大家可以帮忙指出。
其它问题
假设认为我写的对你有帮助,欢迎多多反馈,包含写的不对、不合理、不太明确都能够指出来,这样方便我对其进行完好。
很多其它可參见:《怎样以学习单片机为契机,逐步成为优秀的project师》
http://www.hainter.com/mcu-engineer
本系列教程首发于我的个人主页,欢迎訪问(因为是国外server,速度略微有点慢):
http://www.hainter.com/category/hacker/mcu-primer
同一时候会将其转发到CSDN、电子发烧友等网站。欢迎关注。
CSDN专栏网址 http://blog.csdn.net/column/details/mcu-introduction.html
电子发烧友论坛 http://bbs.elecfans.com/zhuti_mcu_1.html