8位微控制器与32位微控制器在编程方面有何不同


19

是的,目前我们在世界上拥有8位,16位和32位微控制器。它们都是经常使用的。对8位和16位微控制器进行编程有何不同?我的意思是,它需要不同的技术或技能吗?让我们以微芯片为例。如果人们想从8位微控制器过渡到32位微控制器,需要学习什么新东西?


不会。当然存在不​​同的问题,但是这些问题主要在特定于设备的细节级别上。例如,是否允许未对齐的单词访问?(在ARM上不是-在x86上是)。这个问题还不够具体。
克里斯·斯特拉顿

哇,谢谢你的回答。因此,在对32位处理器和8位处理器进行编程时,实际上需要考虑非常重要的差异。在这里我指的是C,因为我认为大多数人都不是出于编程目的而去研究汇编语言。感谢您的详细答复,我非常感谢。
Quantum231'2014-4-27

使用32位uc时,您必须正确选择更多的选择和更多的寄存器。我想这取决于您在做什么。也就是说,这些天,您可以花约50美元获得开发板,编译器,调试器和IDE。过去一天的费用将近$ 1000。

Answers:


33

通常,从8位微控制器到16位微控制器到32位微控制器,意味着您对资源(尤其是内存)以及用于进行算术和逻辑运算的寄存器的宽度的限制将更少。8位,16位和32位绰号通常既指内部和外部数据总线的大小,也指用于算术和逻辑运算的内部寄存器的大小(以前只是一个或两个称为累加器) ,现在通常有16或32个寄存器组)。

I / O端口的端口大小通常也将遵循数据总线的大小,因此8位微控制器将具有8位端口,而16位将具有16位端口等。

尽管具有8位数据总线,但许多8位微控制器仍具有16位地址总线,并且可以寻址2 ^ 16或64K字节的内存(这并不意味着它们具有接近实现的任何空间)。但是某些8位单片机(如低端PIC)可能只有非常有限的RAM空间(例如PIC16上为96字节)。

为了解决其有限的寻址方案,一些8位微控制器使用分页,其中页寄存器的内容决定了要使用的几个存储体之一。无论页面寄存器设置为什么,通常都会有一些可用的公共RAM。

16位微控制器通常限于64K内存,但也可以使用分页技术来解决此问题。当然,32位微控制器没有这种限制,并且可以寻址多达4GB的内存。

堆栈大小与不同的内存大小一起。在低端的micros中,这可以在特殊的存储器区域中实现,并且非常小(许多PIC16具有8级深度调用堆栈)。在16位和32位单片机中,堆栈通常位于通用RAM中,并且仅受RAM大小的限制。

在各种设备上实现的内存量(程序和RAM)也存在巨大差异。8位单片机可能只有几百个字节的RAM,还有几千个字节的程序存储器(或者更少-例如PIC10F320只有256个14位字的闪存和64个字节的RAM)。16位的micros可能具有数千字节的RAM和数万字节的程序存储器。32位单片机通常具有超过64K字节的RAM,并且可能具有1/2 MB或更多的程序存储器(PIC32MZ2048具有2 MB的闪存和512KB的RAM;针对图形优化的新发布的PIC32MZ2064DAH176具有2 MB的闪存,以及高达32MB的片上RAM)。

如果您使用汇编语言进行编程,则寄存器大小的限制将非常明显,例如,在8位微控制器上加两个32位数字是一件很麻烦的事,而在32位微控制器上却很琐碎。如果您使用C语言进行编程,那么这在很大程度上是透明的,但是对于8位代码,其基础编译代码当然会更大。

我说的基本上是透明的,因为各种C数据类型的大小可能因一个Micro大小而异。例如,针对8或16位微指令的编译器可以使用“ int”表示16位带符号变量,而在32位微指令上,这将是32位变量。因此,许多程序使用#defines明确说明所需的大小,例如无符号16位变量的“ UINT16”。

如果您使用C语言进行编程,则最大的影响将是变量的大小。例如,如果您知道变量将始终小于256(如果带符号,则始终在-128至127范围内),则应在8位单片机(例如PIC16)上使用8位(无符号char或char) ),因为使用较大的尺寸将非常低效。同样,在16位单片机(例如PIC24)上重新存储16位变量。如果您使用的是32位单片机(PIC32),则由于MIPS指令集具有字节,字和双字指令,因此它实际上没有任何区别。但是,在某些32位微控制器上,如果它们缺少此类指令,则由于掩蔽操作8位变量的效率可能低于32位变量。

