这个问题在嵌入式教育培训中,我回答了很多次。初学者往往都会认为ARM开发比51开发高级,但事实是这样吗?本篇文章就基于嵌入式开发领域的知识点分类的视觉来谈谈。作者在嵌入式领域有超十年的开发经验,本文也代表作者对嵌入式领域的大体见解。
1. 体系编程方面
CPU体系代表的是某类CPU家族的体系特性,如ARM体系、MIPS体系、X86体系,而嵌入式开发工程师一般是针对集成各种模块的SOC进行编程。因此这里的体系既包括CPU体系,也包括SOC编程。体系编程应该说是嵌入式领域最基本也是最通用的编程技术要求了。所有嵌入式软件工程师都是从体系编程开始的,如ARM体系编程、MIPS体系编程、51体系编程。
嵌入式体系编程区别于PC(X86)编程的最大特点是,嵌入式的中断控制由工程师自己把握,甚至每行代码都由工程师把握。中断、时钟、GPIO和寻址方式是体系编程的基础。这些模块在所有CPU体系中都存在,不管是ARM,还是51。从系统设计来看,ARM和51在很多模块的核心设计理念上都是一致的,要到芯片的寄存器级才体现出不同。当然设计水平和寄存器的多少、CPU字长、流水线等等都最终影响CPU/SOC的性能和功耗。但对于一般的嵌入式工程师来说,他们面对的体系编程,在原理上可以说都是一致的。
接下来就谈谈不同的地方,ARM一般我们认为是高级处理器,事实上ARM也有进入控制器市场,如热销的STM32。而51仅是控制器。很多初学者认为ARM是认为ARM只代表高级处理器了。高级处理器比控制器性能优越,一般集成功能也比较丰富,如音视频编解码、协处理器等等,但在软件开发来看,本人认为处理器和控制器最大的区别在于高级处理器有MMU(内存管理单元),而控制器没有,或者说它只有固定映射。MMU是通过操作系统如LINUX运行的必备要求,而MMU也意味着系统会配备较为丰富的内存资源,可以支持LINUX等复杂操作系统。在其他方面,处理器和控制器在原理上都是一致的。
2. 嵌入式软件-内核方面
ARM高级处理器可以跑linux,而51可能裸跑,也也可以运行UCOS/RTOS等等。51没有MMU,CPU性能一般,支持不了Linux。
但是,这并不代表51就是低层次的产品。技术是没有贵贱之分、恰到好处才是最好。产品设计最怕技术堆砌了。产品是讲究性价比的,在完成功能和性能的基础上做到尽可能低的成本。ARM高级处理器跑UCOS,就好比奔驰车搭一个马自达的标志。
3. 嵌入式软件-驱动方面
通用驱动方面:KEY、LCD、存储、AD/DA、USB等等。
传感器:温湿度、光敏、加速度、气体传感等等。传感器最重要的是算法,如加速度传感器的计步算法实现等等。
物联网(驱动和应用):蓝牙、WIFI、Zigbee、RFID等无线设备。
文件系统、GUI、协议栈
这些东西跟ARM和51没有直接的关系吧,如果是C语言编程,那在两个平台里面切换时很容易的。所以在这方面,两周也没有高低之分。
4. 嵌入式软件-应用方面
领域开发,跟CPU核没有什么关系,这块是平台无关的。当然,要看应用对底层操作系统的性能要求。像导航应用运算量大,51也撑不起。但对于导航应用开发者来说,他不需要关心底层的CPU核是什么。
当然,对于某些简单的电子产品来说,其没有操作系统或者内核,或者几乎没有分层,像电视的遥控器这种应用,那应用开发的大部分就是红外驱动开发了,其就是平台相关了。
应用跟行业领域相关,各行各业差别很多,例如航空和医疗,各有特点。企业选择应聘者一是看其通用的开发技术水平,再是看是否有相关的行业经验。例如ATM机开发涉及到金融,如果之前有过类似经验的工程师,那过渡会比较快。
另外,嵌入式应用基于应用框架来分类。应用框架的代表是QT框架和android应用框架,这种应用开发可以说跟一般的嵌入式软件都脱离得比较远了,可以说跟PC的客户端软件开发差不多了。由于android智能机(手机/PDA)已经普及,业界已经将android应用开发视为一个单独的岗位需求,但对于QT框架应用开发还是视为嵌入式方面的要求,当然,这个需求量已经很低了。
这个部分讲得更多是嵌入式方面的就业岗位技能方面,跟51/ARM平台关系不大,因为它很多时候都是平台无关的。
5. 真的不可比吗
也不是,总体来讲,51单片机一般适用在相对简单的电子产品,而arm会应用到相对复杂的电子产品。企业里面的嵌入式开发工程师,绝不是仅仅是做体系编程开发,往往是平台相关的驱动开发或者平台无关的应用开发。由于产品所要求的技术的复杂性,基于ARM平台开发的工程师有机会接触到相对复杂的、或者技术难度高一些的模块开发,自然能够积累到更加丰富的经验。从这点来看,这个比较也有一定道理。但是,51平台开发工程师绝不需要为此而感到自卑。产品性价比至少,ARM平台所用到的计算,51平台一定同样会有,笔者之前就基于51平台和MIPS平台进行嵌入式操作系统的架构设计和开发,里面的技术基本是理解了嵌入式Linux的精髓,高度精简移植而来,适用就好。封闭的系统最考究一个人的设计能力,而开源的系统更考究一个人的全面能力。
6. 工具链
工具链是嵌入式工程师的基础要求。姑且将运行时库、混合编程、宏定义、编译链接、汇编语言归类到这个范畴。尤其是链接脚本的定义能够看出一个工程师对一个平台的把握程度。工具链的技巧应用是嵌入式架构师的基础要求。
51平台有51的工具链,而arm平台一般用GCC工具链。GCC工具链有更加丰富的描述语法,熟练运用可以让编码更整洁、更高效。
所以,嵌入式软件工程师应尽可能地提高自己在平台无关领域的软件设计水平和经验,例如内核和下面提到的应用、驱动等方面,而不管自己是在ARM平台上开发还是51平台上开发。
- 嵌入式企鹅圈原创团队由阿里、魅族、nvidia、龙芯、炬力、拓尔思等资深工程师组成。百分百原创,每周两篇,分享嵌入式、Linux、物联网、GPU、Android、自动驾驶等技术。欢迎扫码关注微信公众号:嵌入式企鹅圈,实时推送原创文章!