WinCE驅動開發問題精華集錦 二

2021-04-22 10:56:15 字數 4676 閱讀 4493

我怎麼能在pb左邊的定製平台加進我的驅動呢?

兩種辦法:

1、在platform.bib或者project.bib的modules部分新增一條語句,例如:

mydriver.dll        c:/driver/mydriver.dll                      nk sh

這樣編譯核心的時候就會把你的驅動dll檔案新增到核心中,如果有登錄檔需要設定,在platform.reg或者project.reg中新增登錄檔內容。

2、通過製作.cec檔案來新增驅動,製作.cec檔案的優點是只需製作一次,以後就可以通過將.cec檔案匯入到pb的catalog中,象pb自帶的feature一樣通過選單「add to os design」新增到左邊的核心工程中。

wince有沒有相對路徑概念?如果沒有如何得到當前模組的路徑?

1、wince沒有相對路徑概念,只有絕對路徑,所以凡是涉及到路徑均為絕對路徑。

2、呼叫api getmodulefilename,傳遞乙個模組的例項控制代碼就能夠得到模組的絕對路徑。

怎樣讓 pocket word開啟*.dat格式(裡面都是資料)的檔案?  

兩種辦法:

1、呼叫api shellexecuteex,在結構體shellexecuteinfo中新增.dat檔案的路徑。

2、呼叫api createprocess,在第二個引數中設定.dat檔案的路徑。

x86 rom boot loader真的可以實現嗎?它確實能代替bios啟動計算機?  

對於x86 rom boot loader,如何build得到romboot.rom?

1、在pb中開啟乙個核心工程(x86的) 2、單擊pb選單「build」-「open build release directory」 3、用cd命令進入 %_winceroot%/platform/geode/romboot 4、build

如何設定、更改顯示解析度

能否設定、更改顯示解析度由顯示驅動程式決定,而沒有統一的標準。例如cepc,在啟動的時候可以通過設定loadcepc.exe的引數 /l來決定 wince啟動後的顯示解析度,這是由於顯示驅動「vga linear framebuffer」支援,而geode可以通過在定製核心時修改登錄檔項來決定wince啟動後的顯示解析度。

幾個硬體使用同乙個irq,那麼發生中斷的時候系統怎麼判斷到底是哪乙個硬體發生的中斷呢?isr裡面又應該怎麼控制呢?

windows ce 支援多個裝置中斷共享乙個irq,當乙個共享irq發生時,ce核心的異常處理程式檢測裝置特定的暫存器,因為大多數裝置都有乙個單獨的暫存器用於表示設 備的活動狀態,所以通過遍歷共享這個irq的所有裝置的暫存器就可以判斷哪個裝置發生中斷。nk.exe載入乙個giisr.dll,這個.dll是微軟 提供的,它其實是第乙個可安裝isr。預設ce核心就是呼叫這個dll來檢測暫存器狀態的,當然oem可以編寫自己的.dll。

ce內部有乙個isr鏈,也就是可安裝isr。因為ce允許oem新增自己的isr處理程式,所以isr被設計成乙個鍊錶。排在前面的isr比後面的 isr優先處理中斷,如果當前isr能夠處理當前中斷,那就返回中斷id由ist處理或者返回sysintr_nop,如果當前isr不能夠處理當前中 斷,那就返回 sysintr_chain讓下乙個isr處理。

請問在wince中如何在核心中增加乙個與/windows同級的目錄?

在platform.dat或者project.dat中新增語句。例如要建立根目錄下子目錄program files,語句如下:

root:-directory("program files")   

檔案格式如下所示,我想把每行的4個值讀到4個變數中,用evc如何程式設計?

第一行: 460.000,   3384672.357342,   521268.972763

第二行: 475.117,   3384663.772419,   521281.415271

偽**如下:

file   *stream;

stream = _wfopen(l"//a.txt", l"r+");

if( stream == null )

return;

fseek(stream, 0l, seek_set );

while( !feof( stream ) )

fclose( stream );

gwes元件的功能有哪些?

gwes不僅負責gdi、視窗、訊息,還負責管理本機裝置驅動程式,負責載入顯示、鍵盤滑鼠、觸控螢幕驅動程式,而且gwes本身包含電源、led驅動程式。

如何在pb中預先設定好儲存記憶體和程式記憶體的大小,我想多劃分一些空間給程式記憶體?  

兩種辦法:

1、在定製核心時在config.bib檔案中設定fsrampercent = number,具體number可參考標題為「fsrampercent 」的幫助文件。這種辦法是修改核心的設定,所有一直有效。

2、在應用程式中呼叫api setsystemmemorydivision,如果函式返回sysmem_changed表示成功,如果返回sysmem_mustreboot表示需要熱啟動才能有效。這種辦法需要每次啟動後呼叫api才有效。

如何取消滑鼠游標?

通過取消sys變數來實現此目的,在pb命令列下鍵入「set sysgen_cursor=」,然後回車確認。

evc下呼叫textout如何編譯會出錯?

