事实上电子技术更新换代非常快,5年前如果你是一名电子设计高手,如果5年中你再没有接触过电子设计,那5年后你就成为一个菜鸟了。做嵌入式一样,并不是越老越吃香,而是看你是否能不断学习新的知识,接受新的技术和设计理念。
虽然如此,我们也可以从老嵌入式开发者学习一些经验。废话不多说,进入正题吧。
我是97年毕业的,做了两年的电子设计与开发,做过电路原理图和PCB板设计。2000年进入软件行业,六年多的时间里,差不多做过整个操作系统的组件。一开始用的是uC/OS RTOS,第一次做的这个产品是一个DVR,CPU用的是AMD的SC520,是一块x86的处理器。因为公司小,所以整个DVR的嵌入式软件就我一个人做,对于我来说是一个 难得的机会和挑战。我所做的包括:
1) 熟悉CPU。x86中存在实模式和保护模式,CPU一上电后进入的是实模式,要进入保护模式则需要做一定的设置,最后做一个长跳转,就能进入保护模式。对 于这一处理器的熟悉和了解,使得我对于处理器有一个很好的认识。此外,明白什么是芯片组、PCI的原理和配置方法、SDRAM如何配置、IDE的 PIO模式是如何工作的,等等。
2) 熟悉uC/OS 。RTOS并对其进行扩展。理解任务是如何实现的、任务是如何被调度的、Mutex和Semaphore是如何实现的、对处理器进行开关中断的目的是什么且 要注意什么,等等。对于RTOS的扩展则包括实现了一个采用malloc/free进行内存分配的堆管理模块,这一管理模块是参照XINU操作系统来实现 的;对任务调度部分进行修改以方便中断服务程序的管理。
3) 将MINUX操作系统的文件系统移植到我们的DVR上。MINUX中采用的就是UNIX中的i-node的方式来管理文件的,这种方式在现在的Linux 中也能看到。由于MINUX的文件系统是针对小型存储设备的,所以对其代码要进行修改,以适应当时所采用的上G的硬盘。
4) 将XINU中的TCP协议栈移植到DVR上。我记得很清楚的是,当时对于TCP的滑动窗口的调试以及校验和的调试花了不少时间。
可以说这一时期的工作,使得我对于操作系统的原理和实现非常的熟悉。还有,我在这一公司使用过了逻辑分析仪去分析总线信号以解决问题,这些都是非常好的经历,都有助于提升对计算机系统的理解。
1) 第一个挑战是处理器,当时用的是PowerPC8250。对于处理器,我花了不少时间去读相关的资料。总的加起来,其手册超过两千页,而且还是英文的。为了使得自己更加的熟悉这块处理器,我前前后后对这些资料完整的读了三四遍。
2) 当时采用的是RTEMS操作系统,这一系统就是一个类UNIX的操作系统,早期是美国军方使用的,后来变成了开源项目。在这一操作系统上的工作经历让我一 下子意识到了自己的一个问题,那就是:以前的工作只是技术性的不具备系统性。比如,如何将一个操作系统作为一个系统将其设计得更好、驱动程序如何方便增加 以及扩展,等等。这一切说到底是自己的设计能力还是不足。我花了很长的时间来研究RTEMS操作系统的实现,这对于提升自己的设计能力有很大的帮助。
3) 对于编译器和C语言的理解不深。比如什么是ABI(Application Binary Interface)?后来知道Stack Frame和程序的调用栈的管理都与ABI有关系。
1) 嵌入式开发对于提升我们的系统知识有很大的帮助,尤其是操作系统的知识。嵌入式系统开发对于我们的知识面要求非常的广,且要有一定的深度。在做嵌入式开发之前,我是做Visual C++开发的,当我做过嵌入式开发后,我就能明白在Windows桌面上双击鼠标时,后台有什么事情发生了。比如,我能想到后面有一个Loader将文件加载到内存,并最终运行程序。虽然,没有做过嵌入式开发也能想到这一点,但能看到的深度是不同的。
2) 当我们对于操作系统的原理和实现非常熟悉后,嵌入式系统开发的工作相对简单。因为,操作系统的概念已经很成熟了,而现在的嵌入式系统就是将现代操作系统的 技术运用到嵌入式系统。这里说的简单,主要是强调其需求相对的稳定、功能相对的单一。软件设计真正复杂是做应用,应用开发是我们真正能发挥设计能力的地方。
3) 嵌入式系统开发经验对于提升我们解决问题的能力有及大的帮助。因为我们系统性的知道了软件是如何被组织在CPU上运行的,这对于我们分析和解决问题很有意义,对于自己解决复杂问题的信心也很有帮助。
4) 具备一定的硬件知识对于嵌入式开发大有裨益。比如,我们要明白什么是片选,什么是3态,什么是I/O,如何看时序图等等。最好还得会使用相关仪器,比如示波器、逻辑分析仪。
单片机
嵌入式
单片机的技术和市场状况
嵌入式的技术和市场状况
嵌入式和单片机的真正区别
嵌入式和单片机的交集
跨界处理器的尴尬
最后