当前课程知识点:智能车制作:嵌入式系统 > 第三章 MCU基础 > 3.1 CPU的基本结构和运行机制 > 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
-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
-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
-5 智能车视角的嵌入式设计
--Video