類似這樣的問題很多,這是因為evc的幫助文件內容有錯誤。可能evc的幫助文件內容是從桌面windows幫助文件複製過來的,所以很多api函式還有 例子**都有錯誤,例如幫助文件中包含乙個api函式的說明,但是實際編譯的時候提示沒有這個api,有的例子**採用ansi字串,而wince的 api都是寬字元版本,造成直接複製過來編譯失敗。

因為mfc for wince的cdc類中沒有textout成員函式,所以編譯會出錯,可以用其它類成員函式exttextout或者drawtext替換。

我如何將我的dll軟體讓現有的ce系統認可?儘管我也知道應該使用signfile.exe程式進行簽名,但是我並不知道那個ce系統認可的簽名應該是啥

如果你說的wince系統核心已經加入了簽名認證機制,那麼沒有私鑰對你的dll檔案簽名肯定是無法執行在此核心中的,一般簽名金鑰的金鑰長度都是1024位,很難破解。

如果檢視wince登錄檔中的內容?

兩種辦法:

1、建立同步後,用evc自帶的工具「remote registry editor」開啟檢視。

呼叫directshow出現鏈結錯誤,如何解決?  

player.obj : error lnk2001: unresolved external symbol _iid_ivideowindow

player.obj : error lnk2001: unresolved external symbol _iid_imediacontrol

1、在evc選單tools—options—directories 裡把library files的路徑重新調整一下。如果你只安裝了evc自帶的 standard sdk而沒有其它sdk,可以指定wince目錄中的.lib檔案路徑,例如d:/wince500/public/directx/ oak/lib/x86/retail。注意cpu的型別。

2、安裝sdk,前提是匯出sdk的pb核心工程必須包括directshow或者其它元件。

在pb的config.bib檔案中,「imgflash」表示什麼意思呢?

表示能夠刷nk到rom中,具體請檢視標題為「img environment variables」的幫助文件。

x86平台如何對映各種位址空間?如何編寫中斷服務例程?

如果是x86平台,可以呼叫haltranslatebusaddress轉換物理匯流排位址到物理系統位址,呼叫 haltranslatesystemaddress轉換物理系統位址到邏輯匯流排位址,也可以不呼叫這兩個函式,因為x86平台除32位實體地址外還有 16位的io位址空間,對於16位的io位址空間,可以直接呼叫write_port_uchar或者read_port_uchar等函式直接讀寫端 口。對於32位實體地址可以呼叫virtualalloc和virtualcopy來對映。這樣做思路清晰,簡單明瞭。

在x86平台要實現isr,有如下幾個步驟(以geode bsp為例):

1、用setup_interrupt_map巨集關聯sysintr和irq。以「sysintr_」為字首的常量由核心使用,用於唯一標識發生中斷的硬 件,又稱為中斷id。在nkintr.h檔案中預定義了一些sysintr,oem可以在oalintr.h檔案中自定義sysintr。

2、用hookinterrupt函式關聯硬體中斷號和isr。這裡提到的硬體中斷號為物理中斷號,irq為邏輯中斷號。在initpics函式的最後呼叫了hookinterrupt函式,如下:

for (i = 64; i < 80; i++)

hookinterrupt(i, (void *)perpisr);   ///用isr關聯16個中斷號  

3、呼叫interruptinitialize函式關聯sysintr和ist建立的事件物件,也是ist等待的事件物件。詳細內容請參考geode bsp原始碼。

在x86 平台要實現可安裝isr,先呼叫loadintchainhandler函式註冊在登錄檔中指定的isr dll,然後填充giisr_info結構體並呼叫kernellibiocontrol函式將此結構體傳遞給可安裝isr。詳細內容請參考wince幫 助文件或者我著的《windows ce下驅動開發基礎》。

WinCE 開發問題精華集錦 Part2

如何在不刪除必要元件的前提下減小核心檔案長度?要減小核心檔案長度首先要在使用pb的定製核心嚮導中選擇自定義,也就是說對於每個元件都由自己來選擇,而不是選擇pb的標準配置。但減小核心檔案長度最有效最直接的辦法是縮小字型,尤其對於東亞字型,採用字型壓縮技術並且選擇合理的字型檔檔案將明顯縮小檔案長度。1 ...

wince藍芽開發問題

1 搜尋指定裝置時總失敗 調查發現,bthnslookupservicenext,指定第二個引數lup return name lup return addr指定,函式執行成功後裝置名字為空,通過呼叫bthremotenamequery還可以獲得裝置名字,原因未知 2 配對總失敗 配對過程掉用bth...

iOS 開發問題集錦(一)

最近在qq群裡好多人問一些比較基礎的問題,在這羅列一下 1 鍵盤上的斜槓鍵壞掉了,怎麼樣用快捷鍵進行注釋呢?首先在xcode中注釋的預設快捷鍵為 command 其次可以自行修改快捷鍵 xcode preferences.key bindings,如下圖 2 xcode中的導航區域關閉了,如何調出來...