優化RIL驅動,巧解WinCE電話漏接難題

隨着3G移動電話熱潮的高漲,我公司許多的嵌入式移動產品也正計劃加入無線上網和電話功能。近期,公司委派我負責一個在WinCE 6.0平臺下集成移動電話、無線上網和收發 SMS功能的項目。但沒有想到的是這個項目卻讓我陷入到反覆調試的痛苦之中。
原因是這個在WinCE 6.0平臺下開發的系統經常出現:漏接電話、或有信號但電話無法撥出、或短信收發不正常、或通話自動中斷和通話斷斷續續等問題。初期我懷疑是因爲信號質量 問題所導致,所以花了大量時間和精力在硬件上,如天線和GSM射頻通訊模塊上。但後來卻發現原來是我在Win CE 下沒有進行優化RIL接口驅動所造成的問題。在這裏與大家分享一些在此過程中得到的經驗和教訓。

一.WinCE系統電話漏接的原因分析
在無線移動通訊上,漏接的意思是指機器設備接通了,但機器設備卻沒反應。一般來說,這個故障可能出現在兩個層面:一是GSM射頻通訊基帶部分沒有發出有來 電的消息;二可能是WinCE系統沒有對GSM模塊的來電消息做出響應。
(1)硬件上沒有發出有來電消息
第一種漏接的原因可能是GSM射頻通訊基帶部分沒有發出有來電的消息,這部份主要是因爲GSM硬件上出現了問題,使到系統根本沒有輸入信號。例如,在有信 號的場合下但電話無法撥出時,很可能就是GSM信號質量出現問題。所謂信號質量問題是指在正常情況下接收到的信號強度明顯低於正常標準,這是與GSM射頻 硬件相關的故障。因此,我把時間和精力都集中在天線接收和GSM射頻通訊硬件上,例如更換增強型的天線和使用經測試合格的GSM射頻芯片和基帶處理芯片。 但經過多次硬件調試和更換,卻發現此問題一直存在,後來我決定先排除對GSM硬件可能存在故障的懷疑。
(2)WinCE系統沒有對來電消息做出響應
第二種漏接的原因可能是WinCE系統對來電信號沒有做出響應。後來,經過多次調試,我發現問題還真是出在WinCE 6.0系統的軟件部分。用專業術語的話說,就是在通訊接口層RIL模塊(即Radio Interface Layer,無線接口層)和優先級處理上出了問題。這個RIL層主要是用於溝通WinCE系統與GSM通訊模塊,並且對GSM通訊模塊的行爲做出適當的響 應與動作,例如啓動數據連接、發送 SMS 消息等。換句話說就是,當問題出在WinCE軟件模塊時,就算GSM信號強度提高了,該漏接的還是會漏接,該掛斷的還是會掛斷。



二.WinCE 6.0 RIL接口驅動詳細分析

  (1)WinCE 6.0新加入的電話功能