正如论坛成员vsz所指出的,在系统中,您拥有一个大于默认寄存器大小的变量(例如8位微控制器上的16位变量),并且该变量在两个线程之间或在基本线程之间共享和一个中断处理程序,必须对atomic变量执行任何操作(包括读取操作),即使其看起来像是一条指令。这称为关键部分。缓解此问题的标准方法是在关键部分周围使用禁用/启用中断对。

因此,从32位系统升级到16位,或者从16位升级到8位,这种类型的变量上任何大于默认寄存器大小(但以前没有过)的操作都必须视为关键操作部分。

从一个PIC处理器到另一个PIC处理器的另一个主要区别是外围设备的处理。这与字长无关,而与每个芯片上分配的资源的类型和数量有关。通常,Microchip试图使跨不同芯片使用的同一外设的编程尽可能相似(例如,timer0),但是总会有差异。使用其外围设备库将在很大程度上隐藏这些差异。最后的区别是中断的处理。Microchip库再次为您提供帮助。


可能值得注意的是,在汇编语言级别上,8位处理器趋向于具有更少的寄存器和更少的正交指令(AVR是一个更具RISCy例外),这是开发它们时受到设计约束的结果。32位处理器往往是RISC的后代(瑞萨的RX,一种现代的CISC,是一个例外,而飞思卡尔的ColdFire则是从m68k降级)。
Paul A. Clayton 2014年

9
为了不为此添加一个新的答案,我认为添加从16到8的32位到16的过渡会引起讨厌的惊喜是很重要的,因为算术不再是原子的。如果在8位微控制器上添加两个16位数字,并在中断中使用它们,则必须注意使它们成为线程安全的,否则最终可能在中断触发之前只添加一半。您的中断服务程序中的值无效。
vsz 2014年

2
@vsz-好点,忘了那个。通常,应该禁用任何大于默认寄存器大小的易失性变量的访问(包括读取操作)周围的中断。
tcrosley

1
32位uC通常具有32位I / O接口,这是真的吗?我认为无论如何,它通常只是串行通信。
clabacchio

1
@clabacchio我的经验是,所有I / O端口寄存器都定义为32位,但有时高16位16-31未被使用,因此并行端口仍然是16个物理引脚。在其他情况下,例如RTCC寄存器,则全部使用32位。
tcrosley 2014年

8

8位和32位微控制器之间的一个共同区别是8位微控制器通常具有一定范围的存储器和I / O空间,无论执行上下文如何,都可以在一条指令中对其进行访问,而32位微控制器通常会需要多指令序列。例如,在典型的8位微控制器(HC05、8051,PIC-18F等)上,可以使用一条指令来更改端口位的状态。在典型的ARM(32位)上,如果最初未知寄存器的内容,则将需要四条指令序列:

    ldr  r0,=GPIOA
    ldrh r1,[r0+GPIO_DDR]
    ior  r1,#64
    strh r1,[r0+GPIO_DDR]

在大多数项目中,控制器将花费大量时间进行除设置或清除单个I / O位之外的事情,因此,诸如清除端口引脚之类的操作需要更多指令的事实通常无关紧要。另一方面,有时代码必须“大爆炸”许多端口操作,并且用一条指令执行这些操作的能力就证明是非常有价值的。

在另一方面,32位控制器始终设计为有效访问可以存储在内存中的多种数据结构。相比之下,许多8位控制器在访问不是静态分配的数据结构时效率很低。32位控制器可以在一条指令中执行阵列访问,而该访问将占用典型8位控制器上的六条或更多条指令。


我认为您的意思是“位砰”。可能值得注意的是,ARM支持位带区域(其中字操作是单位操作),并且MIPS的MCU专用扩展提供了字节指令内的原子置位/清除位指令(ASET / ACLR)。
保罗·克莱顿

@ PaulA.Clayton:在过去的20年中,我还没有真正研究过MIPS。至于位带区域,我从来没有想过在合理的代码中使用它们的方法,即使我可以使用它们,它们也只会保存一条指令,除非有人使用了一些疯狂的编程技巧。它们可能会保存两个[根据该位是否应置1或清零来向R0加载偶数或奇数地址,并适当调整存储指令上的偏移量以进行补偿]。顺便说一句,您是否知道为什么位带区域使用字地址?
supercat 2014年

