当前课程知识点:智能车制作:嵌入式系统 >  第三章 MCU基础 >  3.1 CPU的基本结构和运行机制 >  Video

返回《智能车制作:嵌入式系统》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《智能车制作:嵌入式系统》慕课在线视频列表

Video课程教案、知识点、字幕

各位同学大家好

我是清华大学工程物理系的曾鸣老师

欢迎大家继续回到我们

ARM微控制器与嵌入式系统的MOOC课堂

这一周的课程呢

我们终于进入了第三章也就是基础的学习

在第一章 第二章

我们了解了这个课程的概况

从0和1这样的计算机基础知识

给入门的同学补了一补

让你觉得计算机世界不再神秘

大家好像认识了概念的CPU

认识了计算机和嵌入式

发展的历史渊源

听了听八卦计算机史

那么第三章

我们真的真刀真枪来进入嵌入式的学习

来深入的理解一些它背后的秘密

那么这一章呢

我们要认真的学习

一个ARM的微控制器为代表的

这样微控制器的内部结构

和它的很多基础知识

真正的去理解它的运行

那么比方说我们现在看这样一张图

这就是一个通用意义上

基本的MCU的内部结构

经过前两章学习

我们应该说对这样一张图还毫无概念

但是经过这一章的学习

我们日后回过头来

看这张图的时候

我们对于它里头所蕴含的CPU

它的外设

它的存储器

它的总线

将会建立起一个完整的概念

更重要的是

我们会建立一个

非常清晰的编程模型的概念

去理解这样一个

看似神秘的计算机系统

或者叫微控制器系统

它里头的程序

是以怎样一种机制在运行的

我们所谓的编程究竟做了什么

这是这一章

我们所要学习和掌握的东西

那么在这个单元的课里

我们首先从一个MCU的内部结构学起

就像刚才所说一个MCU里头会有CPU

会有存储器

会有外设

还会有把它们连起来的总线

我们先从一个真正的CPU入手

在抛开ARM 一般意义

通用意义上来理解

一个CPU的整体的构架

以及他运行的机制 模型

最后呢

我们再来看很多典型的CPU

特别是我们现在要学习的

ARM CPU它究竟是怎么运行的

希望通过这几个单元的学习

大家能够像

一个人脑脑补的计算机一样

能够看懂一段汇编程序

能够一步一步的

看着以前觉得很神秘的指令

究竟怎么有序的运行起来

那么我们的学习目的就达到了

那么一个CPU

如果我们要学习

会涉及很多重要的基础知识

在这几个单元里头

我们会一个一个来讲

包括CPU内部结构的这些寄存器组

包括CPU的指令的加载运行

以及它对于存储器使用的堆和栈的概念

还有一个难点 中断的概念

时钟 复位的概念等等

这些知识的衔接加上存储器

加上外设

我们会树立起一个对于麻雀虽小

五腑俱全的片上计算机系统

微控制器的核心的概念

那么先进入CPU

CPU同样我们可以看这样一张图

我们如果看世界上

不管是深入的CPU设计的课

还是计算机的概论的课

都会讲一讲CPU的基本结构

那么它会抽象成不同的图

这只是其中一种抽象方式

那么抽象完了这个图

并不一定就只是ARM

而是各种各家各类的CPU的

一个高度的凝练和抽象

我们对它进行学习

来理解一个通用意义上CPU

或者一个最最简单的CPU模型

它必须具备什么

然后我们来逐渐把它给看懂

大家现在觉得看不懂没关系

我们先拆开这个右边最小的这个部分

一个完整的CPU

右边最小这个部分是什么呢

就是我们之前学过的

概念CPU的一个抽象

它叫做Arithmetic Logic Unit

我们也称为ALU

运算逻辑单元

我们之前讲了一个4比特的概念CPU

它非常非常的low

非常非常简单

因为为什么呢

它只能做运算和逻辑运算

那么它其实没有管很多

什么指令加载这些东西

那么这个东西

那个概念CPU基本上

就等效于这样一个逻辑运算单元的思想

它是一个CPU的核心