一般來說,要在基於WinCE平臺的產品上具備無線通訊功能(如撥號上網、撥打電話、收發短信)的方法有兩種:一是選擇讓用戶外接手機模塊;二是在嵌入式 產品上集成手機模塊。如果是外接手機模塊,那麼手機只是起到在上網瀏覽期間接收和發送數據的作用,而如果是嵌入式設備自身集成手機模塊,那麼就可以很方便 的實現無線通訊的全部功能。
因此,爲了實現嵌入式設備更好的增加無線通信功能,WinCE 6.0 提供了連接移動電話網絡所需的接口函數。例如,WinCE 6.0 提供了cellcore.dll組件,這個動態鏈接庫擴展了 Win32 API函數,其作用是用以支持各種移動電話服務,例如啓動數據連接、發送 SMS 消息等。另一個重要組件是無線接口層 RIL驅動程序 ril.dll。該組件爲應用層與移動電話硬件的連接提供了低級別接口。在早先幾個版本的WinCE是不支持直接撥打電話和發送 SMS文本消息的。因此,在以前要想在WinCE上構建移動電話,OEM廠商就必須開發自己的接口層,然而這並非易事。現在有了這個RIL接口,要想在 WinCE平臺上構建移動電話程序,就不用OEM廠商再自己開發相應的接口層了,這一功能也大大激發OEM廠商在WinCE平臺上構建移動電話程序的熱 潮。
(2)什麼是RIL(Radio Interface Layer)組件?
在WinCE 6.0新加的RIL無線接口層組件原本是Windows Mobile裏的,它的主要工作爲連接WinCE操作系統和電話模塊,RIL的主要作用是用於維護和關聯無線GSM通訊模塊的狀態和事件消息。微軟的幫助 手冊是這樣介紹RIL的,作爲無線通訊的一個非常重要的組件,RIL使各種無線語音和數據應用成爲可能,也使到運行在WinCE 6.0上的軟件可以通過RIL無縫地與GSM/GPRS或者CDMA2000 1X modem通信。RIL的位置是處於GSM無線基帶系統的協議棧之上,而在WinCE系統的CellCore層之下。RIL跟上層通訊主要採用兩種方式, 一種是通過Socket發送與接收消息的方式來實現,還有另外一種方式是通過TCP/IP直接訪問內核中的shared memory,進行RPC調用,這種方式主要應用在數據模式上。因此,RIL組件能隱藏GSM無線基帶硬件上的一些細節,也就使到OEM廠商可以根據自己 的需要將不同型號的無線modem集成到它們的產品之中。
簡單的說,就是隻要採用了RIL驅動模塊和底層的GSM通訊模塊,WinCE系統就具有了移動電話的功能。一是因爲RIL提供了語音、數據、SMS短信、 SIM卡管理以及STK應用的功能,也包括了EXTAPI、拔號盤等移動電話的其它功能。二是因爲從軟件的角度來看,RIL工作在PPP、TCP/IP協 議之下,能把AT命令的發送以及Response響應的解析,也能把數據可靠的傳輸。而且,除了對網絡協議的支持,RIL也支持SMS、Voice Call等功能。
(3)RIL驅動程序的結構解析
從RIL組件的功能我們可知,開發一個移動電話的設計起點,是需要有效的進行RIL驅動程序的開發。因爲RIL驅動程序爲應用程序提供無線通信相關的服 務,包括呼叫控制、短消息、GPRS等功能。而且對於上層應用程序來說,也可以抽象地把RIL驅動程序看作邏輯設備,它只需要和RIL驅動程序通信就能夠 獲得所需要的服務。因此,RIL接口層驅動可以按照流驅動Stream I/O的規範來設計,這樣做的好處是應用程序可以把設備看作文件,通過文件接口來訪問RIL。
在WinCE系統中,一個加載式驅動程序通常會被分成與硬件相關的PDD層和與硬件無關的MDD層兩部分。MDD實現的是和平臺無關的功能,它描述了一個 通用的驅動程序框架,而PDD是和硬件以及平臺相關的代碼組成。MDD會調用PDD中特定的接口來獲取硬件相關的信息。因此,在使用層次型驅動的時候,一 般只需要基於相近的樣列驅動程序,針對特定的硬件只修改PDD程序,MDD建立的框架可繼續使用。
在根據微軟幫助手冊的建議,RIL 驅動程序的基本框架最好是採用MDD+PDD結構。一般來說,微軟在WinCE中提供了很多通用驅動程序的MDD樣本,所以關鍵在於調試PDD層。因爲不 同的GSM/GPRS通訊模塊,其PDD層的實現是不一樣的。例如,層次模型RIL_XXX是提供給DeviceManger的 stream Interface。而在RIL Service這一層,Dispather 會將request code 分發給相應的function,例如SMS短信息發送。然後SMS 的function 會發消息給 RIL Device,目的是爲了請求以AT命令的形式發送給 GSM modem。也就是說,公用的MDD部分已經做好了,現在只需要針對不同的GSM模塊進行不同的PDD驅動開發,這樣就可以大大地提高開發效率了。
(4)WinCE如何通過RIL實現電話功能?
現在我們從WinCE線程的角度來觀察RIL的工作流程。RIL主要包括RIL Stub 和 RIL Driver 兩個部份。RIL Stub 和 RIL Driver 都擁有自己的線程,名爲RILThread。應用程序調用RIL驅動程序的工作流程如下:①應用程序的進程在自己的進程空間裏,以調用RIL Proxy方式發送請求。②RIL Proxy 以IPC方式把請求傳給 Device Manager。③Device Mananger 根據操作碼,將請求分發到相應的RIL驅動程序。④RIL Stub接收到操作碼後根據PID做Context切換,然後把請求轉發給RIL Driver。⑤最後,對應於用戶進程Context中的RIL Driver會開始處理操作碼。例如,RIL Driver將AT命令發給GSM modem,然後等待返回的response。
因此,從以上的工作流程來看,RIL驅動模塊性能的好壞會直接影響着所有無線通信應用相關的軟件,而驅動程序設計是否經過優化又影響着RIL驅動程序的性 能。

