所以我经常在汇编编程到微处理器时看到书籍/教程和参考资料......然后我看到一些人把它称为微控制器。
例如 Atmel ATtiny2313 ....我看过一些教程,有人称它为微处理器,有人称它为微控制器?
它是哪一个?并且对它们进行编程(基本上)相同吗?(组装中)
所以我经常在汇编编程到微处理器时看到书籍/教程和参考资料......然后我看到一些人把它称为微控制器。
例如 Atmel ATtiny2313 ....我看过一些教程,有人称它为微处理器,有人称它为微控制器?
它是哪一个?并且对它们进行编程(基本上)相同吗?(组装中)
这真的是两个问题合而为一……
首先,微控制器和微处理器有什么区别?
微处理器是一个纯粹的 CPU,它遵循从外部存储器总线读取的一组指令。它通过外部通信总线控制外部外围设备(如屏幕、键盘、鼠标、硬盘等)。当您对微处理器进行编程时,您的程序在设备外部。在计算机中,此内存最初是启动 BIOS ROM,它最初将操作系统从硬盘驱动器读取到 RAM 内存中,然后从那里继续执行它。
微控制器有点像一个多合一的 CPU + 内存,有一些外部端口与外界通信。它是独立的,不使用外部存储器来保存它的程序(尽管如果需要它可以读取和写入工作数据到外部存储器)。
其次,编程微控制器和微处理器是否相同?
在某些方面是的,在某些方面不是。
汇编语言是一个广义的术语,描述了一组 CPU 可以直接理解的指令。当您“编译”汇编语言时,它并没有真正编译任何东西,它所做的只是将其转换为代表命令的字节序列并插入一些相关的内存位置。这对微处理器和微控制器都是常见的。
但是,不同类型的 CPU 理解不同的 CPU 指令集。例如,如果您编写一个与 pic 16F877 微控制器配合使用的汇编语言程序,那么对于微处理器或 16Fxxx 系列 pic 微控制器之外的任何其他微控制器来说,这将是完全无稽之谈。
因此,尽管汇编在所有微处理器和微控制器中的工作方式相似,但您编写的实际指令列表却大不相同。要使用汇编语言编写,您需要深入了解设备的架构,对于微控制器,您通常可以从数据表中获得。
不同之处在于微控制器包括片上存储器,如 Flash EEPROM 和 RAM,以及并行和串行 I/O 等外围设备。对于第一批微处理器,这些都是外部设备。代替 I/O 的微处理器将地址和数据总线带到它们的引脚。
您为两者编写代码的方式是相同的。
为了说明这一点:在某些架构(例如 ARM)中,相同的 CPU 可用作微控制器(所有代码和数据存储器都在芯片上)、微处理器(所有代码和数据存储器都在外部)或混合(一些芯片上的内存,但对于大多数应用程序,您将添加外部内存)。CPU 是一样的,所以编程(在 CPU 指令的意义上)是一样的。
虽然这往往是一个灰色地带,但微控制器和微处理器之间的另一个共同区别是微控制器通常使用哈佛架构(代码和数据的独立地址空间),而微处理器几乎都使用冯诺依曼架构(代码和数据的组合地址空间) .
使用哈佛架构的微控制器系列示例包括:AVR、Intel 8051、PIC(PIC32 除外,见下文)和 ARM Cortex-M3。一个值得注意的例外是飞思卡尔处理器,如 HCS08,它使用冯诺依曼架构,视差螺旋桨也是如此。
这会以多种方式影响编程(下面显示的示例使用 C):
可能有几种类型的 RAM,每种都有自己的地址空间。例如,8051 具有与 RAM 的前 256 个字节分开寻址的外部数据 (xdata),即使两者都在同一芯片上实现。因此,必须在变量声明中使用限定符,例如unsigned int xdata foo;
如果常量在代码存储器中声明,则可能需要先将它们复制到 RAM 中才能访问它们。或者,需要有一种方法可以像访问数据一样访问代码存储器——例如 8051 的代码限定符,或 PIC 的程序空间可见性 (PSV) 功能。
在将 C 代码从一个芯片系列移植到另一个芯片系列时,这些访问代码和 RAM 的非标准方式往往是主要区别(除了外围设备)。
您不能在严格的哈佛架构中从 RAM 执行代码,因此不能有任何自修改代码(除非您计算重新刷新程序内存)。但是,PIC32 具有修改后的哈佛架构,允许在 RAM 中执行代码。Parallax Propeller 实际上利用其修改代码来执行子程序返回的能力,因为它没有硬件堆栈。
微控制器通常是提供计算和外围功能的单芯片解决方案。
微处理器提供计算功能,但不提供外围功能。
外设功能可以简单到只有几位简单的 I/O;或者可能包括复杂的计数器和计时器、视频显示、以太网、电机控制、音频和视频编解码器等。
对于给定的架构(比如基于 x86 的 CPU 和 MCU),“计算”编码将是相同的。但是访问外围功能的方式会有所不同,因此根据外围功能在目标硬件上的实现方式,您将有非常不同的硬件特定编码要做。