但CPU光有它是不够的

还有什么呢

还有我们今天会讲的寄存器组

还会有控制这个CPU有序运行的

一个控制单元的这个逻辑的存在

那么任何的CPU

要想稳定的运行起来

成为一个成功的CPU

这三个部分肯定都有

不管是ARM还是不是ARM

那么随着CPU的高级

比如ARM我们之前讲过的A系列

用于手机的 包括我们用的X86

它还有额外的很多单元

比如说浮点运算单元

进行浮点运算的这些部分

比如说cache的管理单元

管理这个片内的cache

还有memory management unit

这个内存管理单元

适合于操作系统之间的

任务切换和虚地址的映射等等

那么红色是必备的

灰色是可能拥有的部分

这样才构成一个真正意义上完整的CPU

然后让我们来一点一点的对它进行学习

大家注意

我们从完整的片上计算机系统

到CPU再到逻辑运算单元

再到内部的结构

来这样一层一层的学

最后再倒过来 归总

逻辑运算单元完成逻辑的

和数学的一些运算功能

它抽象起来非常的简单

就是我们把数据给它

它通过一个指定的运算

产生一个结果给我们

如果我们把一个逻辑运算单元

抛开上一节课讲的那些电路的实现

因为我们有信心

它是可以用逻辑门电路实现的

那么它应该来说

从逻辑上有这么几个要素

说起来好像很麻烦

但实际上非常非常简单

为什么呢

因为大家很好理解

一个运算我们一定会给它

一个或者两个数

这构成了一个运算数

我们称为input data

那么从这个概念上来讲

它是operands是我们的操作数

也就是我们运算的对象

然后呢

我们会给个instruction一个指令

给这个逻辑运算单元

告诉它应该做哪一种运算 对吧

那么这个指令所蕴含的意思是

我们的operation我们要做的运算

然后第三个要素呢

大家非常容易想到的

是我们会有个结果对不对

做加法得到和

做乘法得到积

那么这个一个output data

这个数据是我们最终的result

它代表了我们的运算结果

那么很多同学会忽略的

第四个要素是什么呢

就是我们称为status

status这个概念

它会导致我们以一些方式

把运算当中的一些信息给记录下来

我们称为flag

称为标志位

那么为什么有status

status是什么

我们来看几个例子

比如说这三个运算式

都很简单对吧

A加B等于C

如果我们把它给一个CPU来算

给个逻辑运算单元来算

A和B是我们给它的两个input data

也就是我们的operands操作数

那么我们肯定会有个指令

不管是谁家的CPU

是什么样的指令

它一定会有个加法指令

来告诉CPU逻辑运算单元

你应该完成的是加法运算

这就是我们的instruction 指令

也就是对应的operation

也就是我们的运算

那么这两个一求和

我们得到一个结果

C是我们的result

那么有同学说status

刚才说的这个标志位

这个状态是什么呢

那我们要想我们这是一个计算机系统

不是一个人

所以如果我们的CPU是

上节课所学过的4个比特的概念CPU

那么A和B最多就是4比特的二进制数

也就是从0000到1111

也就是十进制的0到15

那么两个四比特二进制数求和

得到一个结果C会有一种什么可能

这个C有可能大于15

也就是说

比如说我们用10和9相加

那么得到的这个二进制数

无法用四个比特来表征

所以存在C里的结果

不是一个完整的正确结果

所以这个时候需要CPU

以某种方式

将这些信息记录下来

提供给后续的程序知晓

那么我们会需要一个

overflow溢出的标志位

来记载这样一种信息

这就是status

那么有了这个例子

我们看了看第二个运算式

A大于B

判断A大不大于B

有很多同学会说

老师我知道了

运算数是A和B

那个运算就要大于运算

但是我们仔细想一想

有大于这么一个运算吗

实际上不是的

这是一个非常有意思的例子

就是我们在做A大于B的时候

绝大多数CPU可能会做的一件事情是

运算实际上是减法运算

而做这个减法要的不是result

要的不是那个结果

要的恰恰是我们刚才

所提到的那个status

