本科生学习fpga,dsp,arm嵌入式系统前途分析
本科生的话,建议做软件方向的嵌入式系统,即利用现有的芯片和操作系统(开源的非开源的都可以)进行开发。嵌入式没有竞争相对小的方向,不管你搞什么,今天无限风光,明天就有可能寄人篱下。希望楼主在选择之前首先端正一下态度,选择了电子工程师这条路,就没有“竞争小”这项选择。前途的话在个人,你要是真是个牛逼人物捡垃圾也能捡出不一样的精彩。
根据楼主本科生的情况,DSP还是不要碰了。这玩意单纯从编程角度来讲没有任何难度,其精髓在于你编程实现的算法.想把DSP用好,首先你将来从事的行业必须有大规模计算的需求,而且这种计算需求从某种程度上对时间要求比较高。比如通信,实时视频处理等方面。有些应用,比如地质数据分析,遥感数据分析,大规模计算的需求是有了,但是一个星期出结果和一年出结果没啥差别,那这种也就不需要DSP了,不如直接上PC来的顺手。其次应用DSP人员必须对自己行业所需要的专业知识极为精通,注意!这里的专业知识不是指什么数模电微机原理等“专业课”。而是解决本行业可能遇到的问题所需的知识。具体例子不好列举,就拿一般看得到的教材来说,很简单的DSP应用——FFT,你说你要是连FFT怎么回事儿都不知道,用在什么场合也没概念,什么时候用也说不清楚还搞什么DSP啊?DSP这东西跟什么学历没有太大关系,本科生也可以做得很好,关键是自己有没有足够的知识来用好它。
FPGA相对DSP来讲稍微简单一点,当然,视个人情况而定。比起动不动就FIR啊IIR啊椭圆滤波器啊Butterworth啊什么的,我更喜欢几百万门的与非逻辑。基本的逻辑电路设计,本科时候的数字电路就可以够用了。不过大的趋势还是做SOC。SOC这个概念不难理解,简单点说就是把你原来做的实验那个PCB板换成硅片,把与外界的连线换成管脚。用芯片做了原来电路板做的工作。单纯组建一套片上系统并不复杂,复杂的是这套系统的商业化成本。现在很多SOC设计里面大量应用的现成的IP都是需要付费的。一方面原因是如果自己设计,周期和风险就会成倍放大,另一方面针对某些功能的IP靠自己的力量也搞不出来。如果是学生或者独立开发者,当SOC进行到一定程度后就会感觉自己的开发寸步难行了。抬头望去到处都是IP壁垒。想做出自己的东西真的很不容易。如果你的理论知识够牛的话,可以自己设计IP也是一个挺好的出路。
不过这又回到了DSP的老话题:你的知识够用吗?以我们公司现在的视频处理项目来讲,实现的时候很简单,就是一连串的矩阵转换。问题是如果没人告诉你这么做,你自己能想到吗?如何把一个BMP或者PNG转换为YUV或者YPbPr?数据如何压缩?其实就是一堆色空间转来转去的。再比如让你用高斯算子和拉普拉斯算子做一个当前图像的边界检测,怎么做?先不讨论怎么做,麻烦问一下啥是高斯算子?归根到底,又是高等数学和线性代数那一档子事儿。按照中国当前的国情,50%的本科生基本靠混,另外50%不甘堕落的上进青年中,有90%不重视理论知识。所以FPGA入门可以,做也不是不能做,想有前途?难。
这就是为什么建议你做嵌入式软件的原因。软件面比较广,在你51单片机嵌入式编程的技术基础上继续深入嵌入式系统的应用编程方向,一来上手快,理解概念好理解一些,二来对理论知识的要求不是那么严苛。虽然没有理论知识你依然只是个代码民工,但是嵌入式编程本身的灵活性从另一方面给了自己发展的空间,也就是说单纯就代码如何实现上自己也可以学到不少东西。所以软件可以不限于某几个行业而存在,而DSP和FPGA不行。如果可以参与一些开源的项目,对自己的提升就更大了。
总之,本科生的话,如果不准备继续深造而且考虑今后一定时间的发展的话,做嵌入式软件比较合适。
搞嵌入式开发的人有两类:一类是学电子工程、通信工程等偏硬件专业出身的人,他们主要是搞硬件设计,有时要开发一些与硬件关系最密切的最底层软件,如BootLoader、 Board Support Package(像PC的BIOS一样,往下驱动硬件,往上支持操作系统),最初级的硬件驱动程序等。他们的优势是对硬件原理非常清楚,不足是他们更擅长定义各种硬件接口,但对复杂软件系统往往力不从心(例如嵌入式操作系统原理和复杂应用软件等)。
另一类是学软件、计算机专业出身的人,主要从事嵌入式操作系统和应用软件的开发。如果学软件的人对硬件原理和接口有较好的掌握,我们完全也可写BSP和硬件驱动程序。嵌入式硬件设计完后,各种功能就全靠软件来实现了,嵌入式设备的增值很大程度上取决于嵌入式软件,这占了嵌入式系统的最主要工作(目前有很多公司将硬件设计包给了专门的硬件公司,稍复杂的硬件都交给*或国外公司设计,国内的硬件设计力量很弱,很多嵌入式公司自己只负责开发软件,因为公司都知道,嵌入式产品的差异很大程度在软件上,在软件方面是最有"花头"可做的),所以搞软件的人完全不用担心我们在嵌入式市场上的用武之地,越是智能设备越是复杂系统,软件越起关键作用,而且这是目前的趋势。
如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,我认为大概分3个阶段:
1、嵌入式linux上层应用,包括QT的GUI开发
2、嵌入式linux系统开发
3、嵌入式linux驱动开发
嵌入式目前主要面向的几个操作系统是,LINUX,WINCE、VxWorks等等
Linux是开源免费的,而且其源代码是开放的,更加适合我们学习嵌入式。
所以你可以尝试以下路线:
(1) C语言是所有编程语言中的强者,单片机、DSP、类似ARM的种种芯片的编程都可以用C语言搞定),因此必须非常熟练的掌握。
推荐书籍:《The C Programming Language》 这本经典的教材是老外写的,也有中译版本。
(2) 操作系统原理,是必需的,如果你是计算机专业毕业那也就无所谓了,如果是非计算机专业的就必须找一本比较浅显的计算机原理书籍看一看,把啥叫“进程”“线程”“系统调度”等等基本问题搞清楚。
(3) Linux操作系统就是用C语言编写的,所以你也应该先学习下Linux方面的编程,只有你会应用了,才能近一步去了解其内核的精髓。
推荐书籍:《UNIX环境高级编程》(第2版)
(4) 了解ARM的架构,原理,以及其汇编指令,我们在嵌入式开发中,一般很少去写汇编,但是最起码的要求是能够看懂arm汇编。
(5) 系统移植的时候,就需要你从最下层的bootloader开始,然后内核移植,文件系统移植等。而移植这部分对硬件的依赖是非常大的,其配置步骤也相对复杂,也没有太多详细资料。
(6) 驱动开发
linux驱动程序设计既是个极富有挑战性的领域,又是一个博大精深的内容。
linux驱动程序设计本质是属于linux内核编程范畴的,因而是对linux内核和内核编程是有要求的。在学习前你要想了解linux内核的组成,因为每一部分要详细研究的话足够可以扩展成一本厚书。
以上只不过是大概的框架,在实际的开发中还会涉及很多东西,比如:交叉编译、makefile、shell脚本等等,所以说学习嵌入式的周期较长,门槛较高,自学的话更是需要较强的学习能力和专业功底。只要能坚持下来一定会取得成功!
不过关于嵌入式的学习,还是要给你一些建议,嵌入式技术的门槛是比较高的