昨天在《程式員》上看到一篇訪談文章,孟岩就3G手機軟體采訪科泰世紀的陳榕。看了後,第一個感覺就是陳榕沒做過手機軟體。其實“不知為不知”也無所謂,但陳榕扯了一堆“longhorn”、“metedata”,“軟體發展方向要等微軟出手”之類的話,讓我很反感。不由心血來潮,想談一談我所了解的手機軟體。
1 手機軟體的運作環境
1.1 概述
手機可以被看作袖珍的計算機。它有CPU、存儲器(flash、RAM)、輸入輸出裝置(鍵盤、顯示屏、USB、序列槽)。它還有一個更重要的I/O通道,那就是空中接口。手機通過空中接口協定(例如GSM、CDMA、PHS等)和基站通信,既可以傳輸語音、也可以傳輸資料。
手機的CPU一般不是獨立的晶片,而是基帶處理晶片的一個單元,稱作CPU核。基帶處理晶片是手機的核心,它不僅包含CPU核、DSP核這些比較通用的單元,還包含通信協定處理單元。通信協定處理單元和手機協定軟體一起完成空中接口要求的通信功能。
随着晶片技術的不斷發展,越來越多的外圍電路可以被內建到基帶處理晶片中,例如BAP,即基帶模拟處理器。這樣手機才可能越做越小、越做成本越低。
1.2 單CPU和雙CPU
很多手機隻有一個CPU,也就是基帶處理晶片中的CPU核。在這個CPU上既要跑通信協定,又要實作使用者界面(UI)。DSP會分擔一些計算量繁重的工作,例如語音編解碼、安全層的各種算法等。
在市場推動下,手機功能在不斷發展。攝像頭、MP3、藍牙這些功能可以依靠硬體,對CPU的壓力還不是很大,但java虛拟機、嵌入式浏覽器等應用軟體就會對CPU資源有較高的要求。
單CPU的首要任務是完成通信協定。通信協定軟體有着精确的定時要求,如果這個CPU還要兼顧很多應用軟體的話,就難免吃力。于是雙CPU手機應運而生。
顧名思義,雙CPU手機就是有兩個CPU的手機,一個CPU專心把通信協定做好,另一個CPU負責UI、java虛拟機、嵌入式浏覽器等應用。兩個CPU可以做在一個晶片裡面,也可以分開。
市場上的實際情況是,很多手機設計公司(Design House)沒有基帶處理晶片的開發能力,他們購買國外公司的手機子產品,在外面再加一塊CPU。子產品跑通信協定,自己加的CPU跑UI和應用軟體,兩者通過串行口通信。當然,也有很多Design House購買國外方案商的開發闆級方案,自己做PCB,軟體上主要是改改UI和外設驅動。
市場上那些智能手機基本上全是雙CPU方案,什麼Windows CE、SmartPhone、WindowsMobile、Symbian、嵌入式Linux全是運作在第二塊CPU上的。這些商業作業系統無法和無線通信協定軟體內建到一塊CPU上。雙CPU的手機功能豐富,但它們一般體積大,耗電多,成本高。現在市場上的大部分手機還是單CPU的。
目前的大部分手機應用,例如Java、BREW、WAP、郵件、攝像頭、閃存、MP3、藍牙,在單CPU方案裡都能實作。我認為不管3G、4G如何發展,小巧、實用、低成本的單CPU方案總會占據較大的市場佔有率。微軟在單CPU方案的手機市場還沒有立足之地,又怎麼談得上引領方向呢?
本文主要介紹單CPU手機,大多數論述也适用于雙CPU方案的通信部分。
1.3 3G和4G
3G和4G是指第三代、第四代無線通信技術,對手機而言,它們改進的是空中接口的效率,空中接口能以更大的帶寬傳送資料。通過手機無線上網的速度會更快。這和話音業務、手機應用軟體沒有直接的聯系。
當然,手機的嵌入式資料業務由于更高的帶寬,會産生更多的可能。不過這些可能性的實作還是會受到手機輸入慢、顯示屏小等條件的制約。
2 手機軟體的組成
2.1 概述
手機軟體和PC機軟體一樣從中斷向量表開始,因為比較小,看上去更加清晰。中斷向量表的第一個跳轉指令當然是跳到複位的處理程式,後面是中斷處理、錯誤處理的跳轉指令。一上電,手機就跳轉到複位的處理程式,開始檢查記憶體、初始化C運作環境,然後建立第一個任務。這個任務會按順序建立、啟動其它任務。絕大多數手機程式都是多任務的,但也有一些小靈通的協定棧是單任務的,沒有作業系統,它們的主程式輪流調用各個軟體子產品的處理程式,模拟多任務環境。
手機軟體可以粗略地分成啟動子產品、作業系統、協定棧、資料業務、本地存儲、驅動程式、使用者界面和其它應用。啟動子產品前面已經說過了,下面簡單介紹其它部分。
2.2 作業系統
作業系統在手機軟體隻占很小一部分。它的主要功能就是提供多任務排程、通信機制。有的作業系統會提供動态記憶體配置設定,定時函數,但這些都不是必須的。例如需要動态記憶體配置設定的子產品,可以自己管理一個記憶體池,這樣更易于隔離子產品和預測記憶體需求。
大多數手機的作業系統都是一個很小的核心,例如REX、HIOS等。高通REX的源代碼連C代碼加彙編也不過一千多行,編譯後不過是2、3K的代碼量。而完整的手機程式一般總有3、4百個C檔案,超過一百萬行的代碼。
2.3 協定棧
協定棧是手機軟體最複雜的部分,它的複雜性在于它和基帶處理晶片的設計密切相關。隻有具備晶片設計能力的企業才可能開發協定棧。協定棧會使用基帶處理晶片的所有資源、包括DSP核。
2.4 資料業務
資料業務主要有兩種:在前一種,手機相當于一個數據機,PC機通過手機上網,網絡協定全在PC機上,手機提供資料鍊路。另一種是嵌入式資料業務,手機内部包含TCP/IP/PPP等協定,有時還要實作HTTP和嵌入式浏覽器,不需要PC機就可以接入web或wap網絡。
2.5 本地存儲
手機都有本地存儲功能,存儲電話本、短消息、使用者設定等。一般手機都有一個基于flash的檔案系統。早期的手機存儲是基于EEPROM的。
2.6 驅動程式
硬體驅動一般是指外設驅動,但也有一些裝置是內建在基帶處理晶片中的。驅動程式包括:鍵盤、電源管理子產品、LCD、flash、RTC、序列槽、USB、SIM卡或UIM卡、射頻驅動等。
2.7 使用者界面
使用者界面(UI)又稱作人機界面(MMI),它負責和使用者的互動,在必要的時候調用其它子產品的功能。使用者界面處理手機必備功能外,也包含一些相對獨立的應用程式,例如日程表、遊戲等。美工設計也是使用者界面設計的重要環節。
2.8 其它應用
其它應用包括Java虛拟機、WAP浏覽器、郵件軟體等,是一些比較大,又相對獨立的應用子產品。
基本上講完了。大家肯定看得挺沒意思吧。這些程式和微軟的longhorn、metedata有什麼關系呢?手機程式絕大部分是用C語言寫的,有很少的彙編。對于做應用軟體的程式員,要求具備面向對象、設計模式的思維能力,然後用C語言實作出來:)
高通的BREW就是用C語言硬生生地模仿C++,弄出很多奇怪的宏來。一般應用軟體的開發不用這麼死闆,但對各種軟體設計方法的了解還是必要的。
3 手機的核心技術
手機的核心技術是晶片和協定棧,兩者是密不可分的。晶片設計需要協定棧來驗證,協定棧必須充分發揮出晶片的功能。晶片的CPU核、DSP核都可以買到現成的單元,但通信協定部分就需要自己設計了。手機比較難做好的是耗電量、惡劣信号環境的性能等。
4 第三方軟體
4.1 介紹
前面講到的軟體是一個完整程式的各個部分。這些部分被放到一起編譯,産生一個二進制檔案,通過JTAG口(更新時可以用序列槽)下載下傳到手機的flash中。手機一上電,就會從指定位址開始運作。這個位址的内容就是跳轉到複位處理程式的跳轉指令。哈哈,又講回頭了。
第三方軟體是指手機可以通過資料線或者網絡下載下傳一些可執行檔案到檔案系統中。然後有一個裝載器可以裝載、執行這些檔案。這樣第三方就可以開發一些應用程式,下載下傳到手機中來擴充手機功能。
這些可執行檔案現在主要有兩種格式:java程式和BREW程式。java程式需要java虛拟機裝載運作。BREW程式是一個很奇怪的東西,它實際就是用與編譯手機程式相同的編譯器編譯出來的目标代碼。這些目标代碼必須是可以重新定位的,即不能包含全局和靜态變量。
裝載器将程式将執行權傳給給BREW程式,一種聽上去更安全的說法是調用BREW程式的入口函數。這個入口函數的位置在BREW程式中是固定的。裝載器在調用BREW程式的入口函數時會傳入一個位址。通過這個位址,BREW程式能夠順藤摸瓜,找到系統提供的各種API的位址,它通過這些API通路手機的顯示、通信等功能。
java程式基本上是平台無關的,針對各種平台設計的java虛拟機隔離了平台的大部分特性,廠家特意提供的一些OEM功能除外。BREW程式顯然是平台相關,換一個CPU,就不認識原來的目标碼了。
4.2 其它
除了java、BREW外,Windows CE、SmartPhone、WindowsMobile、Symbian、嵌入式Linux這些商業作業系統當然可以提供各種建立第三方程式的方法。在這些環境寫程式和在PC平台寫程式是很相近的,基本上體會不到嵌入式程式設計的特點,隻是螢幕小一些,輸入麻煩一些。
這些第三方軟體不是必需的。手機在3G的市場中隻占了一個較小的部分,網絡是大頭。而第三方軟體相對于手機來說,所占的份額就更小了。
《程式員》有一個嵌入式移動開發的專欄,總在講這些手機第三方軟體的開發的。其實手機軟體隻是嵌入式軟體的一部分。第三方軟體在嵌入式移動開發中又能占到多少比重呢?