嵌入式系統開發經驗談:Windows CE開發都做些什麼

我在博客的個人簡介裏說過我目前在從事基於Windows CE的BSP開發,這方面的文章到現在連一篇都沒寫過,似乎有些說不過去。老闆肯定在犯嘀咕了,這小子不幹正事兒,整天玩什麼外啊掛啊的。接下來,我得整 兩篇。以前我都想把文章寫的跟論文似的,枯吧乾燥,累人累己,以後我就胡亂侃了,一家之言,對不對的湊合着看吧。
Windows CE的文章前面寫過幾篇,看的人不多,可能是因爲搞嵌入式系統相比桌面軟件和WEB開發的人少的多,搞基於Windows CE的嵌入式系統的更少。當然更大的可能是我的文章寫得不好,枯燥,太細節化。
進入現在這家公司之前我一直在做Windows平臺的桌面軟件開發,什麼後臺數據處理、中間件、界面,甚至外掛都做過,對嵌入式系統所知甚少,僅有的記憶 是在本科做畢業設計時玩過的一點兒東西:Windows CE 3.0,還有Motorola的什麼PPSM和DragonBall。硬件方面,不要說USB協議分析儀、硬件仿真器、溫溼度實驗箱這些高級玩意兒,我連 邏輯分析儀、脈衝發生器都沒聽說過;軟件方面,Windows CE長什麼樣子基本上沒概念,嵌入式系統開發包含哪些方面也一無所知。記得面試的筆試題中有一道是讓畫出Windows CE的虛擬內存佈局,我當然不會,就按照自己對XP的理解畫了一個(不過回過頭來看,我當時畫的可是現在新鮮出爐的CE6的內存佈局啊,哈哈)。更好笑的 是面談的時候老闆介紹工作內容時頻頻提到BSP一詞,我完全不知道是什麼意思,還虛心請教了一把。你看我這個嵌入式白癡稀裏糊塗的就這麼搞起了嵌入式開 發,而且還是嵌入式系統的底層開發。
嵌入式系統開發入門難不難,從桌面軟件開發轉入嵌入式系統開發容不容易?我想這可能是很多桌面軟件開發程序員想問的問題,我當年也深受其擾。人在涉及自己 不熟悉的領域時總是感覺不自信,這個很正常。現在這一步跨過去了,回過頭來再看,發現桌面軟件開發也好,嵌入式系統開發也好,其實並無多大區別。有一種說 法講得好:程序=數據+算法。在嵌入式系統裏,數據還是那些數據,算法也還是那些算法,不同的只是細節。有些人說,搞嵌入式系統,要會數字電路、模擬電 路,要學會看原理圖,等等。說實話,這些東西自從大學畢業還給老師後,我到現在也沒學會,沒感覺到有什麼障礙。當然搞懂這些也不是什麼問題,只是我覺得沒 有必要-有專門的硬件工程師負責,何必操這心呢你說是不是。廢話一大堆,我的意思是說,桌面軟件開發和嵌入式系統軟件開發並無太大區別,對於熟手來說互相 轉行很容易。當然,要想做底層開發的話,C/C++熟練是必須的,少數情況下還要懂彙編。老闆可以招一個嵌入式白癡,但肯定不會招C/C++白癡。所幸的 是之前我的C/C++以及彙編能力都還不錯-R/E(逆向工程)搞多了彙編不熟練都不行啊wuhaha。
在我看來,基於Windows CE的嵌入式系統開發(其他的基於通用嵌入式操作系統如VxWorks、Embedded Linux等的軟件開發我想也差不多)可以分成四類。
第一類是應用程序開發。這在Windows CE上幾乎就和桌面Windows沒差別,什麼C runtime/MFC/.NET framework/COM/DCOM/SOCKET/SOAP/SQL/MSMQ全都有,不過好像沒有JRE(Java Runtime Environment),呵呵。所以如果你入了桌面Windows開發的門也就等於入了Windows CE開發的門。
第二類是驅動程序開發。這也容易理解,比如說你們家做網卡的,得給它寫驅動吧。編程語言自然是C/C++。Windows CE下的設備驅動程序和桌面Windows不一樣,不過特簡單,就是普通的運行在用戶態的WIN32 DLL(CE6開始驅動程序也可以運行在覈心態)。所以按我說,CE下的設備驅動程序開發不用入門,你會寫桌面Windows的DLL程序的話CE的驅動 開發就已經入了門。
第三類是CSP(Chipset Support Package)開發。和通用CPU不同的是,嵌入式CPU的芯片上除了CPU核外,一般還會根據CPU的市場定位集成一些外圍電路,比如LCD controller、USB host controller等,所以很多嵌入式CPU如Intel的PXA27x系列其實是SoC(System on Chip)。既然是CPU核加上一些外圍設備(peripherals),CPU廠商就得爲這些外圍設備提供相應的代碼支持,包括完整的驅動程序或操作原 語集(primitives)。這些代碼集合起來就是CSP。
第四類是BSP開發,就是我目前在做的。BSP全稱叫Board Support Package,Board可以理解成PC的主板。一般來說嵌入式系統的主板都是根據產品需要定製的,比如說可能有定製的鍵盤、某個廠商的LAN chip,802.11b/g chip等等,不一而足。BSP的目標是讓嵌入式操作系統能夠在你自己定製的板子上穩定運行,並支持所有你要的外圍設備。具體開發又可以分爲三塊: boot loader、OAL(OEM Adaptation Layer)和設備驅動程序的集成。boot loader相當於PC的BIOS加XP的ntldr(NT loader),負責引導操作系統內核。OAL相當於Windows XP的HAL(硬件抽象層),主要任務是初始化硬件、中斷處理和實現OEM特定的IOCTL(比如數字簽名機制)。最後一塊是設備驅動的集成,注意我這裏 說的是集成不是開發。做BSP開發會接觸到很多類硬件,光CPU的開發者手冊就有上千頁,我目前爲止玩過的外圍設備不完全統計就有:PCMCIA/CF、 USB(包括OHCI、UHCI、EHCI,前兩個是USB 1.1後一個是USB 2.0)、PS/2、LCD controller、SD/SDIO、Flash memory、802.11b/g、I2C、AC97等等。這些硬件規範隨便哪個都有幾百上千頁的,把這些SPEC統統研究一遍再自己寫driver,那 黃花菜都涼了,沒法做,即使做出來也很難保證有Product Quality。所以一般的做法是驅動程序由專門的外圍設備廠商提供,BSP開發者結合具體的板子、參考相關SPEC做一些修改。當然如果你想用FPGA 鼓搗個printer controller,那隻好自己寫驅動了。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章