振南技术干货集:振南当年入门C语言和单片机的那些事儿(1)

目录

第一章《振南当年入门 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 语言的那些技巧与深层理解”,感兴趣的读者可以看一下。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/128845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

制造行业怎么做?看低代码如何引领未来

随着科技的不断发展,制造行业正面临着巨大的变革和挑战。为了提高生产效率、降低成本并更好地适应快速变化的市场需求,越来越多的制造企业将目光投向了低代码开发平台。在众多低代码开发平台中,JNPF低代码快速开发平台凭借其卓越的性能和灵活…

【论文阅读笔记】Detecting AI Trojans Using Meta Neural Analysis

个人阅读笔记,如有错误欢迎指出! 会议:2021 S&P Detecting AI Trojans Using Meta Neural Analysis | IEEE Conference Publication | IEEE Xplore 问题: 当前防御方法存在一些难以实现的假设,或者要求直…

【vue 仿百度分页】

vue 仿百度分页 效果图 代码 公用组件 <template><nav class"pagination_nav"><ul class"pagination"><li :class"{ disabled: current 1 }"><a href"javascript:;" click"setCurrent(current - …

JAVA对象大小的获取

1. Java 对象的内存布局 Java的实例对象、数组对象在内存中的组成包括如下三部分&#xff1a;对象头Hearder、实例数据、内存填充。示意图如下所示 对象头 其主要包括两部分数据&#xff1a;Mark Word、Class对象指针。特别地对于数组对象而言&#xff0c;其还包括了数组长度…

2022年09月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下列不是评判一个算法优劣的标准是?( ) A: 时间复杂度 B: 空间复杂度 C: 难易度 D: 健壮性 答案:C 评价算法的优劣是:时间复杂度,空间复杂度,健壮性,正确性,可读性。因此选…

一周成功拿下4个offer的软件测试面试题,面试必看系列

前言&#xff1a; 压到就是赚到&#xff0c;面试通过的机率就更大&#xff0c;干就完了铁子 【文章末尾给大家留下了大量的福利】 ​编辑 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平…

el-table 多表格弹窗嵌套数据显示异常错乱问题

1、业务背景 使用vueelement开发报表功能时&#xff0c;需要列表上某列的超链接按钮弹窗展示&#xff0c;在弹窗的el-table列表某列中再次使用超链接按钮点开弹窗&#xff0c;以此类推多表格弹窗嵌套&#xff0c;本文以弹窗两次为例 最终效果如下示例页面 2、具体实现和问题…

【狂神说Java】Swagger + 任务

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

重庆市5米数字高程(DEM)数据

重庆位于中国西南部、长江上游地区&#xff0c;地跨东经10511~11011、北纬2810~3213之间的青藏高原与长江中下游平原的过渡地带。东邻湖北、湖南&#xff0c;南靠贵州&#xff0c;西接四川&#xff0c;北连陕西&#xff1b;辖区东西长470千米&#xff0c;南北宽450千米&#xf…

uni-app——項目day01

配置uni-app開發環境 uni-app快速上手 | uni-app官网 创建项目 图中四个划线就是要配置的地方. 选择vue2还是vue3看个人选择。 目录结构 但是现在新版本创建的项目已经没有components目录了&#xff0c;需要自己创建。 项目运行到微信开发者工具 使用git管理项目 node-mod…

【神印王座】林鑫和李馨甜蜜接吻,团灭七阶恶魔,温馨结尾

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料&#xff0c;《神印王座》80话最新剧情解析。有关李馨与林鑫的爱情故事源于一场争执。那时&#xff0c;两人都年轻气盛&#xff0c;不肯向对方低头。但是&#xff0c;经过一段时间的相处&#xff0c;…

ARM day4

LED灯亮灭控制 .text .global _start _start: 1ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x3<<4)str r1,[r0] 2ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1,#(0x1<<20)bic r1,r1,#(0x3<<16)orr r1,r1,#(0x1<<16)str r1,[r0]…

java语法:继承与多态

导言: 在Java中&#xff0c;继承和多态是面向对象编程的两个重要概念&#xff0c;它们允许我们创建更加灵活和可扩展的代码。本文主要对继承和多态的语法和一些细节做一个介绍和解释。 目录 导言: 正文&#xff1a; 一.继承 1. 基本语法 2. 继承的特点 3.子类中访问父类…

补坑:Java的字符串String类(1)

常用方法 字符串构造 来看看源码里面String的构造方法 普通字符串 //"hello" 是字符串常量&#xff0c;没有\0标记结尾String str "hello";System.out.println(str);//helloString str2 new String();System.out.println(str2);//没有输出String str3…

“三位一体”超级混沌工程主要特点及功能

“三位一体”超级混沌工程X-Chaos主要包括基础故障编排、业务场景故障编排、演练场景编排、故障库管理、演练场景管理、演练计划管理、演练观测和演练报告等模块&#xff0c;支持对传统架构、云环境以及国产化基础环境的IT系统进行故障演练。本文将介绍混沌工程主要特点及主要功…

归并分治 笔记

归并分治 前置知识&#xff1a;讲解021-归并排序 原理&#xff1a; (1&#xff09;思考一个问题在大范围上的答案&#xff0c;是否等于&#xff0c;左部分的答案 右部分的答案 跨越左右产生的答案(2&#xff09;计算“跨越左右产生的答案”时&#xff0c;如果加上左、右各自…

GeoGebra:数学动画制作工具重磅来袭

【线性代数】线性代数可视化工具&#xff1a;manim manim是之前我跟大家分享的一个线性代数动画制作工具。 但我之前的描述有些许偏差&#xff0c;这里要更正一下&#xff0c;manim不仅限于制作线性代数动画&#xff0c;也可以制作数学其他学科的动画&#xff0c;例如微积分&…

Selenium是什么,带你了解自动化测试的神奇之处

一、使用测试工具 工欲善其事&#xff0c;必先利其器。在开始具体的自动化测试之前&#xff0c;我们需要做好更多的准备&#xff0c;包括以下几个方面&#xff1a; 认识自动化测试 准备自动化测试工具 使用有效的方式 针对具体的测试对象 接下来的第一部分内容&#xff0c;我…

JavaScript如何实现钟表效果,时分秒针指向当前时间,并显示当前年月日,及2024春节倒计时,源码奉上

本篇有运用jQuery&#xff0c;记得引入jQuery库&#xff0c;否则不会执行的喔~ <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <meta name"chenc" content"Runoob"> <met…

人工智能中的基础之一——Python

Python作为一种简洁、易学、功能丰富的高级编程语言&#xff0c;被广泛应用于数据分析、人工智能、Web开发等各个领域。本文将介绍Python的基础语法和使用&#xff0c;帮助读者快速上手Python编程。 一、Python基础语法 1. 变量和数据类型 在Python中&#xff0c;可以使用变…