当前位置:首页 > 嵌入式 > wenzi嵌入式软件
[导读]笔者能力有限,如果文中出现错误的地方,欢迎大家给我指出来,我将不胜感激,谢谢~ CPU 和 MCU 的区别 对于嵌入式开发来讲,我们在日常中接触到概念都是 MCU ,MCU 和 CPU 的区别也就在于 MCU 集成了片上外围器件,CPU 不带外围器件,一个简单的例子就是 MCU

笔者能力有限,如果文中出现错误的地方,欢迎大家给我指出来,我将不胜感激,谢谢~

CPU 和 MCU 的区别

对于嵌入式开发来讲,我们在日常中接触到概念都是 MCU ,MCU 和 CPU 的区别也就在于 MCU 集成了片上外围器件,CPU 不带外围器件,一个简单的例子就是 MCU 在芯片内集成了 Flash 和 RAM 用来存储程序和数据,对应的在我们个人 PC 的体现就是硬盘和内存条,因此两者的区别只是在于外围器件的集成与否,最本质的工作原理两者是互通的。

CPU 的组成部分

CPU 是由许多晶体管组成的电子部件,从功能方面上来看,CPU 内部由寄存器,控制器,运算器和时钟四个部分组成,他们各自的功能如下:

  • 寄存器:可以用来暂存指令、数据等处理对象。

  • 控制器:负责把内存上的指令读入寄存器,并根据指令的执行结果来控制整个系统。

  • 运算器:运算器负责运算送入运算器的数据

  • 时钟:负责发出 CPU 开始计时的时钟信号,CPU 在时钟信号的驱使下才能工作。

程序是如何被 CPU 执行的

我们在进行嵌入式软件开发的时候,常用的一种语言是 C 语言,C 语言又被称之为高级语言,我们编写的高级语言在真正的进入到 CPU 进行执行之前,还有很多个步骤需要完成,比较粗略的划分是需要经过:编译 -> 链接 -> 生成可执行文件三大步骤,比较细致地划分就是下图所示的过程:

编译链接过程


根据上述流程图我们可以知道,程序在进入 CPU 执行前,会得到一个可执行程序,而这个可执行文件内包含的就是一系列指令和数据的集合,所以说我们编写的程序本质上也就是指令 + 数据的形式,既然有了能被 CPU 所识别的指令和数据,那么编写的程序也就可以在 CPU 里运行起来了。

CPU 的工作流程

在细致的阐述 CPU 是如何工作的,我们先来看一张 CPU 的工作流程图,图片如下所示:

在这里插入图片描述


在上述所示的图片里,我们可以看到这样几个信息,在虚线框外面的指令存储器和数据存储器,在虚线框内的指令寄存器,控制单元,寄存器组,逻辑运算单元以及状态寄存器,接下来就来阐述他们各自是怎么运行的以及他们之间又是如何相互协调共同完成一个程序。

逻辑运算单元和寄存器组

先从逻辑运算单元看起,名字叫运算单元,那顾名思义,它的功能就是运算,既然是运算那么就需要操作数和指令,具体如下图所示:

逻辑运算单元


上图所示的 OP 代表的就是指令要执行的操作,从图中也可以看到逻辑运算单元的操作数是来自寄存器组,当然对于逻辑运算单元的操作数也不总是来自寄存器组,只有在进行简单的运算的时候,才会从寄存器组里取得操作数进行运算,运算之后,那就要有结果,所以逻辑运算单元会输出两个数据,一个是运算之后的结果,一个是标志位,这里的标志位代表的是两个操作数运算之后的运算结果是否得0,是否进位,是否是负数,是否溢出这几种标志。
另一方面,寄存器组除了给逻辑运算单元提供操作数之外,同时还充当存储运算结果的功能,示意图如下:

在这里插入图片描述


也就是说,寄存器组的功能除了可以给逻辑运算单元提供操作数之外,还会存储逻辑运算单元的运算结果。

逻辑运算单元和数据存储器

上述说到,在进行简单运算的时候,逻辑运算单元会从寄存器组中取得操作数,那在进行复杂运算的时候怎么办呢,这时候,数据存储器就要发挥它的作用了,示意图如下:

在这里插入图片描述


从上述图片可以看到逻辑运算单元的操作数一个是来自数据存储器,一个是来自寄存器组。在往数据存储器里取操作数的时候,需要注意的是,数据存储器并不是 CPU 的部分,那么访问存储器的速度相比于访问寄存器的速度是要慢许多的。
在阐述寄存器组的时候,我们说到寄存器组可以提供操作数,同时也能够存储逻辑运算单元的运算结果,那对于数据存储器来说,也是一样的,它也能够存储逻辑运算单元的运算结果。示意图如下:

在这里插入图片描述


那寄存器组和数据存储器都能够存储逻辑运算单元的运算结果,那两者的区别是什么呢?笔者听到的最为通俗的一个解释就是:把逻辑运算单元的运算结果存储在寄存器组中就好比我们在考试做数学填空题的时候,会得到一些中间结果,就是说这些结果并不是要填到试卷里的答案,但是是作为下一步运算的条件,那我们就先把这个结果记录到草稿纸上,这个草稿纸就相当于我们的寄存器组,当我们计算出最后的答案的时候,再将这个答案填到我们的试卷上,试卷就相当于我们这里的数据存储器。所以,用一句话来说,就是,寄存器组是用来存储中间结果的,而数据存储器是用来存储最终结果的。

控制单元

