一位嵌入式老工程師分享的技能清單 轉(zhuǎn)眼間,已經(jīng)從事嵌入式系統(tǒng)開發(fā)有好多年了,今天想與大家分享我對(duì)于嵌入式開發(fā)的一點(diǎn)心得與體會(huì)。 首先大致說一說我的工作經(jīng)歷。 97年 畢業(yè)后做了兩年的電氣與電子設(shè)計(jì)與開發(fā),這一時(shí)期,我做過電路原理圖的設(shè)計(jì)和PCB板的設(shè)計(jì)。從99年開始,我進(jìn)入了軟件行業(yè)。2000年開始做嵌入式開發(fā)。在隨后的六年多的時(shí)間里,我差不多做過整個(gè)操作系統(tǒng)的組件。一開始用的是uC/OS RTOS,熟悉它的人知道,它是一個(gè)微內(nèi)核,提供了任務(wù)的調(diào)度、Mutex、Semaphore等基本的功能,但是像TCP協(xié)議棧、文件系統(tǒng)、堆管理(指 malloc/和free)這些功能都沒有,當(dāng)然也包括沒有相應(yīng)的硬件驅(qū)動(dòng)模塊,如PCI、串口、I2C、IDE硬盤等。第一次做的這個(gè)產(chǎn)品是一個(gè) DVR(Digital Video Recorder),CPU用的是AMD的SC520,是一塊x86的處理器。因?yàn)楣拘,所以整個(gè)DVR的嵌入式軟件就我一個(gè)人做,這對(duì)于我來說是一個(gè) 難得的機(jī)會(huì)和挑戰(zhàn)。我所做的包括: 1) 熟悉CPU。x86中存在實(shí)模式和保護(hù)模式,CPU一上電后進(jìn)入的是實(shí)模式,要進(jìn)入保護(hù)模式則需要做一定的設(shè)置,最后做一個(gè)長跳轉(zhuǎn),就能進(jìn)入保護(hù)模式。對(duì) 于這一處理器的熟悉和了解,使得我對(duì)于處理器有一個(gè)很好的認(rèn)識(shí)。此外,還得明白什么是芯片組、PCI的原理和配置方法、SDRAM如何配置、IDE的 PIO模式是如何工作的,等等。 2) 熟悉uC/OS RTOS并對(duì)其進(jìn)行擴(kuò)展。理解任務(wù)是如何實(shí)現(xiàn)的、任務(wù)是如何被調(diào)度的、Mutex和Semaphore是如何實(shí)現(xiàn)的、對(duì)處理器進(jìn)行開關(guān)中斷的目的是什么且 要注意什么,等等。對(duì)于RTOS的擴(kuò)展則包括實(shí)現(xiàn)了一個(gè)采用malloc/free進(jìn)行內(nèi)存分配的堆管理模塊,這一管理模塊是參照XINU操作系統(tǒng)來實(shí)現(xiàn) 的;對(duì)任務(wù)調(diào)度部分進(jìn)行修改以方便中斷服務(wù)程序的管理。 3) 將MINUX操作系統(tǒng)的文件系統(tǒng)移植到我們的DVR上。MINUX中采用的就是UNIX中的i-node的方式來管理文件的,這種方式在現(xiàn)在的Linux 中也能看到。由于MINUX的文件系統(tǒng)是針對(duì)小型存儲(chǔ)設(shè)備的,所以對(duì)其代碼要進(jìn)行修改,以適應(yīng)當(dāng)時(shí)所采用的上G的硬盤。 4) 將XINU中的TCP協(xié)議棧移植到DVR上。我記得很清楚的是,當(dāng)時(shí)對(duì)于TCP的滑動(dòng)窗口的調(diào)試以及校驗(yàn)和的調(diào)試花了不少時(shí)間。 可以說這一時(shí)期的工作,使得我對(duì)于操作系統(tǒng)的原理和實(shí)現(xiàn)非常的熟悉。還有,我在這一公司使用過了邏輯分析儀去分析總線信號(hào)以解決問題,這些都是非常好的經(jīng)歷,都有助于提升對(duì)計(jì)算機(jī)系統(tǒng)的理解。 2003年我加入了UTStarcom,因?yàn)榍耙粋(gè)項(xiàng)目的經(jīng)歷,當(dāng)時(shí)進(jìn)這一公司時(shí)覺得自己很牛。但很快我發(fā)現(xiàn),嵌入式系統(tǒng)中還有很多是我要學(xué)的,我還嫩呢。比如: 1) 第一個(gè)挑戰(zhàn)是處理器,當(dāng)時(shí)用的是PowerPC8250。對(duì)于處理器,我花了不少時(shí)間去讀相關(guān)的資料?偟募悠饋恚涫謨(cè)超過兩千頁,而且還是英文的。為了使得自己更加的熟悉這塊處理器,我前前后后對(duì)這些資料完整的讀了三四遍。 2) 當(dāng)時(shí)采用的是RTEMS操作系統(tǒng),這一系統(tǒng)就是一個(gè)類UNIX的操作系統(tǒng),早期是美國軍方使用的,后來變成了開源項(xiàng)目。在這一操作系統(tǒng)上的工作經(jīng)歷讓我一 下子意識(shí)到了自己的一個(gè)問題,那就是:以前的工作只是技術(shù)性的不具備系統(tǒng)性。比如,如何將一個(gè)操作系統(tǒng)作為一個(gè)系統(tǒng)將其設(shè)計(jì)得更好、驅(qū)動(dòng)程序如何方便增加 以及擴(kuò)展,等等。這一切說到底是自己的設(shè)計(jì)能力還是不足。我花了很長的時(shí)間來研究RTEMS操作系統(tǒng)的實(shí)現(xiàn),這對(duì)于提升自己的設(shè)計(jì)能力有很大的幫助。 3) 對(duì)于編譯器和C語言的理解不深。比如什么是ABI(Application Binary Interface)?后來知道Stack Frame和程序的調(diào)用棧的管理都與ABI有關(guān)系。 在 UTStarcom工作的初期,所有與操作系統(tǒng)相關(guān)的問題都是由我來解決的。此外,在我的經(jīng)理的支持下,我還做過了一個(gè)更新版本RTEMS操作系統(tǒng)的移 植,當(dāng)時(shí),UTStarcom的RTEMS操作系統(tǒng)的移植是在新澤西完成的,我不知我是不是UTStarcom在中國第一個(gè)做這個(gè)操作系統(tǒng)移植的。當(dāng)時(shí), 我在做移植時(shí)還碰到了一個(gè)與編譯器相關(guān)的問題,還找過WindRiver做支持。因?yàn)槲覀冇玫氖荳indRiver的調(diào)試器,當(dāng)時(shí)懷疑是調(diào)試器有問題,最 后發(fā)現(xiàn)是RTEMS的Tool Chain有Bug。UTStarcom的中期,我們將我們的應(yīng)用程序移植到了VxWorks上,所以后來我對(duì)于VxWorks也很熟悉。后來還做過了一 個(gè)ADSL接入的項(xiàng)目,采用的還是VxWorks以及PNE(Platform for Network Equipment),處理器用的是Intel的XScale IXP425。2006年5月我離開了UTStarcom。 應(yīng)當(dāng)說,前面兩個(gè)公司工作經(jīng)歷是我很寶貴的財(cái)富。一方面完成了從小公司到大公司的轉(zhuǎn)變,說實(shí)在的在進(jìn)UTStarcom時(shí),還是很有壓力的。什么都是新的,新的行業(yè)、 新的產(chǎn)品,當(dāng)然對(duì)于我來說是直接工作內(nèi)容的變化,新的處理器、新的操作系統(tǒng)、等。前兩個(gè)公司有一個(gè)工作情景我一直很懷念,那就是:我是一手拿示波器,一手 拿電路原理圖進(jìn)行軟件調(diào)試的。 好了說了這么多,現(xiàn)在我想說說我對(duì)于嵌入式系統(tǒng)開發(fā)的感受和看法。在此,我想先說說什么是嵌入式開發(fā),這一點(diǎn)我看過不少對(duì)其的定義。先拋開別人的定義,我想說說我的觀點(diǎn)。有不少工程師的工作是寫運(yùn)行在RTOS之上的應(yīng)用程序的,但他(她)其實(shí)根本不用接觸硬件 相關(guān)的知識(shí)、不用接觸什么是中斷、也不用考慮任務(wù)的優(yōu)先級(jí),對(duì)于這些工作我不認(rèn)為是嵌入式開發(fā),其實(shí),說到底只是采用了新的一套API(即RTOS的相關(guān) 函數(shù))進(jìn)行編程。嵌入式開發(fā)我認(rèn)為至少要與硬件和RTOS打交道,對(duì)一操作系統(tǒng)的原理和實(shí)現(xiàn)很清楚。從我的角度來看,如果一個(gè)寫驅(qū)動(dòng)的人只知道驅(qū)動(dòng)相關(guān)的 內(nèi)容,而對(duì)于操作系統(tǒng)的機(jī)理并不是很清楚,那也不能算是嵌入式系統(tǒng)開發(fā),就是驅(qū)動(dòng)開發(fā)。下面是我對(duì)于嵌入式系統(tǒng)開發(fā)的一些看法。 1) 嵌入式開發(fā)對(duì)于提升我們的系統(tǒng)知識(shí)有很大的幫助,尤其是操作系統(tǒng)的知識(shí)。嵌入式系統(tǒng)開發(fā)對(duì)于我們的知識(shí)面要求非常的廣,且要有一定的深度。在做嵌入式開發(fā)之前,我是做Visual C++開發(fā)的,當(dāng)我做過嵌入式開發(fā)后,我就能明白在Windows桌面上雙擊鼠標(biāo)時(shí),后臺(tái)有什么事情發(fā)生了。比如,我能想到后面有一個(gè)Loader將文件加載到內(nèi)存,并最終運(yùn)行程序。雖然,沒有做過嵌入式開發(fā)也能想到這一點(diǎn),但能看到的深度是不同的。 2) 當(dāng)我們對(duì)于操作系統(tǒng)的原理和實(shí)現(xiàn)非常熟悉后,嵌入式系統(tǒng)開發(fā)的工作相對(duì)簡單。因?yàn),操作系統(tǒng)的概念已經(jīng)很成熟了,而現(xiàn)在的嵌入式系統(tǒng)就是將現(xiàn)代操作系統(tǒng)的 技術(shù)運(yùn)用到嵌入式系統(tǒng)。這里說的簡單,主要是強(qiáng)調(diào)其需求相對(duì)的穩(wěn)定、功能相對(duì)的單一。軟件設(shè)計(jì)真正復(fù)雜是做應(yīng)用,應(yīng)用開發(fā)是我們真正能發(fā)揮設(shè)計(jì)能力的地方。 3) 嵌入式系統(tǒng)開發(fā)經(jīng)驗(yàn)對(duì)于提升我們解決問題的能力有及大的幫助。因?yàn)槲覀兿到y(tǒng)性的知道了軟件是如何被組織在CPU上運(yùn)行的,這對(duì)于我們分析和解決問題很有意義,對(duì)于自己解決復(fù)雜問題的信心也很有幫助。 4) 具備一定的硬件知識(shí)對(duì)于嵌入式開發(fā)大有裨益。比如,我們要明白什么是片選,什么是3態(tài),什么是I/O,如何看時(shí)序圖等等。最好還得會(huì)使用相關(guān)儀器,比如示波器、邏輯分析儀。 最后,我想說的是嵌入式系統(tǒng)開發(fā)一旦我們達(dá)到了一定的水平后,其實(shí)很簡單,就是如何去看CPU和相關(guān)芯片的Datasheet! 以下課程可免費(fèi)試聽C語言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。 想學(xué)習(xí)的你和我聯(lián)系預(yù)約就可以免費(fèi)聽課了。 宋工企鵝號(hào):3524-6590-88 Tel/WX:173--1795--1908 |