如果我们A减B最后得到了

一个最高为一的补码的一个负数

那就说明我们的A是不大于B

A是小于B的对不对

所以我们可以通过运算得到的status

来判断我们这个大小关系

那么最后一个式子

我们考验的大家某种意义上是C语言

A尖括号尖括号等于1这什么意思呀

两个尖括号是右移运算符

等号运算符把运算写在等号的左边

A等于A自己右移一位 对吧

那么在这样一个运算里头

在绝大多数的CPU上

可能会出现的情况

是唯一的操作数是A

右移并且右移一位这两件事情

合起来是一个运算符是一条指令

而它的结果是

我们右移以后的这个数的结果

那么我们有可能比如说

一 右移一位

四 右移一位得到二

二右移位得到一

一右移一位结果得到了零

那么其实得到零

也是一种status

也是一种标志位

所以很多运算都会产生标志位

这就是我们一个

逻辑运算单元的基本概念和四要素

那么有了这样一个概念以后

我们会说

我们得到的这些运算单元

这些结果往哪存呢

这是个好问题

所以在设计CPU的时候

除了逻辑运算单元

绝大多数CPU都会有一个地方

由电路实现的存储器

我们之前讲概念讲过电路

门电路我们可以实现存储器

来保存一系列的零或者一

那么就构成了一个概念

叫做register寄存器

那么我们在日后会

很多次见到register这个词的概念

寄存器 是由电路实现的

若干个保存零或者一的临时的

这种存储单元 存储器

那么在任何CPU的设计里

都会有这么一个特殊的存储器

来保留运算当中所产生的这些状态位

它的状态位

是伴随着每一条指令的执行

而自动更新的

每一条指令能够影响的状态位都不一样

而当下一条指令运行完后

这些状态位

会根据下一条指令运行的结果

自动的各自更新自己

始终保持我当前的状态

是上一条运行完指令产生的结果

那么这样一种寄存器会有个名字

那么在有的CPU里头

我们叫做Program Status Register

也就是PSR寄存器

我们称为程序状态寄存器

这个非常好理解

程序就是指令的集合

产生的状态存在一个寄存器里

而在有一些别家的CPU上

它可能有另外一个名字叫

Condition Code Register

也就是条件码寄存器

大家注意

在CPU设计的基本概念上

都有这么一个机制的存在

而它究竟叫什么名字

反而不是本质的问题

日后大家看到这两个名字当中任何一个

你就知道它是什么

那么这样一种寄存器

它要存哪些状态呢

也是因为CPU而各家各异的

但是一般意义上来讲

至少这四种是肯定存在的

我们上一个运算

得到了0的结果我们称为

Z zero

我们上一个运算得到了一个负数

negative N

然后比如说我们上一个运算溢出了

比如说8比特运算

200加100得到300

大于255了

那么会有一个O

Overflow

最后呢 我们可能会有一个

这个进位这样的信号产生 carry

那么等等这些运算的标志位

随着每一条指令在动态的更新

大家记住这个概念

而被后续的程序可以加以使用

从而知道程序前面一步运算

是否得到了可信的正确的结果

或者前面的判断它的最终的结论是什么

那么有了一个逻辑运算单元

对于数的四要素的概念

和对于这个标志位的概念理清以后

我们接下来要问一个问题是什么

说老师您讲了一个CPU

这个CPU可以做运算

那我一直很好奇这个数从哪来呢

对 这个数有很多个地方可以来

第一个最简单的来历

就是我们在设计CPU的时候

会在CPU的里头

用跟刚才设计寄存器一样的方式

用电路的方式实现若干个临时的存储器

这些临时的存储器可以每一个存储

我们的逻辑运算单元

所对应的比特数的这样一个临时数据

而在一个CPU设计里头

这样的存储器

这样的临时的寄存器可以有若干个

比如说我们是一个8比特CPU

我最简单的方式

就是用电路在CPU内部实现一个单元

可以存8个比特

一个字节

那么这样的

构成了一个寄存器

每次可以提供一个字节的数

给我们的逻辑运算单元

但我可以在CPU设计的时候