@supercat:字寻址使您可以通过指针下标(region_base[offset])从C或C ++访问位带区域
Ben Voigt 2014年

@BenVoigt为什么用字节寻址不能做到这一点?(也许一个可能的原因是取消了对希望支持两位和四位运算的期望/希望。)
Paul A. Clayton

@BenVoigt:必须将位数字缩放4倍,通常会花费额外的指令。实际上,我希望看到的是一组区域,而不是位带区域,它们相对于“正常”内存访问处于固定偏移量,但是指定写入一个区域如果可能的话,将仅“置”位,而写入另一位将仅“清除”位。如果总线具有单独的“写使能”和“写零使能”控制位,则可以实现位带允许的功能,但在许多情况下,请避免进行读-修改-写操作。
supercat 2014年

6

实际上,最大的不同是,要完全了解整个芯片的文档数量。那里有8位微控制器,附带了将近1000页的文档。相比之下,1980年代的8位CPU及其使用的流行外围芯片的价值约为200-300页。外围设备丰富的32位设备将需要您阅读2000-10,000页的文档来理解该部件。具有现代3D图形的零件位于2万页的文档中。

以我的经验,了解一个给定的现代32位控制器所需的所有知识的时间大约是现代8位部件所需时间的10倍。“一切”是指您知道如何使用所有外围设备,甚至以非常规的方式使用,并且知道机器语言,平台使用的汇编程序以及其他工具,ABI等。

完全不可能想象的是,许多设计都是在部分理解的基础上完成的。有时它无关紧要,有时不是。切换平台必须在理解短期和中期生产率的前提下进行,您需要为此付出代价才能从更强大的体系结构中获得可观的生产率提升。做您的尽职调查。


3

我个人不必担心升级同一系列的(8bit-> 32bit)uC,而您正在全面提高规格。通常,对于数据类型,我不会做任何超出正常范围的事情,因为这可能很难维持下去。

降级设备代码是另一回事。


3
数据类型的大小由编译器而不是处理器体系结构确定。8位处理器可以具有32位int,即使要花费多条指令来操作它们也是如此。
乔·哈斯(Jos Hass)2014年

好的评论-由于更正,我删除了第一行。
Nick Tullos 2014年

@JoeHass:针对8位处理器的编译器可以将其定义int为32位,甚至64位,但是我不知道任何确实定义int为大于16位或升级的现有8位编译器16位值到更大的值。
supercat

-1

32位MCU将消耗更多的功率。并需要更多的支持电路。

一个并没有真正从8位过渡到32位...您将经常同时使用两者。最重要的是,您应该使用(并学习)适合该工作的任何内容。了解ARM,因为它可以立即撼动嵌入式世界,并且会继续努力。同时学习AVR或PIC,因为它们是出色的板卡控制器。

无论如何,您可能会遇到从AVR切换到ARM的痛苦,就像从ARM切换到x86一样,总线的大小实际上并没有太大的不同。尽管所有其他高级硬件都可以。从标准中断到具有6个优先级的向量中断数组,要比弄清楚如何计数到40亿要困难得多。


4
我不知道宣称32位MCU本质上更耗电。至少有一个公司(能源微公司)的整个产品线是超低功耗MCU,它们都是基于32位ARM内核的。
康纳·沃尔夫

3
刚设计出一个在cr2032上可运行7年的stm32l1电路
Scott Seidman

2
您能证明32位MCU需要更多的“支持电路”吗?我认为您在这里表达了一些不合理的意见。
乔·哈斯(Jos Hass)2014年

1
而且,向量中断注释没有多大意义,因为您可以在8位微控制器中获得多个优先级(请参阅具有3个优先级的Atmel xmega MCU),并且在每个硬件设备都具有向量中断的情况下,不再需要向量中断自己拥有独立的向量。
康纳·沃尔夫2014年

2
我正在使用32位Cortex-M0处理器来控制电动汽车的智能电池充电器。它使用3.3 V单电源。它具有一个内部振荡器和PLL,因此我什至不需要晶体。我使用的是28引脚DIP封装,但如果需要,我可以在8引脚DIP中获得Cortex-M0。怎么会比典型的PIC或AVR更复杂?
乔·哈斯(Jos Hass)2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.