郭天祥:C语言的本质和单片机体系结构与运作

来源:爱酷猪责编:网络时间:2024-04-26 09:02:16

是的,就是他,于震南老师。 十年后,他与郭天祥老师再次联手,打造新课程。

如今,基础C语言课程在网络上满天飞。 现在我们已经快到半山腰了。 我们休息够了吗? 余老师在嵌入式C的顶端等我们! 接下来我们将连载课程,介绍那些大佬们背后不为人知的故事!

于老师与郭老师合影

致所有微控制器学习者和工程师:

你经历过的,震南也经历过。 一开始我可能比你更迷茫学习C语言和单片机,但是一切都已经过去了。 没有什么能真正难倒我们。 相信你自己!

我想通过这篇文章向大家讲述一下我的过去以及对我十多年前入门级经历的感悟,并告诉大家:单片机到底是什么?

为什么这么多初学者都停留在C语言和单片机基础知识的最底层? 为什么我们花了那么多精力学习却收效甚微? 为什么C语言中的指针那么难理解,总是让人摸不着头脑? 而为什么代码烧入单片机运行时看起来没有问题呢? 这一切都归结为一个根本原因:对C语言的本质以及单片机的架构和运行机制理解不清楚!

通过这一章,希望能让你看清一切,升华你的整体认识。

这时候你会发现做单片机和嵌入式开发是那么容易,而且单片机也变得“乖巧”了很多,仿佛一切都变得更加顺利、和谐!

注定要陷入单片机

我从2005年开始接触单片机和嵌入式技术,从此就陷入其中,直到今天。 这十年来,经历了很多项目,遇到了无数的技术点。 从一个涉猎不深的初学者,如今已经成长为一名“高级”工程师。 在此期间,我还扮演了另一个角色——技术和知识的老师和解谜者。 我对工程师之间的这种沟通充满热情。 它常常给我带来反思、理解和动力,让我保持追求新技术、新高度的热情和信念。

在交流过程中,无数次被问到一个问题:“怎样才能学好嵌入式C语言和单片机?” 我也深深感受到C语言的掌握程度严重制约着单片机和嵌入式工程师的研发水平。 。 其实我的硬件研发水平很大程度上得益于我扎实的C语言基础以及对它深入细致的理解。

接下来我就根据我之前的学习经历和感悟(可能有点老了)来谈谈如何学好嵌入式C语言。 也许我的经验不容易复制,但作为一种学习方式,每个人都可以借鉴。

引用我的启蒙老师的话:“C语言永远学不好!如果你想学单片机,你必须先学C语言。”

1.1 我无知又好奇

性格决定了你可以从事的职业,也决定了你的命运。

我的性格是对新鲜事物极度好奇,这种好奇心会发展成兴趣,最终变成狂热。 当一个新的想法出现在我的脑海中时,我会迫不及待地去实现它,并且在看到它最终的样子之前我不会轻易放弃。 无论成功还是失败我都会尝试。 在我的记忆里,我小时候就是这样的。

有一次我看到口袋里有一根铁丝和一根橡皮筋,于是我就做了一个弹弓。 然后事情就一发不可收拾了,我开始沉迷于制作各种大大小小的弹弓。 还是不乏创新和玩法。 我想到了电影里看到的弩(其实当时我还不知道它叫弩),于是我在接下来的很长一段时间里研究如何用铁丝制作弩。 终于,弩出现了。 原来,我玩弹弓的时候,把纸子弹换成了石头。 当扣动扳机时,我的屁股开花了。

初中的时候,我第一次接触电脑是通过学校开设的兴趣班。 我第一次了解了DOS、WPS、输入法,我对计算机的好奇心和兴趣很快被激发起来。 那时我渴望拥有自己的电脑。 于是我开始每天缠着父母给我买一台电脑。 由于当时的经济条件,家里最后给我买了一台学习机。 可以用它来模拟DOS环境,练习指法,做一些简单的编程,比如LOGO、BASIC等。从那时起,我开始有了编程最基本的认识:程序就是一条被执行的语句。按顺序逐行。 但对于循环、条件判断等比较复杂的东西我还不够精通,所以只能说有一个概念。

我对计算机的兴趣不再像以前那样了。 我有一段时间对它感兴趣,然后就放弃了。 我发现计算机要学的东西有很多,而且似乎一直在变化,这些新的东西又会引起我的兴趣。 我对计算机的热情始于高中时。 经过长期使用学习机的练习,我的指法已经很熟练了,但是拼音输入文字太慢了,所以我报了个学习五笔的班,到现在还在用(现在只要有人知道我用五笔,他们会批评我,用钦佩的目光看着你)。 经过一番努力,我得到了我的第一台Ben IV电脑,我的“折腾”从此开始了。

一有时间就研究一些VB、软件加解密、网络攻防之类的东西。 我还订阅了《电脑爱好者》杂志每一期。 高考之前,我应该可以称得上是半个“业余计算机高手”了,已经可以用VB开发一些桌面小软件了,比如计算器、小游戏之类的。 计算机极大地满足了我的好奇心并释放了我的创造力。

