关于单片机位数的思考(8位、16位、32位)

8位、16位、32位是指单片机的“字长”,也就是一次运算中参与运算的数据长度,这个位是指二进制位。以8位为例,8位二进制的表达范围是0000,0000~1111,1111即十进制的0~255,即每次参与运算的数据最大不能超过255。而16位机的字长是16位,其数据表达范围是0~65535,即每次参与运算的数据最大不能超过65535;32位单片机的字长是32位,其数据表达范围是0~4294967295,即每次参与运算的数据最大不能超过4294967295。

8位、16位、32位与单片机的性能密切相关,通常32位机的性能要高于16位机,而16位机的性能又要高于8位机。为什么会这样呢?这要从2个方面来分析。第一,位数不同,运算效率不同。对于8位机而言,由于在一次运算中的每一个数都不能超过8位,因此即便如100+200=300这样的运算,它也不能一次完成,因为300已超过了8位所能表达的最大范围(255),因此,要对这样的一个式子进行运算,就要编写一段程序,将运算分步完成,最后合成起来得到一个正确的结果。而如果采用16位单片机来运算的话,那么一次运算就够了,显然分步完成所需要的时间要远远大于单步完成所需要的时间。同样道理,当某个运算的结果或者中间值大于65535时,16位机也不能一次运算,要分步实现它,而32位机则可以一次运算完成。第二,商业因素。通常运算能力越高,表示这个单片机性能越强,当然,价格高一些人们也可以接受,有了价格空间,生产商通常都会在这些芯片中提供更多的其他的功能,使得芯片的整体性能得到更大的提升。

典型的单片机中,80C51系列,PIC系列,AVR系列都是8位单片机;80C196、MSP430系列是16位机;而目前非常热门的ARM系列则是32位机。

 

另外在CSDN的讨论中的一些比较好的回答:
=================================
8位单片机,典型的是51系列的,再高级点用AVR、pic的,功能方面,似乎都不会很复杂,一般可能是控制类的多一下。一般不跑嵌入式OS。
16位的单片机,我接触的主要是MSP430,感觉16位的单片机比较尴尬,高不成低不就,要求低一点,8位MCU就够,高级点不如用32位MCU。一般不跑嵌入式OS。16位就不说了
32位的,就高级点了,一般能跑嵌入式OS,例如ucos2,ucos3,uclinux等等,能做更多复杂的功能。用OS和不用OS的话,编程的思路差异比较大。功能一般有面向控制的,也有简单消费类电子的。
================================
8位16位32位的区别就在于地址位和数据位位宽不同。其实都一样。比如8位的51单片,网上同样有人在上面移植ucos。16位的如430就更不用说了。32位的目前大多数是arm架构的,与前面的8位、16位的指令集不同。除掉前面的boot会用一小段汇编(主要是来clear寄存器,初使化堆栈--有些书上也叫栈)其它大多用C.只要用对应架构和平台的编译器就可以了。故而作为一个c的RD,不需要考虑太多。
=================================
都玩过,单纯C写代码没啥区别,一般编译器把初始化都做了,需要改的不多。汇编或者调试的时候会有区别,指令集不一样,寄存器也会有点差异(尤其是跟汇编的时候),参数传递时会有差异(因编译器而异),8位51单片机是(R0-R7),32位ARM是R0-R15(PC),然后就是int类型,8/16位通常是16bit,32位下是32bit(最蛋疼的是64位下int还是32bit)
=================================
学嵌入式的网友,接触到的 32 位机往往是 ARM 内核的,运行 Linux。

但实际上,32 位的微处理器远不止这一类。有些就是增强版本的微处理器,例如 M*Core 内核的微处理器。

32 位机的功能模块寄存器可以是 32-bit 的(当然也可以是 8-/16-bit),而且存取都是单时钟周期。CPU 的算逻单元也是 32 位的,当然,运算会更快。

32 位机的一个重要注意事项是 32-bit 字的自然边界问题,也就是字对齐问题。例如,要从 RAM 中将一个 32-bit 的字写入一个 32-bit 寄存器,那么,这个字在 RAM 中的地址必须是 32-bit 对齐的,也就是说地址最低十六进制位是 0, 4, 8, c。如果不是这样(比如数据类型是 char,又恰好其起始地址未 4 字节对齐),需要先将此字复制到一个 32-bit 对齐的缓存,再赋值。

还有一个比较麻烦的事,就是用户定义的结构中各个成员的对齐。如果在一个 32-bit 类型的成员前面,有 char 及 short 类型成员,且没有凑齐到 32-bit 自然边界,那么编译器将会自动补 NULL 来填充。有不少从 8 位向 32 位机移植代码的朋友,都在取成员长度的时候发生疑惑。问题往往是出在 32-bit 对齐上。

在有就是不同编译器的规约差异。

不过,用过两种微处理器之后,就会渐渐熟悉起来,相互移植也不会有很大困难。

=============================

数据总线的宽度为8、16、32。同时寄存器也达到相同位数。
============================
多少位宽不是指总线宽度,也不是存储器的宽度,像51单片机的地址总线是16位的,但是它是8位机。像ARM的存储器也有八位的,但是它是32位机。而是指CPU处理的数据的宽度,也就是CPU一次数据的吞吐量。比如同一条指令:MOV R0 R2
在51单片机里面,R0和R2都是8位的,所以51的CPU一次只能处理8位数据。
在ARM里面,R0和R2是32位的,所以ARM的CPU一次能处理32位数据。这就是区别

 

posted @ 2017-10-25 00:19  Andrew_qian  阅读(10420)  评论(0编辑  收藏  举报