巴黎的灯光下 发表于 2019-1-29 16:22:18

谈谈我做嵌入式系统开发的心得

本帖最后由 巴黎的灯光下 于 2019-1-29 16:23 编辑

己从事嵌入式系统开发有好多年了,在此想与大家分享我对于嵌入式开发的一点心得与体会。

先大致说一说我的工作经历。97年毕业后做了两年的电气与电子设计与开发,这一时期,我做过电路原理图的设计和PCB板的设计。从99年开始,我进入了软件行业。第一次做嵌入式开发是在2000年,在随后的六年多的时间里,我差不多做过整个操作系统的组件。一开始用的是uC/OS RTOS,熟悉它的人知道,它是一个微内核,提供了任务的调度、Mutex、Semaphore等基本的功能,但是像TCP协议栈、文件系统、堆管理(指malloc/和free)这些功能都没有,当然也包括没有相应的硬件驱动模块,如PCI、串口、I2C、IDE硬盘等。第一次做的这个产品是一个DVR(Digital Video Recorder),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的滑动窗口的调试以及校验和的调试花了不少时间。
可以说这一时期的工作,使得我对于操作系统的原理和实现非常的熟悉。还有,我在这一公司使用过了逻辑分析仪去分析总线信号以解决问题,这些都是非常好的经历,都有助于提升对计算机系统的理解。

2003年我加入了UTStarcom,因为前一个项目的经历,当时进这一公司时觉得自己很牛。但很快我发现,嵌入式系统中还有很多是我要学的,我还嫩呢。比如:

1) 第一个挑战是处理器,当时用的是PowerPC8250。对于处理器,我花了不少时间去读相关的资料。总的加起来,其手册超过两千页,而且还是英文的。为了使得自己更加的熟悉这块处理器,我前前后后对这些资料完整的读了三四遍。

2) 当时采用的是RTEMS操作系统,这一系统就是一个类UNIX的操作系统,早期是美国_军方使用的,后来变成了开源项目。在这一操作系统上的工作经历让我一下子意识到了自己的一个问题,那就是:以前的工作只是技术性的不具备系统性。比如,如何将一个操作系统作为一个系统将其设计得更好、驱动程序如何方便增加以及扩展,等等。这一切说到底是自己的设计能力还是不足。我花了很长的时间来研究RTEMS操作系统的实现,这对于提升自己的设计能力有很大的帮助。

3) 对于编译器和C语言的理解不深。比如什么是ABI(Application Binary Interface)?后来知道Stack Frame和程序的调用栈的管理都与ABI有关系。
在UTStarcom工作的初期,所有与操作系统相关的问题都是由我来解决的。此外,在我的经理的支持下,我还做过了一个更新版本RTEMS操作系统的移植,当时,UTStarcom的RTEMS操作系统的移植是在新泽西完成的,我不知我是不是UTStarcom在中国第一个做这个操作系统移植的。当时,我在做移植时还碰到了一个与编译器相关的问题,还找过WindRiver做支持。因为我们用的是WindRiver的调试器,当时怀疑是调试器有问题,最后发现是RTEMS的Tool Chain有Bug。UTStarcom的中期,我们将我们的应用程序移植到了VxWorks上,所以后来我对于VxWorks也很熟悉。后来还做过了一个ADSL接入的项目,采用的还是VxWorks以及PNE(Platform for Network Equipment),处理器用的是Intel的XScale IXP425。2006年5月我离开了UTStarcom。

应当说,前面两个公司工作经历是我很宝贵的财富。一方面完成了从小公司到大公司的转变,说实在的在进UTStarcom时,还是很有压力的。什么都是新的,新的行业、新的产品,当然对于我来说是直接工作内容的变化,新的处理器、新的操作系统、等。前两个公司有一个工作情景我一直很怀念,那就是:我是一手拿示波器,一手拿电路原理图进行软件调试的。

好了说了这么多,现在我想说说我对于嵌入式系统开发的感受和看法。在此,我想先说说什么是嵌入式开发,这一点我看过不少对其的定义。先抛开别人的定义,我想说说我的观点。有不少工程师的工作是写运行在RTOS之上的应用程序的,但他(她)其实根本不用接触硬件相关的知识、不用接触什么是中断、也不用考虑任务的优先级,对于这些工作我不认为是嵌入式开发,其实,说到底只是采用了新的一套API(即RTOS的相关函数)进行编程。嵌入式开发我认为至少要与硬件和RTOS打交道,对一操作系统的原理和实现很清楚。从我的角度来看,如果一个写驱动的人只知道驱动相关的内容,而对于操作系统的机理并不是很清楚,那也不能算是嵌入式系统开发,就是驱动开发。下面是我对于嵌入式系统开发的一些看法。

1) 嵌入式开发对于提升我们的系统知识有很大的帮助,尤其是操作系统的知识。嵌入式系统开发对于我们的知识面要求非常的广,且要有一定的深度。在做嵌入式开发之前,我是做Visual C++开发的,当我做过嵌入式开发后,我就能明白在Windows桌面上双击鼠标时,后台有什么事情发生了。比如,我能想到后面有一个Loader将文件加载到内存,并最终运行程序。虽然,没有做过嵌入式开发也能想到这一点,但能看到的深度是不同的。

2) 当我们对于操作系统的原理和实现非常熟悉后,嵌入式系统开发的工作相对简单。因为,操作系统的概念已经很成熟了,而现在的嵌入式系统就是将现代操作系统的技术运用到嵌入式系统。这里说的简单,主要是强调其需求相对的稳定、功能相对的单一。软件设计真正复杂是做应用,应用开发是我们真正能发挥设计能力的地方。

3) 嵌入式系统开发经验对于提升我们解决问题的能力有及大的帮助。因为我们系统性的知道了软件是如何被组织在CPU上运行的,这对于我们分析和解决问题很有意义,对于自己解决复杂问题的信心也很有帮助。

4) 具备一定的硬件知识对于嵌入式开发大有裨益。比如,我们要明白什么是片选,什么是3态,什么是I/O,如何看时序图等等。最好还得会使用相关仪器,比如示波器、逻辑分析仪。

最后,我想说的是嵌入式系统开发一旦我们达到了一定的水平后,其实很简单,就是如何去看CPU和相关芯片的Datasheet!
学习有好方法,但没有速成、没有灵丹妙药,不爱好这行很难学习好。
看那些培训机构鼓吹,学linux驱动就是高级了,移植wince就如何如何了。这些乱糟糟的信息把初学者鼓动的很是浮躁,越来越多的不学无术,越来越多的口水仗,真的让人很崩溃。

还是从底层开始,51+汇编一步步学起,要知道计算机发展这么多年,始终跳不出那个框框,没有结构性的变化,而嵌入式处理器结构一直是慢半拍。

真正像作者说的,搞懂了什么是片选,什么是3态,什么是I/O再去理解软件。看看一个小系统内部组件是如何实现的再去看大中型系统,用起来才更游刃有余。

不过他有一点没有讲,不要瞧不起写应用程序的。写一个优秀的应用程序要比写个串口驱动复杂多了。
离了应用程序,操作系统、文件系统、网络协议都是狗屎。做移植关注点很小,只是一个部分,按照既定的对上接口写就好了,而且有大量的文档可供参考。
而一个应用程序却是从零开始,系统的构架、扩展性、特殊要求的处理,往往是没有东西可供参考的,这才是创造。


也借此帖勉励自己:少上论坛灌水,少看没营养的水贴,静下心,多花些时间在有用的事情上。
戒骄戒躁、珍惜时间、相信美好!
页: [1]
查看完整版本: 谈谈我做嵌入式系统开发的心得