閱讀400 返回首頁    go 技術社區[雲棲]


嵌入式軟件開發之我見

自己從事嵌入式係統開發有好多年了,在此想與大家分享我對於嵌入式開發的一點心得與體會。
 
先大致說一說我的工作經曆。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!

最後更新:2017-04-02 15:15:21

  上一篇:go 為Android視圖添加徽章:Android ViewBadger
  下一篇:go APU及異構計算應用趨勢論壇在京舉行