浅谈单片机、ARM和DSP的异同
犹记得当年读书的时候,老师说单片机、ARM、DSP有互通之处,都是CPU,但听老师讲都听不懂。
我该如何理解他们,并找出他们的异同呢?我们来看看行内人的看法:
ICer,从事ARM CPU的SOC设计
按我的理解说几句吧,希望能说薄一点。
首先,说CPU,中央处理器,本质就是一个集成电路,实现的功能就是从一个地方(如rom)读出一个指令,从一个地方(如ram)读出数据,然后根据指令的不同对数据做不同的处理(如相加),然后把结果存回某个地方(如ram)。不同架构的cpu会有不同的指令,不同的存取方式,不同的速度,不同的效率,等等的差异。
然后,说单片机(通常意义所说的微控制器MCU),ARM(通常意义所说的高效能RISC),DSP(通常意义所说的通用数字信号处理器),这三个CPU分别是针对不同的应用而产生的CPU。当然这也不是绝对的,因为ARM现在出的CPU囊括了MCU(如M0),RISC(如A8),DSP(如M4)。
微控制器的目的主要是用作控制,他不需要多快的速度,如电饭锅的控制器,只需要控制发热元件的通断,信号等的开关等,但是对成本要求很严格,所以一般做得比较简单,4位,8位的很多。
高效能的RISC,常用于一些数据处理比较多的地方,最常见的莫过于现在的消费性电子产品了,手机,pad,MP4等等,目前ARM的商业模式主要是卖内核,集成到各家的SOC中间。他其实就是个通用的CPU,能干各种各样的活,和Intel的CPU一样。但是通用就有效能问题,在某些特殊场合,效能就显得没那么高了,如大量运算(譬如做FFT)的时候。这样就有DSP的用武之地了。
DSP,数字信号处理器,只要是做数字信号处理的模块都可以叫做一个DSP,如视频解码的IP核。但你老师所说的应该是指通用的数字信号处理器,如Ti的TMS320C55x DSP。该CPU的长处就是在于运算,大量循环的计算,如连续1024个乘加。他的指令针对这种应用有特殊的处理,相比RISC可以更快速高效地完成这类运算。
总的来说,学习CPU,首先就是要了解其指令集,然后了解去指令执行的方式,然后针对具体的芯片了解其外围电路,程序都是用C写的,基本使用就没啥问题了。
入门教材就不知道了,学好微机原理先吧。
qccc
一种设备能称之为CPU,是因为它能够融入到计算机的冯诺依曼体系中。冯诺依曼的计算机模型规定了计算机“运算器、存储器、控制器、外存储器、输入和输出设备”,而CPU的重要地位在于解决了运算问题,计算机的CPU能够访问存储器的数据和指令进行运算,从实现运算这一点的角度上看,无论是单片机、ARM、DSP都可以称之为CPU。
单片机集成完整的冯诺依曼体系所规定的结构,是一个完整的计算机体系。实现特定的运算功能,应用领域集中在工业自动化控制等专门化需求的运算领域。
ARM出品的芯片精髓在“R”,是RISC精简指令集的意思,和传统大型机以及PC微处理器采用的指令系统相比,RISC指令集根据80%的时候只用到了20%的处理器指令的状况,使用了经过精简设计的指令系统,使得整个处理器的设计可以更加简洁,功耗、体积大大缩小,所以ARM在目前的手机、平板等职能移动设备上得到了广泛应用。随着ARM处理能力的不断增强,加上其功耗小的特点,也不断在扩展其企业级服务器集群应用的可能性,为企业降低能耗成本。
DSP是数字信号处理器,相较于普通计算机实现通用计算的特点,DSP只负责数字信号(视频、音频或者其他传感器获得数字信号)处理。在日常生活中,常见的DVD、蓝光播放机、数字电视机顶盒、MP3、MP4等都广泛使用了DSP,由于设计的专门化,所以可以在较低的成本下,使DSP执行异常复杂的编码、解码等信号处理工作,而无需使用价格昂贵的通用处理器。
所以从广义上讲,单片机、ARM和DSP都可以算做CPU,但是这种说法并不严格,因为如今CPU往往指代的是兼容x86架构的通用处理器,例如你电脑里的intel和amd出品的cpu。如果把单片机、ARM和DSP都称作CPU,会在理解上产生偏差。
谢文洋,嵌入式爱好者
这些的确都能算CPU,前面大家已经说过共同点了,我主要说说区别吧。主要区别在于用途不同造成了功能侧重的区别。
比如单片机和低端ARM(如M3),更严谨的说法应该称作Microcontroller 或 MCU(Micro Control Unit),中文一般叫“微控制器”。而CPU叫做“中央处理器”。一个Control 和 Process 还是有很大区别的。 微控制器不需要一般也不具备强大的计算能力,重点在于实现各种逻辑和非逻辑控制。
而DSP的(Digital Signal Processor), PROCESS表明它相比于通用单片机具有更为强大的处理,运算能力。可以实现对数字信号的各种算法的处理。
举一个简单的例子。一个MP3可能由一块普通MCU+一块专用DSP 芯片组成。 其中普通MCU叫主控芯片,负责全局控制。诸如通过处理按键来响应用户的操作,控制屏幕输出相关播放信息给用户等等。而DSP只负责音频文件的解码。可见,全局的控制工作,逻辑比较繁琐,比如显示中各级菜单的实现,这是MCU适合的工作。而音频解码需要强大的运算能力,普通MCU难以胜任,就需要DSP来进行。
而ARM和单片机,我个人认为没有特别严格意义的界限,主要看功能和需求的划分。ARM本身已经给我们划分的很好了:”ARMv7架构定义了三大分工明确的系列:‘A’系列面向尖端的基于虚拟内存的操作系统和用户应用;‘R’系列针对实时系统;‘M’系列对微控制器。“ 所以诸如STM32之类的Cortex-M3芯片其实也可以理解做高端单片机的范畴。侧重于控制,片内集成,低功耗等指标。相比传统51,AVR。 Contrex-M系列的微控制器集成了更多的资源(如更高位的AD,更多的串口,以及I2C,SPI之类的外设总线)。而且32位相比传统8位和16位的单片机也更有优势。
而消费类电子产品中的ARM显然需要更为强大的运算功能。 这一块我不太熟悉,就不多说了。
额,发现楼主还问了如何学习。其实很简单,就是实践。买一块开发板实际动手做比什么都强,有机会参与一些项目更好,自学现在网络资源也非常丰富,不用担心。可以从8位单片机学起,作为入门。虽然近些年大家都说51落伍了,但是作为单片机入门还是很好的,相对简单,网上资源到处都是。你去买任何一个模块几乎都会给你提供51的例程。。。我现在就经常拿51测试模块,测试好了再改一下代码用到stm32上。
总之,只看书是没有用的。还是要多动手。写写代码,烧烧程序,焊焊简单的电路。你会收获很多。
anning865
我也来说一下自己的理解。
首先,“嵌入式”这是个概念,准确的定义没有,各个书上都有各自的定义。但是主要思想是一样的,就是相比较PC机这种通用系统来说,嵌入式系统是个专用系统,结构精简,在硬件和软件上都只保留需要的部分,而将不需要的部分裁去。所以嵌入式系统一般都具有便携、低功耗、性能单一等特性。
然后,MCU、DSP、FPGA这些都属于嵌入式系统的范畴,是为了实现某一目的而使用的工具。
MCU经过这么多年的发展,早已不单单只有普林斯顿结构的51了,性能也已得到了很大的提升。因为MCU必须顺序执行程序,所以适于做控制,较多地应用于工业。而ARM本是一家专门设计MCU的公司,由于技术先进加上策略得当,这两年独霸单片机市场。ARM的单片机有很多种类,从低端M0(小家电)到高端A8、A9(手机、平板电脑)都很吃香,所以也不是ARM的单片机一定要上系统,关键看应用场合。
DSP叫做数字信号处理器,它的结构与MCU不同,加快了运算速度,突出了运算能力。可以把它看成一个超级快的MCU。低端的DSP,如C2000系列,主要是用在电机控制上,不过TI公司好像称其为DSC(数字信号控制器)一个介于MCU和DSP之间的东西。高端的DSP,如C5000/C6000系列,一般都是做视频图像处理和通信设备这些需要大量运算的地方。
FPGA叫做现场可编程逻辑阵列,本身没有什么功能,就像一张白纸,想要它有什么功能完全靠编程人员设计。如果你够NB,你可以把它变成MCU,也可以变成DSP。由于MCU和DSP的内部结构都是设计好的,所以只能通过软件编程来进行顺序处理,而FPGA则可以并行处理和顺序处理,所以比较而言速度最快。
那么为什么MCU、DSP和FPGA会同时存在呢?那是因为MCU、DSP的内部结构都是由IC设计人员精心设计的,在完成相同功能时功耗和价钱都比FPGA要低的多。而且FPGA的开发本身就比较复杂,完成相同功能耗费的人力财力也要多。所以三者之间各有各的长处,各有各的用武之地。但是目前三者之间已经有融合的态势,ARM的M4系列里多加了一个精简的DSP核,TI的达芬奇系列本身就是ARM+DSP结构,ALTERA和XINLIX新推出的FPGA都包含了ARM的核在里面。所以三者之间的关系是越来越像三基色的三个圆了。
一句话以蔽之“你中有我,我中有你”。
浅谈单片机、ARM和DSP的异同的更多相关文章
- 浅谈单片机中C语言与汇编语言的转换
做了一单片机设计,要用C语言与汇编语言同时实现,现将这次设计的感受和收获,还有遇到的问题写下,欢迎感兴趣的朋友交流想法,提出建议. 单片机设计:基于51单片机的99码表设计 软件环境:Proteus8 ...
- 浅谈AsyncState与AsyncDelegate使用的异同
对于AsyncState来说,其MSDN的解释为:得到BeginInvoke方法的最后一个参数.而对于AsyncDelegate来说,其MSDN的解释为:得到异步调用的委托对象.也就是异步调用的委托源 ...
- 浅谈Java中接口与抽象类的异同
浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...
- 【VS开发】【DSP开发】浅谈Linux PCI设备驱动(二)
我们在 浅谈Linux PCI设备驱动(一)中(以下简称 浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设 ...
- 浅谈Samsung Exynos4412处理器
转载于:http://www.cnblogs.com/android210/archive/2013/01/16/2862349.html Topic:浅谈Samsung Exynos4412处理器( ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈JS面向对象
浅谈JS面向对象 一 .什么是面向过程 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了.注重代码的过程部分. 二.什么是面向对象 最先出现在管理学 ...
- 浅谈压缩感知(二十):OMP与压缩感知
主要内容: OMP在稀疏分解与压缩感知中的异同 压缩感知通过OMP重构信号的唯一性 一.OMP在稀疏分解与压缩感知中的异同 .稀疏分解要解决的问题是在冗余字典(超完备字典)A中选出k列,用这k列的线性 ...
- 浅谈FPGA
浅谈FPGA 前言 生活中永远都不会缺少「 为什么 」,于最近就被合胜学长了,问了一个看似简单却又极具意义的问题,为什么需要FPGA?FPGA与单片机的区别是什么?瞬间刷新了我入门三天FPGA的冲击感 ...
随机推荐
- JAVA的四种引用,强弱软虚用到的场景
1.强引用 最常用的引用类型,如Object object = new Object(),只要强引用存在,GC必定 不回收,即使当前内存空间不足,jAVA虚拟机宁愿抛出OutofMemoryError ...
- html(三)
今天自己画了个安卓机器人,之前听徐大大讲过一次,查手册去动手的时候其实发觉不是很难,这种规则的图像还是很好画的,主要是用<div>标签和<span>标签去做的,通过CSS添加样 ...
- Wamp集成环境配置多站点
一.打开apache配置文件httpd.conf 二.修改httpd.conf配置文件 1.在配置文件httpd.conf中搜索 conf/extra/httpd-vhosts.conf,然后将该行代 ...
- (转)Apple Push Notification Services in iOS 6 Tutorial: Part 1/2
转自:http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1 Upda ...
- (转)命令行下,用 xcodebuild 生成ipa文件,通过 itms-services 协议安装
准备工作:已经设置好,xcode中的证书,证书必须是企业级证书,才能通过 itms-services 协议安装 Step 1: 把以下代码保存到一个web目录中,命名为 “auto.plist”,注 ...
- bat文件调用shutdown命令不生效问题原因
背景: 本人使用云桌面办公,但是用于登陆云桌面的终端运行卡顿,每次开机要20min才能登陆云桌面,所以: 1)在BIOS设置了定时开关,让终端提前开机 2)在系统上层,开机启动项增加一个bat文件(s ...
- 在jsp页面上直接打开PDF文件
1.在不需要使用插件,直接打开通过链接方式打开 <%@ page language="java" import="java.util.*,java.io.*&quo ...
- openfire连接登陆优化方案
client登陆openfire,大概总共须要9个来回才完毕登录. 在2G情况下.就表现为client登录特别慢,所以,为解决问题,对openfire进行了例如以下优化 openfire的连接.登陆过 ...
- uploadify上传控件中文的乱码解决办法
uploadify上传控件中文的乱码解决办法 网站用的gb2312的编码,用uploadify上传控件上传中文时在IE能部分成功,FF,Chrome则完全失败,查找了一天原因,结果发现是页面编码问题, ...
- C#winform检测电脑安装的.netframework版本和是否安装了某软件
代码如下: //C#获取已安装 .NET Framework 版本 private static string[] GetDotNetVersions() { DirectoryInfo[] dire ...