1.2 我的C语言学习经历

基于我对计算机的浓厚兴趣,我申请高考时,我选择的四个专业都是计算机专业。 从此,就注定了我将把电脑作为我的伴侣和事业。

我以为进入大学后就可以立即接受正规的计算机教育,但事实并非如此。 计算机专业一开始并不是直接学习编程,而是学习数学。 我当时挺困惑的,心想如果我不教计算机编程,那上学有什么用呢? 其实我知道安排专业课的目的。 计算机科学的基础是数学,首先要打好基础。 但有多少学生真正去研究这些基础又枯燥的东西呢? 结果很多人大一整个大一都在玩游戏,可能已经忘记了自己为什么要学计算机。 我也害怕会变成这样。

我开始自学很多计算机知识,但漫无目的,直到遇到了一个“能人”。 据说,他从小学就开始学习计算机,初中就能够独立开发软件。 高中时,他开发了一款网络软件,被某软件平台收录,被评为五星级软件,因此免试,特招。 他的智商很高,但是情商似乎并不是很高。 他经常很容易得罪人,并且有一种做事风格让别人不舒服。 有一次我们偶然聊天,他提到了国际ACM编程竞赛,并问我是否有兴趣参加。 他说,当时已经聚集了五六个人,组成一个小组来参加比赛。 从那时起,我开始有了动力,开始自学C语言和算法,参加团队训练,下载往年比赛的模拟比赛,互相交流经验。 当时专业课还没有开设C语言,但我们已经是C语言的大师了。 或许,我应该把一个ACM比赛的问题放在这里,解解大家的无聊(这是老问题了,有兴趣的话可以百度一下)。

正确的! ACM 考试题目全部为英文。

图1.1 国际ACM编程竞赛往期题目

大二下学期,C语言专业课开始了。 很多人不知道C语言的使用。 他们去上课,参加考试,通过,最后迷茫地忘记了这一切。 我渐渐开始深深感受到C语言的精妙之处。 它有自己严格的语法规则,但没有施加太多限制,这使得它非常灵活和实用。 同一个逻辑函数在C语言中可以有多种表达方式,这在一定程度上反映了程序员自身的习惯和素养。 代码可以写得很乱,也可以写得很优雅; 可以写得又长又啰嗦,也可以写得像蜻蜓点水一样,短短几行就搞定了。 但乱也可以有条不紊,几句台词也能秀出身手。 我意识到C语言没那么简单,它不仅仅是一门语言,它会伴随我一生,正如后来有人说的“程序如人生”。

我的角色仍然发挥着巨大的作用。 随着我不断学习和使用C语言,我开始觉得C语言真的很好玩。 就像采矿一样,总会有从未探索过的角落,总会有从未见过的替代技术,总会有财富。 创造性智慧的体现。 (关于C语言的技巧,振南专门整理了一章《C语言的那些技巧与深入理解》,有兴趣的读者可以看一下)

1.3 C语言顶级赛事

在C语言专业课上,老师告诫我们:“C语言,你学得再好!”

这句话当时很多人可能不太理解,但我深表赞同。 后来我们ACM竞赛组对编程的热情感染了整个计算机学院,这位C语言老师也成为了我们的培训老师。 后来我们的行动带动了更多的人参加ACM编程大赛,包括高校、学校,甚至哈尔滨市、黑龙江省、东北三省。 最终,国际ACM委员会指定我校为国际ACM东北赛区承办单位(华南赛区承办单位为浙江大学)。 当时,整个学校都挂满了横幅:“你的世界!”

关于ACM编程大赛,关于浙江大学还有一段传奇故事(当年ACM世界冠军是浙江大学)。 我们知道,编写程序需要多次编程、编译、错误检查和修改、重新编译等等。 来回次数与程序的难度和程序员的能力有很大关系。 但每次想要成功,也不能说是不可能,而是极其困难! 浙江大学参加决赛的时候,只剩下十分钟,最后一道题了。 参赛团队成员,打开记事本,直接写代码,直接提交,一气呵成。 这件事,在圈子里流传,可能有些夸大其词。 然而,这足以说明我们与顶尖编程高手之间的巨大差距。

ACM竞赛是一群热爱计算机和编程的人一起做的事情。 他们技术扎实,以不断求新、不断学习、不断完成新目标为最大乐趣。

除了ACM之外,我私下还关注另一个国际编程竞赛IOCCC(国际混沌C代码竞赛,官网,图1.2)。 其实很多人不知道这个比赛,也是我偶然发现的。

图1.2 IOCCC官网历届比赛公告

为什么要关注这样一个看似不严肃的游戏呢? 它不是比算法,也不是比代码的质量和风格,而是比谁的代码最乱,但乱得有艺术性,必须能编译,而且必须能实现正确的函数,如图1.3代码所示。

