是的,目前我们在世界上拥有8位,16位和32位微控制器。它们都是经常使用的。对8位和16位微控制器进行编程有何不同?我的意思是,它需要不同的技术或技能吗?让我们以微芯片为例。如果人们想从8位微控制器过渡到32位微控制器,需要学习什么新东西?
是的,目前我们在世界上拥有8位,16位和32位微控制器。它们都是经常使用的。对8位和16位微控制器进行编程有何不同?我的意思是,它需要不同的技术或技能吗?让我们以微芯片为例。如果人们想从8位微控制器过渡到32位微控制器,需要学习什么新东西?
Answers:
通常,从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位和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位控制器上的六条或更多条指令。
region_base[offset]
)从C或C ++访问位带区域
实际上,最大的不同是,要完全了解整个芯片的文档数量。那里有8位微控制器,附带了将近1000页的文档。相比之下,1980年代的8位CPU及其使用的流行外围芯片的价值约为200-300页。外围设备丰富的32位设备将需要您阅读2000-10,000页的文档来理解该部件。具有现代3D图形的零件位于2万页的文档中。
以我的经验,了解一个给定的现代32位控制器所需的所有知识的时间大约是现代8位部件所需时间的10倍。“一切”是指您知道如何使用所有外围设备,甚至以非常规的方式使用,并且知道机器语言,平台使用的汇编程序以及其他工具,ABI等。
完全不可能想象的是,许多设计都是在部分理解的基础上完成的。有时它无关紧要,有时不是。切换平台必须在理解短期和中期生产率的前提下进行,您需要为此付出代价才能从更强大的体系结构中获得可观的生产率提升。做您的尽职调查。
我个人不必担心升级同一系列的(8bit-> 32bit)uC,而您正在全面提高规格。通常,对于数据类型,我不会做任何超出正常范围的事情,因为这可能很难维持下去。
降级设备代码是另一回事。
int
为32位,甚至64位,但是我不知道任何确实定义int
为大于16位或升级的现有8位编译器16位值到更大的值。
32位MCU将消耗更多的功率。并需要更多的支持电路。
一个并没有真正从8位过渡到32位...您将经常同时使用两者。最重要的是,您应该使用(并学习)适合该工作的任何内容。了解ARM,因为它可以立即撼动嵌入式世界,并且会继续努力。同时学习AVR或PIC,因为它们是出色的板卡控制器。
无论如何,您可能会遇到从AVR切换到ARM的痛苦,就像从ARM切换到x86一样,总线的大小实际上并没有太大的不同。尽管所有其他高级硬件都可以。从标准中断到具有6个优先级的向量中断数组,要比弄清楚如何计数到40亿要困难得多。