目录
第一章《振南当年入门 C 语言和单片机的那些事儿》
1、注定堕入单片机
1.1 懵懂好奇的我
(小时候好奇的性格经常让我屁股开花。初中开始对计算机产生兴趣,并一发不可收拾。)
1.2 我的 C 语言学习经历
(上大学后自学 C 语言。遇到“能人”加入 ACM 竞赛。感觉 C 语言乐趣多多,程序如人生。)
1.3 C 语言的顶级赛事
(ACM 国际程序设计竞赛在东北被我们发扬光大。ACM 竞赛浙大的一段传奇佳话。振南在关注的 IOCCC 国际混乱 C 代码大赛。网吧包宿学 C 语言惊呆室友。)
1.4 岔路口上选择单片机
(搞纯软件还是搞单片机,这是一个抉择。鬼才杜撰拉我进入单片机快车道。)
1.5 窗户纸破了
(入门阶段的困惑,看破 C 语言与单片机之间的鸿沟。)
2 、看穿单片机
2.1 CPU 模型
(CISC 与 RISC 指令集。CPU 如何执行指令。汇编不是第一代编程语言,打孔纸带才是。)
2.2 存储器模型
(存储器就是一个指令和数据的容器。)
2.3 总线模型
(地址、数据和控制三大总线。贯穿整个单片机芯片的通路。)
2.4 外设模型
3、单片机跑起来
3.1 时钟系统
(时钟是单片机激励和血液。时钟频率不能无限提高。)
3.2 二进制
(为什么单片机采用二进制?振南告诉你如果单片机使用十进制会怎样?)
3.3 中断机制
(中断不是在给 CPU 捣乱。中断对于单片机为什么如何重要?)
振南当年入门 C语言和 单片机的那些事儿
致广大单片机学习者和工程师:
你们所经历的,振南也一样不落的都经历过。起初对于C语言和单片机学习上的迷茫困感可能比你们更甚,但是一切都过来了,没什么能够真正难倒我们,相信自己!谨以此文,向大家讲述我十多年前入门阶段的往事和感悟,以及告诉大家:单片机到底是什么?
为什么很多初学者都被困在C语言与单片机本门基础的山脚下止步不前,彷徨徘徊?为什么大家在学习上花费了如此大的精力,却收效甚微?为什么C语言中的指针就那么难于理解,始终让人们摸不着头脑? 又为什么看似些无问题的代码,烧录到单片机中运行就是不对?这一切的一切都归结于一个根源:对C语言的本质和单片机的体系结构与运作机制认识不清!
通过本章,我希望能让你看穿一切,升华你的整体认知。
此时,你会发现作单片机和嵌入式开发是如此简单,单片机也变得“乖巧”了很多,仿佛一切都变得顺畅了,和谐了!
注定堕入单片机
2005 年开始接触单片机和嵌入式技术,从此随入其中,直至今日。这十几年里经历了很多项目,遇到了无数技术点。从一个涉世不深的初学者,成长为了现在还算称得上是“资深”的工程师。这期间我还扮演着另一个角色一技术和知识的传授者和解惑者。我热衷于这种工程师之间的交流,它时常会带给我反思、领悟和动力,让我一直保持追求新技术新高度的热情和信念。
在交流中,我无数次地被问到一个问题:“如何才能学好嵌入式 C语言和单片机?”我也确实深深感觉到:C 语言的掌握程度亚重制约着单片机和嵌入式工程师的研发水平。其实,我在硬件方面的研发水平很大程度上得益于我 C 语言的扎实基础和对其深入细致的理解。下面,我结合我较早期的学习经历和感悟来讲一下嵌入式 C 语言应该如何学好(年代可能会有些久远)。也许,我的经历不易复制,但它作为一种学习方式,大家多少可以借鉴。
引用我启蒙老师的一句话:“C语言,学得多精都不为过!要学单片机,先学C 语言。”
1.1懵懂好奇的我
性格决定你所能从事的事业,也决定了你的命运。
我的性格是对新鲜事物有极大的好奇,而且这种好奇会发展为兴趣,并最终狂热。当我脑子里出现一个新想法,我就会迫不及待地去实现它,而且不看到它最后的样子,不会轻易放弃,不论成败都要试试。在我记忆里,我小时候就是这样的。
有一次我看到一根铁丝,正好我衣兜里有一个皮筋,于是我就作了一个弹弓。后来一发不可收拾,我迷上了作弹弓,各种各样,大大小小。还不乏创新和发挥,我想到在电影里见过的誓(其实我当时还不知道它叫警),于是接下来的很长时间我一直在研究如何用铁丝制造一把弩最终,弩出现了。原来玩弹弓时的纸子弹被我换成了石子,随着扳机的扣动,我的屁股也开花了。
上初中的时候,我通过学校开设的兴趣班第一次接触到计算机,第一次知道了 DOS、Win-dows98、WPS、输入法这些东西,迅速燃起了对计算机的好奇和兴趣。当时我渴望拥有自己的计算机。于是开始天天缠着我爸妈给我买一台计算机。碍于当时的经济条件,最后家里给我买了一台学习机。用它可以模拟 DOS 环境、练习指法,还有一些简单的编程,如 LOGO,BAS-IC 等。从此,我开始有了最基本的编程意识:程序就是一行行顺序执行的语句。但是对循环条件判断等比较复杂的东西还不够熟练,只能说有一个概念。
对计算机的兴趣没有像以往一样,热乎一段时间就放下了。我发现计算机要学的东西非常多,而且它好像一直都在变化出新,这些新的东西又会再一次掀起我的兴趣。对计算机的狂热从上了高中就开始了。长期基子学习机的练习,我的指法已经足够熟练,但是用拼音输人入文字速度太慢,所以我报班学了五笔,一直沿用至今(现在每当有人知道我用五笔的时候都会对我投来钦佩的目光)。在一顿软磨硬泡之下,我拥有了第一台自己的奔IV电脑,从此我的“折腾”开始了。
1.2 我的C语言学习经历
基于我对计算机的浓厚兴趣,高考报志愿的时候,我四个志愿全部报了计算机专业,从那时起,注定了我将以计算机为伴、为业。
原以为进了大学就能马上接受正统的计算机教育了,其实并不是。计算机专业一开始并不直接学编程,而是学数学。我当时比较迷茫,觉得学计算机不教编程,上学有什么用?其实我知道专业课程安排的用意,计算机科学的基础是数学,应该先打基础。但是又有多少学生真正去好好学习这些基础而枯燥的东西。导致很多人整个大一的宝贵时间都浪费在打游戏上,估计他们已经忘了自己为什么要学计算机了。我也怕会变成这样。我开始自学很多计算机方面的知识,但是又漫无目的,直到我碰到一个“能人”。据说他小学开始学计算机,初中已经可以独立开发软件,高中时因为开发了一个网络软件,被某软件平台收录,并评为五星软件,而被免试特招。他智商高,但似乎情商不是太高,经常容易得罪人.有一些让别人不太舒服的做事风格。有一次我们偶然聊天,他提到国际 ACM 程序设计竞赛的事情,问我有没有兴趣参加,说已经集结了五六个人,组成小组参加比赛。从此我开始有了动力,开始自学 C 语言和算法,参加团队集训,下载往年竞赛题目模拟竞技,相互交流经验。当时专业课还没有开 C语言,但是我们已经都是 C 语言高手了。也许,应该在这里放一道ACM竞赛的试题给大家解解闷(这是一道陈年老题,感兴趣的话可以百度)。对!ACM试题是全英文的(见图 1.1)。
大二下学期,C 语言专业课开了。很多人并不知道 C语言有什么用,带着迷茫上课、考试通过,最后忘掉。我开始慢慢深刻感觉到 C语言的精妙,它有自己严格的语法规则,但是又不作过多限定,这让它非常灵活而实用。同一个逻辑功能,可以有很多种 C 语言的表达方式,它-定程度上体现出了编程者自身的习惯和素养。代码可以写得很乱,也可以写得很优雅;可以写得冗长罗嗦,也可以写得如蜻蜒点水,几行了事。但是乱也可以错落有致,寥寥几行也可以大显功底。我意识到 C 语言没那么简单,不仅仅是一门语言而已,它会伴随我一生,正如后来有人所说的“程序如人生”。
我的性格仍然在发挥着巨大的作用。随着不断的学 C 语言,用 C 语言,我开始觉得 C 语言真的是乐趣多多,如同挖矿,永远都有那些未曾遍及的角落,永远都有没有见过的另类技巧.永远都有富含创意的智慧的流露。(关于 C语言的技巧,振南专门整理成了一章“C 语言的那些技巧与深层理解”,感兴趣的读者可以看一下。)