多设计几个寄存器

来提供多个数供我们的CPU加以使用

所以我们会说

寄存器里可以临时保存

我们所需要进行运算的数

那么任何一个CPU在设计的时候

它片内都会有一个或者多个

这样的通用的或者专用的寄存器

来存储临时数据

应该说大家日后学习的时候

会知道这种寄存器它的位宽是多少

它有多少个 是CPU的一个非常重要的指标概念

它的多少代表了CPU性能的强弱

或者在一定程度上

代表了CPU性能的强弱

这件事大家有同学不好理解

那我打一个更形象的比方

你做作业的时候

如果给了你一张特别大的草稿纸随便使用

可能你的效率会有所提升 对吧

这就很好理解

那么第二个问题是

我们的操作数

除了从这里头有限个寄存器来 还能从哪来

这是个很好的问题

因为程序要做的事情是非常复杂的

我们很多时候不会只是做简单的运算

那因为我们毕竟用的是计算机

而不是一个计算器

那么如果我们以这样一张图

这样一个虚线拐角代表我们的CPU内部

CPU内部的寄存器

注意CPU内部的寄存器

它存储的数据

是肯定不够我们一个完整程序功能使用的

它是无源之水

那源在哪呢

就是我们的数据

也可以通过一个总线的访问

通过外部的存储器来获得

那么这个存储器

我们现在通用概念上包括我们的内存

包括我们的硬盘

我们都可以把它抽象为一个存储器

里头存储着大量的数据

在我们的运算过程当中

可以源源不断的从存储器拿到数据

给我们的逻辑运算单元加以使用

那么注意

存储器不再是我们刚才所讲的CPU内部的结构

而是放在一个微型的片上计算机系统里头

哪怕单片机

微控制器在一个芯片里

它是一个独立的外部的模块

不属于CPU

那么 如果讲到存储器的时候

我们有一个非常重要的概念

要给大家入门的同学回顾一下

就是地址与存储器的概念

我们CPU内部的寄存器

CPU有独特的链路 有电路可以逐一的访问

而如果有一个很大的存储器在CPU的外面

CPU用什么方式来访问它呢

我们后面会讲到总线的概念

但是从编程模型的角度

我们很重要的一件事情

就是理清存储与地址的概念

学习我们这门课程的同学

我们都会要求有很好的C语言基础

C语言当中一个理解的难点

就是地址与指针的概念

那么我们把这个概念稍微梳理一下

一旦你学习了C语言地址和指针概念

你应该建起一个初步的印象

就是对于存储器是一个像这样的一个抽象

我们把它可以抽象成一个

有很多很多的格子的

这样一个结构或者再抽象成

我们一个楼底下有一个报箱

报箱上写着各个房间的号码

里头放着属于这个房间的这个信件

那么我们会给这些格子

这些报箱编上地址

000 001 002 003

那么这些报箱的序号

就是我们的地址 address对吧

那么它里头每一个格子可以存储它的内容

是它所存储的数据

所以从属性上来讲

我们一个存储空间

我们会给它分配一段地址

这些每一个地址所对应的格子里

可以存储一个单元的数据

这是一个基本的概念

那么C语言的学习

说C语言为什么强大 它有一个指针的概念

有一个变量的概念

我们回忆一下这个概念说

我们现在如果声明了一个char*类型的

指向一个字节的指针

这个指针如果我强行赋了一个值

等于0x0003

那么意味着什么

指针的值是指针所指向的地址

那么我们这个指针指向了

刚才这个格子里头0003这个地址

那么反过来我们用*运算符

对这个指针取它所指向地址的值

注意 *运算符对这个指针

取它所指向的地址的值

就是把0003这个格子里头的值给我取出来

那这个运算符 这个等式

右边应该等于什么呢

就是格子里的内容 0x44

如果这个概念在C语言基础上

是清晰的同学那OK

那你非常好

你对这件事情是清楚的

就是存储器的抽象概念

是有序编了地址的这样一段存储空间

每个单元里可以存储数

借助指针的概念

我们理解了地址与它所存储的值之间的关系

