隨著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 inte***ce layer,無線介面層)和優先順序處理上出了問題。這個ril層主要是用於溝通wince系統與gsm通訊模組,並且對gsm通訊模組的行為做出適當的響應與動作,例如啟動資料連線、傳送 sms 訊息等。換句話說就是,當問題出在wince軟體模組時,就算gsm訊號強度提高了,該漏接的還是會漏接,該結束通話的還是會結束通話。
二.wince 6.0 ril介面驅動詳細分析
因此,為了實現嵌入式裝置更好的增加無線通訊功能,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 inte***ce 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_***是提供給devicemanger的 stream inte***ce。而在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驅動載入後,就會一直占用著這個串列埠,別的應用程式是無法直接訪問到這個串列埠的,而無論這個應用程式的優先順序有多高。
Linux巧解 PATH奧秘
枯燥但精闢安裝linux虛擬機器時設定的 path,當使用putty去執行命令時,系統會自動到 path設定的目錄下去找到這條命令執行 而我們在普通使用者的主目錄或其他目錄下去建立乙個指令碼,賦予指令碼可執行許可權後,按理來說指令碼的名稱就可以作為一條命令執行了,比如說建立了名為greet.sh指令...
GRE數學題巧解
解決gre數學難題兩大巧辦法 最小值代入檢驗法 這是數學部分最重要的解題技巧 顧名思義,這種方法通過代入某乙個值求解,將複雜的問題轉化成簡單易懂的代數式。我們前面說過,gre考試所測試的數學知識不超過初中水平,但ets卻輕而易舉地就能把這些題變難,慣用的手段不是屢設陷阱,就是用晦澀複雜的語言來表達乙...
遞迴方法巧解不定方程
多元一次方程往往採用迴圈求解。筆者在與們討論乙個問題 過程中,琢磨出一種演算法,採用遞迴進行多元一次方程的求解。並將解分為整數解和 非負整數解兩種情況,請大家指教。private sub command1 click 演示求x1 x2 x3 x4 x5 10整數解 text1.text dim an...