图1.3 第24届IOCCC(2015)参赛代码

C语言代码可以这么随意写吗? 它体现了C语言形式上的灵活性。 当然,并不是只有用代码画画才可以称之为“乱”。 它具有更多、更深的编程技巧。 在这里,你可以看到C语言世界的奇观、各种编程风格以及映射代码背后的“大师”。

我对学习C语言的热情从始至终都是,现在还在学习。 记得上大学的时候,我们宿舍有一个习惯,就是大考结束后我们会去网吧过夜。 那时流行打CS,网上玩得热闹。 但我对游戏没什么兴趣,所以就坐在旁边的座位上上网看C语言代码。 那时候我特别热衷于访问编程网站,比如CSDN、PUDN等,也喜欢下载所有的代码包,看看别人的代码是怎么写的。 看完代码,想编译一下试试,于是在网吧的电脑上安装了VC6.0。 室友走过来看我在做什么,大吃一惊:“都考完了,你还在读C语言?”

1.4 在岔路口选择微控制器

接下来继续学习C++,后来又学习了VHDL和C++(其实当时我对硬件、数字信号处理和仿真一无所知,所以对后者没有太大的热情)。 在学习C++之前,我已经有了一些使用VC6.0的经验,尤其是MFC(当时有人建议我学习.NET,比如C#,或者JAVA。他们说MFC已经过时了,MFC的意思是Maybe,这会最终被微软使用。 在系统学习了C++之后,我对MFC(微软基础类库)有了深入的了解,开始阅读一些这方面的专业书籍,并能够编写一些功能复杂的多层次应用软件。

此时我的编程学习开始出现瓶颈,感到迷茫。 C语言非常优雅且功能强大。 它的母体C++,面向对象的编程模型,可以开发专业的桌面软件。 然后呢? 似乎其他人使用C#或JAVA来开发软件更快,做得更好。 优雅是不能吃的。 受此带动,我开始学习C#、JAVA、PHP、JSP、ASP等上层应用级语言,准备努力成为一名优秀的软件工程师。

在这个岔路口,我遇到了我的第一位老师,他再次打开了好奇心的大门,走上了单片机和嵌入式技术的道路。 他胡编乱造(化名):作为年龄最小、学历最低的人,代表黑龙江省参加全国“挑战杯”科技创新大赛,并凭借自己设计的“仿生蛇”获得二等奖。 获奖后,他将所有相关技术无偿赠送给国防科技大学。 曾作为特邀嘉宾接受《小崔说》栏目专访。

关于“虚构”以及我初入单片机圈子的经历,震南在书中“我和郭天祥之间的事”一章里有详细的描述。

他告诉了我很多关于微控制器的知识。 那时我对单片机一无所知。 我只知道他的“仿生蛇”用的是单片机,单片机可以用C语言编程开发。 微控制器可以做出如此强大的东西,这比在计算机上编写桌面软件有趣得多。 正是这一点深深吸引着我。

“你应该从51开始学习,先焊一个最小系统,然后点灯!”

他给了我一个最小的系统板和一些配件,还有一份叫《普通C51教程》的电子文档。

“你可以向我学习,有什么问题尽管问我。”

图1.4 我的第一个单片机实验原理图(摘自《普通C51教程》)

我按照图1.5焊接了我人生中的第一块电路板。 虽然看着很惨,但化妆后看了,评价是“还不错,可以用”。 然后,我被要求学习C51。 事实上,我不知道这个称为“最小系统”的电路为什么使用这些元件以及为什么要这样焊接。 带着诸多困惑我开始了单片机C语言的学习之旅,慢慢开始明白C语言课上老师说的“C语言是最接近硬件的高级语言”。

1.5 窗纸撕破

C语言,无论是变量、函数、分支循环,甚至是算法,甚至是最复杂的算法,都是CPU核的指令执行和内存访问操作(RAM和ROM)。 这就是我对C语言的初步认识。 那么如何用C语言来控制硬件产生物理效果呢? 当时令我困惑的是,C语言是软件,LED是物理硬件。 软件如何影响物理世界? 小到点一盏灯; 大如“仿生蛇”,产生一系列动作; 大到控制火箭发动机的点火。 这曾经是我入门阶段难以逾越的思维鸿沟。

sfr P1=0x80;

无效主(无效){P1=0x55;虽然(1);}

这是我写的第一个嵌入式C语言代码。 它第一次向我揭示了C语言与硬件的交互——特殊功能寄存器()。

在标准C语言中它是一个修饰符。 如果在定义变量时给它加上这个修饰符,编译器就不会在内存中分配它,而是直接把它放在CPU的内部寄存器中。 其目的是加快对变量的访问速度指法练习小游戏下载,尤其是那些需要频繁访问的变量。

整数我; 整数总和=0;

对于(i=1;i

猜你喜欢
最新游戏更多
热门专题更多
最新资讯更多