如果我们再多讲一步

如果我们声明了一个变量

编译器会帮我们把这个变量

分配一个存储空间来使用

假设我们char c声明了一个变量

也许在C语言的范畴

你声明了你就用了

你不管了

但是实际上在计算机里头

它在编译器的角度会给它分配一个地址

而这个地址

可能是我们在这个图里头

所指向的这个地址

所以如果我们用与号对这个C这个变量取地址

取到的是什么呢

那么在这张图里取到的就是

变量所指向的这个格子的地址

也就是0001

好 如果对于数据的存储有了概念

我们再多讲一步

实际上我们会慢慢的理解

我们计算机的程序也是一条条的指令

在概念CPU的时候给大家讲过对吧

不管你是4比特还是8比特的CPU

每一条指令其实也是一个0或者1的序列

某种意义上你可以把它理解为

是一个0或者1的数值

它也需要存储

所谓的程序

无论我们写的多么高大上

是人工智能还是智能车

它最终都体现为零和一这些指令序列的集合

有序的集合

所以它们会依次的存储

在一段非易失的存储器里

那么我们仍然跟刚才数据的存储一样

就像这样从某个地址到某个地址段

一条一条的指令存在那里

我们的CPU最终还是要通过地址

把它一条一条的取出来

这就是存储的概念

那么借这个机会我们把这个概念拉清楚

再回到我们刚才的问题

再回到我们刚才的问题的时候我们会发现

我们的CPU的运算实际上呢

它可以从寄存器来获得我们要的运算数

根据我们的指令

来完成我们所需要的运算

但是这是无源之水

所以从CPU的外部

我们可以根据一个一个的地址

从我们存储器源源不断的

拿到我们下一步

下下步未来要运算的数据进来

或者暂存在存储器

或者直接给我们CPU加以运算

那么这就是我们运算数的来源

那很多同学接着会说

那我算完的结果放哪呢

好问题 与之类似

我们算完的结果有个最就近的

我老把它比喻成草稿纸

就是放在我们CPU内部

刚才所说的这些寄存器当中的任意一个上

比如我们用R0 R1的里头的值

来做了个加法运算

我把它的结果放在R2这个寄存器里头

这是可以的对吧

那么我们还可以放在哪呢

这个结果如果不是草稿纸上

我算完了马上接着还要用的

这个比喻我很喜欢 为什么呢

我们一般在草稿纸上算完的结果

每一个中间步骤的我们

会接着在这儿写着往下算

总会有一步我算完了这是最终结果

我是不是把它誊抄到

我的试卷或者作业本上啊

所以呢 我们可能会把它直接写回

我们CPU外部的存储器里

这个CPU外部的存储器如果在个人电脑上

可能是我们的内存和硬盘

在我们的微控制器里头

是同一个芯片上CPU部分以外的存储部分

所以呢

我们的数据可以写回我们的存储器

那么这样就构成了一个完整的图

就是说我们的逻辑运算单元

可以从寄存器拿到数进行运算

也可以从存储器拿到运算

算完的结果可以送回寄存器

也可以送回我们的存储器

那下一个问题是

老师你讲的这些东西都很理想

那这事怎么才能有序的运行起来呢

难道每个CPU背后都得坐着一个人

跟开汽车一样

从这里拿一个数扔给这个寄存器

再从这个寄存器拿给逻辑运算单元

再把它扔给这个存储器

这是不可能的对吧

所以我们在一个完整的CPU里

必不可少的会有一个控制单元

本门课程不会讲这个控制单元怎么设计实现

但是我们会从概念上对它加以理解

那么我们把它进一步抽象成了这样一个图

就上面一个蓝色的部分

蓝色的部分上面有一排小格子

我们把这个小格子解释成我们的一条指令

我们都知道一条指令是零和一的序列组合

这件事情经过第二章节

我们学习过概念CPU以后它就不再神秘

为什么呢

概念CPU把它已经拆解的体无完肤

让你觉得它不再神秘

在概念CPU的时候大家稍微回忆一下

那四个比特的CPU里头

