作者:乾坤一笑
本文选自VC知识库博客园 一笑聊斋
“嵌入式”是个很火的名词,“嵌入式”也是个很大的话题。我之所以转方向从事嵌入式开发,不仅是看中了它的市场价值(及由此影响到的开发人员的薪水),更重要的是嵌入式开发对开发人员的全方位的素质要求。对于技术人员来说,这种全面的压力是很刺激的,工作也很有激情,嘿嘿。
如果把一个嵌入式产品的开发模块大概划分一下层次,大概是下图这样子的:
MMI(Man Machine Interface)
| |
UI(User Interface)
|
协议
|
驱动程序
| |
操作系统、监控程序
| |
电气元件、电路板
|
做MMI的,有时候可能比Windows开发还容易些。因为用到的类库、函数库、API函数要比Windows开发要少许多,比较容易全面掌握(从事Windows开发有可能做了2~3年了还摸不清到底有多少个Windows API)。MMI毕竟属于嵌入式开发,它有它自己独特的难度:基本上没有IDE环境——很少能够用上VC6之类的IDE——往往是一个编辑器加上命令行编译器了事,排错比较难。所以,用EVC做嵌入式开发的人员自然是嵌入式开发人员中很幸福的一类人了。:)
如果选择了做驱动层,那么可就任重而道远了——它的全面性体现在硬件知识、软件知识、综合技能、外语能力。本文也主要想探讨一下这个方面,只当是对我半年的工作做一个总结,同时也对今后的学习方向做一个规划。
写驱动程序必须了解硬件机理。与PC机的驱动程序开发不同的是,PC上的驱动程序开发一般主要需要PC上装的操作系统的实现和要做驱动的那个外设的硬件构成;而作嵌入式驱动开发很多是没有操作系统的,很多只有一套简单的监控程序,所以需要了解整个板子的硬件构成。这就要求你最起码的几门功课要过关:电路基础、模拟电路技术、数字电路技术。这只是个起步,之后呢,如果做控制类的板子肯定要懂自动控制原理、现代控制理论,如果做通讯类的板子肯定要了解通讯原理、高级通讯原理、信号调制方面的知识,其中知识的复杂不是两三年能搞定的。据个例子说,做手机驱动的如果连直流漂移都不知道,肯定看不懂硬件资料,能写出来代码才怪呢。
驱动程序是小而精的程序,它要求对数据结构、算法、构架、编译原理各个方面都有深入了解和丰富的实践经验。如果做复杂的带有操作系统的板子,那么肯定还要了解操作系统的内存管理、线程调度等知识。虽然PC机的开发上有很多常用算法模块已经有很优化实现,但是这些代码往往不能直接套用在嵌入式设备的代码里,原因可能因为这段代码太大、太全、或者不符合项目的要求。嵌入式设备的RAM很小,因此我们编写代码必须仔细把握大小,甚至要关注到Byte级。嵌入式系统承受不了很多冗余的代码,所以很多常用算法都没有现成合适的函数库,需要你重新实现,根据硬件有针对性的重新编写。因此,精湛的编码技术、周密的代码规划都是必备的基本功。
当然最为重要的还是综合能力。比如一串口程序握手时出现错误失败了,原因可能有很多:线断了?接头脱焊了?程序有问题?芯片中代码有问题?等等等等。要做出判断很难。这时候我们就应该具备审查入微的能力,要能仔细判断出问题出在那,或者给出若干种Debug问题的方案逐个去突破。一般来说,我认为在开发过程中用脚本来辅助开发是一种效率很高的手段,比如windows下的wsh或者linux的shell script都能够用来辅助代码的生成,或者用于构建自动测试环境。另外,由于做的很底层,技术很前卫,所以很多情况下我们手头上只有一些硬件的电气资料,或者有一大篇别人编写好的代码去参考。这时候,自学很重要,独立分析别人代码的能力也很重要。诸如SlickEdit、SourceInsight之类的辅助分析工具一定要熟练运用才行。(不过,幸好这些东东看看联机帮助就能搞定了,并不复杂)
整个研发中最最需要必备的能力就是外语能力了,尤其是英文。因为几乎所有的硬件资料都是纯英文的,等待别人翻译成中文根本不可能(翻译出来估计也都过时了),甚至有些是硬件厂商提供的绝密资料,能指望谁翻译去?我觉得外语能力也是我今后最需要加强的,至少应该以下4点:1) 不借助词典能够基本看懂英文技术文档;2) 老外开讲座的时候能够跟得上并随手做笔记;3) 用英文写工作总结轻松自如,写代码注释表述精确无误;4)和老外电话或者当面聊天很顺当。:) 这个要求确实有点难做到,不过必须做到,否则就是技术进步的绊脚石了。
好了,罗嗦了半天,说的也很片面。全当是自我总结,也希望对学弟、学妹们有点用,嘿嘿。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=527752