三.優先級處理時需要注意的要點
(1)什麼是優先級處理問題?
一般來說,WinCE系統上的移動電話設計並沒有像Symbian一樣針對電話做過優化,甚至根本沒考慮到GSM通訊模塊的特殊性,而僅僅是把它當作一個 可以擴展的硬件模塊。也就是說,GSM通訊模塊和普通硬件模塊的優先級是一樣的。因此,連接GSM通訊模塊的RIL作爲一個驅動和其它驅動是平等的搶奪 CPU週期,或平等的被調度,甚至在優先級上都是一樣的。但是,GSM通訊模塊和其它擴展硬件又有幾點很大的差別:一是它需要WinCE系統對某些通訊事 件進行足夠及時的響應;二是某些正在進行的通訊任務必須不得被搶佔,至少不得被長時間掛起,這點有些類似於實時系統的要求。
正是這樣的優先級處理方式在WinCE平臺下是會導致漏接電話的。例如,在移動電話有來電時,就會發起一個高於RIL驅動優先級的線程,它會在下一個分發 期間拿走CPU處理權,而在它退出之前RIL是無法及時搶回時間片的,因爲WinCE對優先級的處理遠不如Win NT複雜和靈活,因此可能會存在高優先級線程完全控制CPU而導致低優先級線程被餓死的情況發生的,這樣就會“丟失”這一次來電消息,現象就是漏接。或在 通話期間產生了一個高優先級線程,它也會從RIL驅動手裏奪走CPU控制權,從而可能導致通話中途斷開的情況。而且,許多實踐也證實,WinCE系統的通 訊穩定性問題絕大多數都出在優先級處理上,再加上WinCE系統本身在任務調度上也經常會出現BUG,結果使到高優先級的線程經常無法從低優先級手裏拿到 時間片,從而導致優先級系統失效。
(2)優先級處理不當會導致RIL驅動假死
另外,WinCE發生電話漏接現象除了是優先級問題外,還可能是RIL驅動出現“假死”。 因爲很多實踐證明目前大多數RIL驅動“假死”問題,都是由於軟件問題而非硬件問題造成的。實際上,WinCE系統上出現這種問題也不是很奇怪的,因爲出 現“假死”的原因主要是因爲RIL驅動程序的入口點函數、註冊鍵和 GSM模塊沒有進行適當的交互。因爲RIL驅動程序寫得是否很好是因人而異的, 畢竟RIL驅動層是用戶自己定製的, 而非由微軟實現的。
(3)RIL驅動COM串口的佔用問題
在進行RIL驅動端口設計時,許多開發人員常常忽視的一個問題是關於串口的佔用問題。因爲說到底RIL驅動的底層還是用AT來操作的,如發命令、 Response解析等。這是由於GSM模塊Modem的歷史原因所造成的,因爲AP一直是通過基於串口的AT命令與BB交互。包括目前的一些Edge、 或3G模塊、或像omap的AP/BP集成的芯片,它們大多數仍然是使用模擬串口機制來使用AT命令的。再加上串口是不可複用的,所以在應用RIL時一定 要避免串口被佔用。
最後,還需要特別注意的是要避免串口訪問的衝突問題。因爲只要WinCE系統啓動時RIL驅動加載後,就會一直佔用着這個串口,別的應用程序是無法直接訪 問到這個串口的,而無論這個應用程序的優先級有多高
發佈了16 篇原創文章 · 獲贊 0 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章