上述我们说逻辑运算单元的操作数来源可能是寄存器组可能是数据存储器,运算结果的存储位置可能是寄存器组也可能是数据存储器,那在实际程序运行的时候,到底该采用哪一种方式呢,这个时候,就需要使用到控制单元来进行协调,示意图如下:

在这里插入图片描述


从上述图片我们可以看到从控制单元往下的各个线条分别指向了各个开关,这里的空圈就代表的是一个开关节点 ,也就是说控制器将控制开关往哪里闭合,从而决定了是往寄存器还是往数据存储器里取得操作数。
在看图中控制单元上面的部分,我们可以看到数据控制单元的数据来源是指令寄存器,所以说控制单元接收的是指令,那么我们也就可以总结一下控制器具备的功能,如下:

  • 指令解析:分析该指令需要执行什么操作

  • 确定数据流向:确定该指令用到的操作数来源和产生结果的去向

获取指令

上述讲到控制单元的是从指令寄存器中获得指令的,那么指令寄存器的指令又从何而来呢,我们回到我们最开始给出的那张示意图:

在这里插入图片描述


从图中可以看到指令是从指令存储器中取得的,同时,我们思考程序要能够正确的运行,那么就需要使得指令有序的得到运行,而不是胡乱地送到指令寄存器中,那么 CPU 又怎么保证指令能够有序的得到运行呢,这里就需要使用到 CPU 的 PC 指针寄存器,PC 指针寄存器的功能是存放下一条待执行指令的地址,当地址被取出之后,PC 指针寄存器将更新,指向下一条即将执行的指令,因此 PC 指针寄存器的存在也就保证了指令的有序执行。

总结

上述我们把 CPU 工作涉及的部件单独拆开进行了阐述,现在我们将其整合,所以 CPU 的工作流程是根据 PC 指针寄存器存储的下一条即将执行的指令的地址,使得指令存储器中的指令能够有序的进入指令寄存器,然后,控制单元从指令寄存器中取得相应的指令,并对其进行指令解析,判断当前指令要执行的操作,以及根据指令解析的内容控制逻辑运算单元操作数的来源和逻辑运算单元运算结果的存储位置,从而完成指令要求 CPU 执行的运算。

参考资料:
[1] 学堂在线慕课课程《ARM微控制器与嵌入式系统》

您的阅读是对我最大的鼓励,您的建议是对我最大的提升,欢迎点击下方图片进入小程序进行评论,或者添加笔者微信相互交流,二维码在公众号底部获取



免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

不少团队把应用切成容器后,以为节点上线会更灵活。边缘计算真到现场时,最先暴露的往往不是编排能力,而是冷启动被镜像拉取和层展开拖得过长。

关键字: 边缘计算 冷启动 CPU

在现代多核CPU的高并发编程领域,Cache伪共享是最隐蔽也最容易被忽略的性能杀手,结合我们之前深入探讨过的C++内存模型、无锁队列实现、Mutex互斥锁优化等工程实践经验,很多开发者在编写高并发多线程代码时,明明逻辑上...

关键字: CPU 伪共享

在电力电子系统全面转向数字化的当下,很多工程师都会遇到一个看似矛盾的现象:明明选用了主频足够高的数字信号控制器,算法逻辑也经过反复验证没有问题,但最终整机的稳态精度和动态性能,始终达不到理论仿真的预期。反复排查软件逻辑后...

关键字: 数字控制 CPU

机器人产业的真正分水岭,可能既不在算力大小,也不在模型参数的多寡。在各类人形机器人、自主移动机器人与智能工业系统密集亮相的当下,一个更本质的问题正在被反复追问:一台已经掌握多项技能的机器人,为什么换一个场景、换一个任务,...

关键字: ARM 物理 AI 机器人 泛化能力 CPU 运动控制

微软和亚马逊云科技最新财报传递出同一个信号:基于 Arm 架构的 CPU 已成为智能体 AI 的核心基础设施。

关键字: 云计算 CPU AI

很多现场节点一遇到吞吐瓶颈,就想把内存复制次数砍掉。边缘计算若把零拷贝只当成省一次 memcpy,很容易把新的时延和一致性问题带进主链路。

关键字: 边缘计算 零拷贝 CPU

我们已经过了仅凭演示效果来评判人工智能 (AI) 基础设施的阶段。如今,更关键的问题在于,这些能力能否以可靠、可扩展且具备成本效益的方式交付。这正是我们在设计下一代 AI 基础设施过程中,与云服务提供商、芯片合作伙伴及系...

关键字: 人工智能 CPU 自研芯片

如果我们用Arduino核心在ESP8266上写任何代码,很可能已经遇到了这个瓶颈。你写的每一行代码都运行在loop()函数内部,而loop()是协作式的——它从上到下依次执行,只有在完成所有操作后,SDK才会有机会进行...

关键字: Arduino CPU LED ESP8266

本项目记录了将一块基于STM32F407的空开发板,通过将其内部12位数模转换器(DAC)连接至PA4引脚,成功改造为功能完整的模拟信号发生器的过程。从完全零基础构建的裸机模板出发,在调试固件配置方面积累了极为丰富的学习...

关键字: CPU 信号发生器 定时器 STM32F407

核心数量提升33%、PCIe带宽提升至2倍、内存带宽提升至2.6倍,大幅强化高性能工作负载的运行。 搭载第六代AMD EPYC CPU和AMD Instinct™...

关键字: AMD CPU MICRO SUPER
关闭