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

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

注解目录

第一章《振南当年入门 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 捣乱。中断对于单片机为什么如何重要?)

单片机跑起来

好,有了CPU、存储器、总线以及外设,我们把它们有机地组合封装在一起,再把各个外设、总线的信号,以及供电和地通过引脚引出来,这就是一片完整的单片机芯片。等等,,要让单片机跑起来似乎还少了些什么?对,还有时钟!

3.1 时钟系统

如果上面所说的这些都只是单片机芯片的躯亮的话,那么时钟就是在其中流动的血液和跳动的脉搏。时钟对于单片机来说是至关重要的,它是整个系统的激励。它是否稳定、是否精确、是否高速都直接影响了单片机中所有电路的运作,包括CPU、总线、外设等等。从本质上来说时钟就是一个方波信号,如图 1.17 所示。

图1.17 时钟在单片机中占有至关重要的地位

有人说:“既然时钟的快慢决定了单片机的速度,那只要尽量提高时钟频率就可以让单片机的性能得到飞跃了!?”原理上来说确实是这样的,但是因为很多因素,比如半导体材料的特性、芯片制造工艺等,导致时钟频率并不能无限制地提高(过高频率的时钟信号会导致单片机电路工作异常,问题大多出现在信号的完全性上)。关于这一问题的解释请见图1.18。更形象的说,这就如同人的心跳不能太快,否则血液还没来得及将氧气和养份送到各个组织,就已经急逝而过了。同时,血管也无法承载如此高的血压和血液速度,最终导致人体整体机能的紊乱。相反,心跳又不能过缓,否则血液同样也无法完成输送给养的工作(单片机的时钟过慢可能无法满足我们的应用需求,所以实际应用过程中,选取一个合适的工作时钟是非常

图1.18 时钟频率过高将导致信号完整性受损

重要的)。

不过又说回来了,我们很多时候确实希望单片机运行得越快越好,比如一些计算量很大的实时算法、信号采集、音视频的录制与播放等等。所以无数的工程师、科学家都在致力于提高硬件性能、提高时钟频率、提高加工工艺水平,甚至是尝试新的半导体材料或是改进电路结构但是尽管如此,时钟频率仍然会有一个无法逾越的顶线。而且人们发现时钟越快,电路工作时的功耗越大。这些窘境以及对高性能低功耗的不断追求,催生了CPU芯片向着多核的方向开始发展(时钟频率不再提升,而是通过增加芯片中CPU内核的数量来提高整体的性能)。振南上面说,时钟越快,功耗越大。这不难理解,电路不工作时功耗一定最小;一旦有了时钟,它开始工作了,那功耗必然变大。这一原理是现在很多单片机芯片中实现低功耗的根本基础。单片机的设计者为每一个外设电路都配置了一个时钟开关(这些开关也是一些挂接在CPU总线上的特殊功能寄存器,因此可由 CPU 直接控制),从而可以控制外设停机还是工作。这在很大程度上降低了单片机的整体功耗。这就是现在一些高级单片机中的一个新概念—时钟解(CC)。它实际上可能会更加强大,不光可以关闭某个外设的时钟供应,而且还可以调节时钟的频率,让外设可以工作在最为适宜的功耗水平下。

相关文章
|
7月前
|
算法 Java C#
振南技术干货集:振南当年入门C语言和单片机的那些事儿(2)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(2)
|
7月前
|
Shell Linux Android开发
振南技术干货集:深入浅出的Bootloader(5)
振南技术干货集:深入浅出的Bootloader(5)
|
7月前
|
存储 Shell Linux
振南技术干货集:深入浅出的Bootloader(1)
振南技术干货集:深入浅出的Bootloader(1)
|
7月前
|
存储 自然语言处理 编译器
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
|
7月前
|
存储 物联网 Shell
振南技术干货集:深入浅出的Bootloader(4)
振南技术干货集:深入浅出的Bootloader(4)
|
7月前
|
存储 Shell Linux
振南技术干货集:深入浅出的Bootloader(2)
振南技术干货集:深入浅出的Bootloader(2)
|
7月前
|
BI Shell Linux
振南技术干货集:深入浅出的Bootloader(3)
振南技术干货集:深入浅出的Bootloader(3)
|
6月前
|
C语言
【海贼王编程冒险 - C语言海上篇】库函数怎样模拟实现?
【海贼王编程冒险 - C语言海上篇】库函数怎样模拟实现?
39 1
|
6月前
|
Web App开发 传感器 Linux
【嵌入式软件工程师面经】STM32单片机
【嵌入式软件工程师面经】STM32单片机
163 1
|
7月前
|
存储 算法 C语言
振南技术干货集:振南当年入门C语言和单片机的那些事儿(4)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(4)