一位嵌入式老工程師分享的技能清單 轉眼間,已經從事嵌入式系統開發有好多年了,今天想與大家分享我對于嵌入式開發的一點心得與體會。 首先大致說一說我的工作經歷。 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! 以下課程可免費試聽C語言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。 想學習的你和我聯系預約就可以免費聽課了。 宋工企鵝號:3524-6590-88 Tel/WX:173--1795--1908 |