是不是有几个比特用来控制开关

让这个数据往那儿走

有几个比特控制这个运算

是用加法还是用减法还是用乘除法对吧

所以这些零或者一构成的指令

每一个零每个一都携带着一些控制的信息

那么最终体现为可能没有想象中那么神秘

就是底下这些数据

流向的开关的导通或者不导通

那么他们联合作用的结果

就是这些零或者一被逻辑运算单元加以解释

最后拆分为很多控制信号

而决定数据从哪来

ALU逻辑运算单元

应该做哪个运算

算完了送到哪去

所以呢 做一个这个不太恰当的比喻

或者叫不太合适的比喻就是说

我们都看过早期的计算机

有那种纸带子上面有零和一的孔

或者我们把它理解为

一个绞肉机或者面条机也好

一条指令放在那儿

一拆解 就变成很多个控制信号出来

让这一切进行有序的运行

那么这个背后的意思是

我们的指令解析是分析一条指令

所希望做的运算和操作

那么我们还要完成的 就是

在这个控制指令里头

所涵带的信息是数据的流向

数从哪来 算完了送到哪去

所以这样一个过程

当中会隐含的一件事是

寻址方式在这门课里

可能不能完整的展开讲

如果大家有兴趣

深入学习ARM CPU里头指令的

那些内部结构的时候我们会知道

我们每一个CPU设计的时候

会有一个很重要的概念

是寻址方式

这个CPU支持从哪里取得数

支持以什么方式

把数送到哪里去等等这样一些概念

那归而总之

就是控制单元

负责将一条确定的指令

解析为对刚才存储器

寄存器 逻辑运算单元的控制

来明确我们要做什么运算

以及数据从哪来到哪去

那么一个新的问题是

我们的控制单元上那些指令从哪来呢

那么这个问题刚才讲过指针的概念以后

也变的很顺了对不对

我们会知道我们的程序

所谓的程序是指令的集合

有序集合,一条条指令结合起来

Instruction by instruction is program

对 指令的集合是程序

而每一条指令又是一个有限位宽

8个比特 16个比特 0和1的组合 是机器码

它是存储在存储器里的

所以在一段存储器里

就像我们存储数据一样

存储了一段指令

一条接一条就是构成了我们的程序

所以我们所需要的只是有一个机制

在一个时钟的驱动下

在一个时序电路的驱动下

一条一条的把存储器里的指令

挨个读进来

放在我们的控制单元

这个刚才说面条机

绞肉机的上面加以解析

来完成运算

完成一条指令再取一条

再来完成运算

再取一条

那么他们如何有机的组合起来

完成一个真正强大的功能

是日后我们要

需要我们作为编程者应该做的事情

而作为CPU的设计

作为一个计算机的原理

他做的是这样一套机制

就是你如果写了一个功能完整正确的程序

他就能自动这样有序的往下执行

那么在这个过程当中

我们会有一个很重要的

新的寄存器产生

也就是PC寄存器

PC寄存器它是Program Counter的缩写

会把它称为程序计数器

那么这件事呢

我个人认为这个名称不是那么的准确

所以呢

有很多书会把它PC加以缩写

说它是PC指针寄存器

我不知道大家对于这样的解释

是不是感觉会更加的明显一些

为什么呢

因为这个寄存器永远保存下一条

将要执行的指令所对应的地址

换言之它是一个指针

它指向的是存储程序的那一段地址空间

那段存储器的地址值 总是指向下一条指令

所以每当一条指令执行完的时候

只要根据它的值去取里头内容

取出来当做下一条指令加以运行

而它是不是需要逐渐自动的

根据每条指令的运行自动加一

那么这样一种机制如果设计好了

只要有时序的驱动

我们CPU就会自动的一条条的指令取

一条条往下运行

OK 这就是我们一个完整CPU的取指令

运行指令 有序进行运算的一个完整概念

那么如果这些概念

基本新同学大家可以稍微停几秒钟

或者大家点一下你们这个MOOC课程的暂停

把刚才讲过内容回顾一遍

看看脑袋是否建立起了一个完整的模型

除此之外大家仔细的想一想你会发现

这件东西是不是仍然是

我们最早所讲的图灵机的高度抽象

于是我们会越发觉得这个先哲们的强大或者叫伟大

那么 我们接下来还会讲的一个小小的点是说

我们都知道了有了PC指针寄存器或者叫

程序(计数器)寄存器这样的一种存在

它指引我们的指令一条条的执行

有序的执行就构成了我们的计算机程序

那么我们会可以想象的是

这个程序根据我们所写的C语言翻译成汇编

翻译成指令这么一条条执行下去的时候

它一定是自动递增的

也就是像这样

一条指令一条指令的往下跑

那什么时候会出现像这样的一些跳跃呢

我给个提示

比如说我们会说

一个程序里写If Else

我们会说switch case

会用C语言做这些条件的判断

甚至有时候我们会呼叫一个函数调用

调用Add加法函数

调用一个Sub一个减法函数

函数执行完了我们要返回

所以在一般的程序执行流程里面

我们很显然会想到的是PC指针寄存器

绝大多数情况是逐一的递增

但是在有一些情况下碰到一些特殊指令

一些特殊程序需求的时候

一定要能实现跳转

那么跳转可能是PC指针寄存器

等于一个address 赋一个新值

直接到某个地方开始执行一段程序

也有可能因为简单是

当前值加一个offset 加一个偏移量

请跳过若干条指令直接执行 比如说If

判断了不应该执行If

应该执行Else

就跳过了一条指令来加以执行

那么 一个新的问题

也是我们这个单元最后一个遗留问题

我们如果是调用了一个函数

它跳转到了一个新的地址

加以执行

函数执行完了它得返回对吧

那么从CPU我们刚才讲的这个

计算机设计的构架上来讲

CPU一个没有人操作的自动的一个机器

它如何才能保证知道自己应该回到哪里去呢

它如何知道自己是从哪来的

能够正确的回到

刚才调用函数之前的位置

接着往下执行原来的程序呢

这是不是需要一个机制啊

所以在下个单元

我们会给大家讲一讲堆栈的概念

那么这个单元就到这里结束

智能车制作:嵌入式系统课程列表:

第一章 概览

-1.1 课程概览

--Video

-1.2 进入嵌入式系统的世界

--Video

-1.3 如何学好嵌入式系统

--Video

第二章 绪论

-2.1 计算机的基本概念、发展历史

--Video

-2.2 从晶体管到CPU

--Video

-2.3 概念CPU、微控制器MCU和嵌入式系统

--Video

-2.4 八卦计算机史

--Video

-2.5 不同领域、不同系列的嵌入式系统

--Video

-2.6 ARM历史与MKL25Z128 MCU

--Video

第三章 MCU基础

-3.1 CPU的基本结构和运行机制

--Video

-3.2.1 堆栈的概念

--Video

-3.2.2 堆栈的概念-头脑体操

--Video

-3.3.1 ARM的体系结构

--Video

-3.3.2 ARM的体系结构-头脑体操

--Video

-3.4 中断的概念和机制

--Video

-3.5 中断子程的概念和编程

--Video

-3.6 复位、时钟、存储器和总线

--Video

-3.7 小结:MCU的总体结构和程序运行机制

--Video

第四章 MCU外设与开发

-4.1 第一种外设:IO

--Video

-4.2 IO外设的编程实操-点亮LED

--Video

-4.3 IO外设的进阶知识

--Video

-4.4 嵌入式开发的基本概念与工具链

--Video

-4.5 嵌入式开发的进阶知识

--Video

-4.6 嵌入式开发中的C语言(上)

--Video

-4.7 嵌入式开发中的C语言(下)

--Video

-E0.1 实验零 开发板的初步认识与工具链的安装

--Video

-E0.2 实验零 体验一个例程的编译与下载

--Video

-E0.3 实验零 编写第一个程序:点亮核心板LED

--Video

-E1 实验一 点灯秘籍

--Video

第五章 MCU与嵌入式系统设计

-5 智能车视角的嵌入式设计

--Video

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。