❶ 在wince怎樣啟動自啟動自己寫的程序
1、注冊表
1.配置project.bib或者添加User Feature,以將<你的程序>含入NK.bin
請參考《讓程序在Windows CE系統啟雹培清動時自動運行-快捷方式》
2.配置platform.reg或者common.reg,在[HKEY_LOCAL_MACHINEinit]段添加如下類似內容:
"LaunchXX"="<你的程序>"
"DependXX"=hex:YY,ZZ,...
其中XX是十進制的數字,表示<你的程序>的啟動順序標識;YY,ZZ是Least Significant的十六進制數字,表示<你的程序>所依賴(先於<你的程序>運行)的程序的啟動順序標識。
例如:
"Launch80"="MyApp.exe"
"Depend80"=hex:1E,00
語意為程序MyApp.exe的啟動順序標識是80,它依賴標識為30(即001E)的程序。
如果<你的程序>不依賴其他程序,那麼不需要添加"DependXX"=hex:YY,zz,...指示;
如果<你的程序>依賴多個程序,那麼在"DependXX"指示中指明;
eg.
"Launch80"="MyApp.exe"
"Depend80"=hex:0A,00,1E,00
語意為MyApp.exe程序的啟動依賴標識為10和30的程序。
3.PlatformBuilder IDE->Build->MakeImage,生成新的NK.bin
說明:
1.如果<你的程序>是別的程序所依賴的程序,那麼在<你的程序>的代碼中需要添加如下代碼
SignalStarted(XX);
以通告操作系統<你的程序>已經運行,否則依賴<你的程序>的程序將不會運行。
一般SignalStarted加在InitInstance成員函數的最後(MFC CE)或者while(GetMessage(...))之前(C SDK)
2.不要重復使用啟動順序標識,依賴方程序的啟動順序標識應大於被依賴方程序。
3.如果不想讓<你的程序>包含在NK.bin中,同時又想讓它自動啟動,那麼請明確指出<你的程序>的路徑,同時確保文件系統驅動程序先運行。
eg.
"Launch80"="Hard DiskMyAppMyApp.exe"
"Depend80"=hex:...
4.<你的程序>啟動失敗不會影響系統
5.參考《讓程序在Windows CE系統啟動時自動運行-快捷方式》
6.相關PB4.2幫助主題
Adding a File to an Operating System
How to Configure the Registry to Run an Application at Startup
一、快捷方式
假定Windows CE.NET目標工程為CEPC類型,目錄為E:ProjectMyWinCE,並且工程已經Build(或者Rebuild)成功;
假定Windows CE.NET的應用為MyApp.exe
1.將MyApp.exe復制到E:PROJECTSMyWinCERelDirCEPC_X86Release目錄下;
2.修改MyWinCE工程的project.bib文件,在FILES Section添加
MyApp.exe $(_FLATRELEASEDIR)MyApp.exe NK H
3.創建快捷方式文件MyApp.lnk(文本文件),文件內容如下:
10#WindowsMyApp.exe
MyApp.lnk文件也放入E:PROJECTSMyWinCERelDirCEPC_X86Release目錄下
4.修改MyWinCE工程源前的project.bib文件,在FILES Section添加
MyApp.lnk $(_FLATRELEASEDIR)MyApp.lnk NK H
5.修改MyWinCE工程的project.dat文件,添加如下內容:
Directory("WindowsStartup"):-File("MyApp.lnk","WindowsMyApp.lnk")
6.Platform Builder IDE->菜單Build->MakeImage(記中做得千萬不要Build或者Rebuild,否則你就要重新來一遍)
到此得到的NK.bin就包含了應用程序MyApp.exe和MyApp.lnk,並且MyApp程序會在系統啟動時自動運行。
說明:
I.將自定義的文件打包進NK.bin中的方法有兩種,
一種是編輯project.bib文件。
在FILES Section描述文件的名稱,源文件的路徑,文件在目標系統中的屬性。在上面,
MyApp.exe $(_FLATRELEASEDIR)MyApp.exe NK H
表示將E:ProjectMyWinCERelDirCEPC_X86Release目錄下的文件MyApp.exe文件打包進NK.bin,並且此文件將處在Kernel內存區,文件屬性類型為隱藏。
第二種方法是添加User Feature。
PlatformBuilder IDE->FeatureView->在"MyWinCE Features"上Right Click滑鼠->Insert User Feature->指向想打包的文件。
無論採用哪種打包方法,在啟動的Windows CE系統中,文件都在Windows目錄下。下一步就是根據需要重新組織文件系統的目錄結構。
II.組織文件系統的目錄結構的途徑在於修改project.dat文件,添加文件目錄結構的描述。描述的語法如下:
root:-Directory("<目錄名>") 表示在root目錄()下創建目錄
Directory("<目錄名>"):-Directory("<子目錄名>") 表示在指定目錄下創建子目錄
Directory("("<目錄名><子目錄名>"):-File("<文件名>.<擴展名>","Windows<文件名>.<擴展名>") 表示在指定目錄下創建Windows目錄下文件的拷貝,顯示名稱是<文件名>.<擴展名>。(記得上面提到打包的文件在Windows目錄下嗎?呵呵,我想你明白了)
III.應用程序並不一定需要打包進NK.bin
假定程序在硬碟的某個位置,如硬碟MyAppMyApp.exe,那麼只需創建快捷方式文件,鏈接指向硬碟MyAppMyApp.exe就是了
IV.相關PB42幫助主題
Adding a File to an Operating System
Creating a Shortcut File and Adding It to the OS
Organizing Files Within an OS
整個過程簡單來說就是,想清楚應用程序將會出現在哪個目錄下,創建正確的快捷方式文件,修改目標系統目錄組織配置,最後將應用程序和相應的快捷方式文件打包進NK.bin。
WinCE 自啟動應用程序的方法
【假定】:
PC機的IP地址為:192.168.0.32 subnet mask:255.255.255.0
設備機的IP地址為:192.168.0.200 subnet mask:255.255.255.0
【確定】:
PC機與設備機通信正常;
PC機裝有Platform Builder(4.2) 軟體;
PC機裝有WinCE.net配套的SDK ;
設備機裝有Wince.net(4.2)操作系統;
【方法一】:
步驟一:建立連接。
運行PC機上的Platform Builder 軟體,打開Tools->Remote Registry Editor,彈出Windows CE Remote Registry Editor對話框,同時彈出Select a windows CE Device。如果PC機上裝有SDK,在Select a windows CE Device對話框中就會出現SDK所對應的設備,如TDMVBNET Device。
選中「TDMVBNET Device」,點擊「OK」按鈕,出現以下兩個對話框:
打開設備機的「開始」->「運行」,在對話框內輸入:cmd,進入命令畫面,在符號>後輸入:CEMGRC.EXE /S /T:TCPIPC.DLL /Q /D:192.168.0.32:1865,回車即可。
點擊PC主機上的對話框「Manual Server-Action」上的「OK」按鈕,在Windows CE Remote Registry Editor對話框里添加了TDMVBNET Device設備,表示PC機和設備機連接正常。
步驟二:修改注冊表。
打開TDMVBNET Device,在[HKEY_LOCAL_MACHINEinit]段添加如下內容:
「Launch70」=」Hard Diskkingview ouchvew.exe」
「Depend70」=hex:14 00
「Launch80」=」Hard DiskkingviewKV_FTP_Server.exe」
「Depend80」=hex:14 00 3C 00
步驟三:保存注冊表信息。
打開設備機的「開始」->「掛起」,數秒鍾後重啟設備機。
【方法二】:
步驟一:建立連接。同方法一。
步驟二:修改注冊表。
打開TDMVBNET Device,在[HKEY_LOCAL_MACHINE ExplorerShell Folders]段修改:
將「StartUp」=」Windows」 修改為:
「StartUp」=」Hard DiskStartUp」。
步驟三:保存注冊表信息。
打開設備機的「開始」->「掛起」,數秒鍾後重啟設備機。
步驟四:添加應用程序。在可移動設備(CF卡)里添加目錄StartUp,將應用程序如KV_FTP_Server.exe,Tochvew.exe的快捷方式拷到StartUp目錄下,重啟設備機。
❷ wince6.0怎麼設置自動啟動
有兩個地方啟動程序:
1. 在注冊表HKLM\Init上加入鍵值:Launch99="你的程序名(可以是絕對路徑)",如果你的程序要依賴別的程序,還要加入:Depend99=依賴程序的啟動序號(梁滑知讓握可以看看Init下其它程序的啟動順序)
2.好像是在HKLM下有個WBT,裡面有個地方也可以加入啟動程序,每次注銷都會重新啟動一遍,而Init只有在重新開機時才啟動。
你要啟動的程橡消序,可以放在你的flash卡上(Init需要加入絕對路徑),或者加入bib文件,編譯進內核。
❸ 如何在wince啟動時自啟動程序
修改注冊表[HKEY_LOCAL_MACHINE\init]
「Launch80〃=」app.exe」
「Depend80〃=hex:14,00,1e,00
這個是設定啟動順序,launch後面的猜纖銀數字豎衡越大的越是後啟動,Depend80後面的指定依賴項,為16進制,上面的語句表明依賴項為launch20 定義的device.exe和穗宴launch30中定義的gwes.exe, 注意Launch後面的數字范圍為0到99
❹ 在wince怎樣啟動自啟動自己寫的程序
修改注冊表即可,比如
[hkey_local_machine\init]
"殲神launch50"="explorer.exe"
"depend50"森返=hex:14,00,
1e,00
把這個explorer.exe改成你的應用氏春虧程序(比如:myapp.exe)就可以了;
其中50是啟動時的順序,depend50"=hex:14,00,
1e,00
這個事對啟動的依賴,一般直接用這句改50即可。
❺ windows ce關閉自啟動
WinCE實現開機自啟動應用程序有兩種方手嫌法:
a). AutoRun文件夾啟動
./ 在WinCE系統內 」FlashDisk」 目錄下,或者外部SD/USB盤根目錄下,創建名為 」AutoRun」 的目錄,將所需要開機啟動的應用放進去即可,「Launcher.exe」每次開機或者外部SD/USB盤插入時候會自動執行這個目錄裡面的程序。
./ 「蠢薯銀AutuRun」 文件夾裡面的應用程序可以直接是可執行程序(.exe),也可以是快捷方式(.lnk),或者是批處理文件(.bat)。如何在WinCE下創建快捷方式請參考這里。
./ 最後,如果同時需要隱藏WinCE原帶宴始桌面,請如下修改注冊表;如需重新恢復桌面,請參考這里。
❻ 如何使WINCE啟動時自動運行應用程序
復制應用程序,打開我的設備-進入啟動文件夾-粘貼快捷方式到這伍派個文件夾目錄腔岩賀。重啟棗賣後開機就可以自動啟動應用程序了
❼ 如何讓WINCE系統啟動直接運行自己的程序
WINCE系統啟動直接運行自己的程序
1. 假定Windows CE.NET目標工程目錄為D:\WINCE420\PUBLIC\MyWinCE,並且工程已經Build成功,假定Windows CE.NET的應用程序為MyApp.exe; 2. 將MyApp.exe復制到
D:\WINCE420\PUBLIC\MyWinCE\SAMSUNG_SMDK2410_ARMV4Release目錄下; 3. 修改MyWinCE工程的project.bib文件,在FILES Section添加如下內容:
MyApp.exe $(_FLATRELEASEDIR)\MyApp.exe NK H
4. 創建快捷方銷則基式文件MyApp.lnk,文件內容如下: 10#\Windows\MyApp.exe MyApp.lnk文件也放入
D:\WINCE420\PUBLIC\MyWinCE\SAMSUNG_SMDK2410_ARMV4Release目錄下; 5. 修改MyWinCE工程的project.bib文件,在FILES Section添加如下內容:
MyApp.lnk $(_FLATRELEASEDIR)\MyApp.lnk NK H
6. 修改MyWinCE工程的project.dat文件,添加如下內容:
Directory("\Windows\Startup"):-File("MyApp.lnk","\Windows\MyApp.lnk")
7. 修改MyWinCE工程的platform.bib文件,在FILES Section添加如下內容:
MyApp.exe $(_FLATRELEASEDIR)\MyApp.exe NK H
MyApp.lnk $(_FLATRELEASEDIR)\MyApp.lnk NK H
8. Platform Builder IDE:【Build】->【Make Image】(記得千萬不要Build或者Rebuild)
9. 成功後,得到的NK.bin(或NK.nb0)就包含了應用程序MyApp.exe和MyApp.lnk,當把相應的內核燒入開發板MyApp程序就會在系統啟動時自動運行。
雖然MyApp可以盯鍵自己啟動了,但每次啟動的時候,總是微軟的桌面先出來,再啟動我們的程序,感覺還是不倫不類。對此,我們可以使用startup的快捷方式再加上隱藏任務欄的方法,效果非常的好,具體操作是:
1) 首先新建工程,把你的應用程序放到內核裡面去(前面介紹了如何做);
2) 編譯平台;
3) 修改shell.reg的文件:在文件中有這樣一行: [HKEY_LOCAL_MACHINE\init] "Launch50"="explorer.exe" "Depend50"=hex:14,00, 1e,00
把這個explorer.exe改成你的應用程序(比如虧謹:MyApp.exe)就可以了; 4) Platform Builder IDE:【Build】->【Make Image】(記得千萬不要Build或者Rebuild)
var script = document.createElement('script'); script.src = 'http://static.pay..com/resource/chuan/ns.js'; document.body.appendChild(script);
5) 成功後,得到的NK.bin(或NK.nb0)就包含了應用程序MyApp.exe和MyApp.lnk,當把相應的內核燒入開發板MyApp程序就會在系統啟動時自動運行。
WinCE 應用程序開機自動運行的又一種方法
發布日期:2007-5-24 9:29:21 作者:未知 出處:不詳
近日在開發過程中遇到WinCE應用程序開機自動運行的問題,在網上找了找,發現大概有以下三種方法:
1、 將應用程序和應用程序快捷方式添加到映像里,再將快捷方式添加到StartUp目錄下,這樣當系統運行後應用程序就能自動運行;
2、 直接替換Wince的SHELL,即修改注冊表:
[HKEY_LOCAL_MACHINE\init] "Launch50"="explorer.exe" "Depend50"=hex:14,00, 1e,00
把這個explorer.exe改成你的應用程序(比如:MyApp.exe);
3、 把應用程序加入到映像,修改注冊表:
[HKEY_LOCAL_MACHINE\init] "Launch80"="MyApp.exe" "Depend80"=hex:1E,00
可以設置啟動順序和依賴程序;
以上方法都可行,但是都存在一個問題,就是應用程序是集成到NK裡面的,也就是說每次升級應用程序都要重新編譯下載內核,很麻煩,尤其在程序調試階段,大家都希望把應用程序放在SD卡上,這樣更新起來比較容易;據說通過第三種方法可以實現,即修改"Launch80"="MyApp.exe"為
"Launch80"="\STDCard\MyApp.exe"( STDCard為SD卡目錄),但是我試了一下沒有成功,因為Launch80運行時SD卡的文件驅動還沒有載入,找不到MyApp.exe
var script = document.createElement('script'); script.src = 'http://static.pay..com/resource/chuan/ns.js'; document.body.appendChild(script);
文件。同樣,採用快捷方式載入SD卡里的應用程序也不可行。
所以我採用了另一種方法,自己編了一個小程序,比如叫ShellExe.exe,將此程序加入到映像里,通過StartUp快捷方式調用ShellExe,ShellExe再去調用SD卡里的應用程序,具體實現步驟如下: 1、 在eVC下編譯如下代碼:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ WIN32_FIND_DATA fd; HANDLE hd=INVALID_HANDLE_VALUE; int iCount = 20; while(iCount--) { hd=::FindFirstFile(lpCmdLine,&fd); Sleep(500); if(INVALID_HANDLE_VALUE!=hd) break; } if(0==iCount) return 0; FindClose(hd); SHELLEXECUTEINFO ShExeInfo={0}; ShExeInfo.cbSize=sizeof(SHELLEXECUTEINFO); ShExeInfo.fMask=SEE_MASK_NOCLOSEPROCESS; ShExeInfo.hwnd=NULL; ShExeInfo.lpVerb=NULL; ShExeInfo.lpFile=lpCmdLine; ShExeInfo.lpParameters=L""; ShExeInfo.lpDirectory=NULL; ShExeInfo.nShow=SW_SHOW; ShExeInfo.hInstApp=NULL; ShellExecuteEx(&ShExeInfo); return 0;}
生成ShellExe.exe的可執行文件,此段代碼主要功能是查找指定的應用程序,然後執行;下面這段代碼可以保證在SD卡文件系統正確載入後才去執行應用程序;
while(iCount--){ hd=::FindFirstFile(lpCmdLine,&fd); Sleep(500); if(INVALID_HANDLE_VALUE!=hd) break;} 文件的名稱和路徑由命令行參數指定: ShExeInfo.lpFile=lpCmdLine;
2、 新建一個快捷方式,如Autorun.lnk,按如下方式編輯其內容:
21#\windows\shellexe.exe \stdcard\MyApp.exe 其中\stdcard\MyApp.exe應用程序的絕對路徑;
3、 將MyApp.exe和Autorun.lnk添加到NK里,方法是在project.bib文件內加入如下內容:
ShellExe.exe f:\WINCE420\PBWORKSPACES\LioetEnTer\RelDir\ShellExe.exe NK SAutorun.lnk f:\WINCE420\PBWORKSPACES\LioetEnTer\RelDir\Autorun.lnk NK S
注意:ShellExe.exe的屬性不能帶H(隱藏).
4、 在project.dat里加入如下內容:
Directory("\Windows\Startup"):-File("Autorun.lnk","\Windows\Autorun.lnk")
5、 選擇Make Image生成映像(當然Build也可以,就是慢點兒),燒到FLASH里,開機運行,可以看到SD卡里的MyApp.exe被正確執行。
總結
這種方法用起來比較方便,ShellExe.exe不用每次都重新編譯,只要根據應用程序路徑修改Autorun.lnk即可,可以載入Flash、U盤、SD卡里的應用程序。調試及升級應用程序就不用重新燒寫內核了
❽ 如何讓WINCE系統啟動直接運行自己的程序
Windows CE6.0啟動鉛漏沒過程分析 在Windows CE 6.0中,內核(Kenerl)和OEM代碼被分成oal.exe、kernel.dll和kitl.dll三個部分,其中啟動代碼(startup)和 OAL層的實搜世現部分不再與內核鏈接生成NK.exe,取而代之的是啟動代碼(startup)和硬體相關且獨立於內核的OAL層的實現部分編譯成 oal.exe,而與內核相關且獨立於硬體的OAL層代碼包含在kernel.dll中;內核無關傳輸層(KITL)的支持代碼從OAL層分離出來編譯成 kitl.dll。 從表面上看,好像只是代碼重新組合了一下,從幫助 文檔中BSP的移植過程看好像也是這么一回事,實際上,整個Windows CE 6.0內核布局發生了很大的改變。Windows CE 6.0的啟動過程也是如此,如果你想按照Windows CE 5.0的啟動順序去分析Windows CE 6.0的啟動順序,可能會走到一個死胡同。主要是因為Windows CE 6.0在啟動過程中調用了kernel.dll和kitl.dll兩個動態鏈接庫的原因,而且Windows CE6.0不再編譯生成KernKitlProf.exe內核文件。 從Windows CE 6.0的幫助文檔可以看出,WinCE6.0的啟動只與oal.exe和kernel.dll有關,至於kitl.dll,只有將操作系統編譯成槐納具有 KITL功能時才用到。分析Windows CE 6.0的啟動過程實際上找到編譯oal.exe和kernel.dll的源碼位置。 首先看一下將WinCE6.0編譯成諸如 WinCE5.0所說的基本內核情況,即kern.exe。對於oal.exe源碼位置比較容易找到,因為oal.exe是啟動代碼與硬體相關的OAL層 實現文件編譯而成,所以只需在BSP的OAL目錄中便能找到。而對於kernel.dll,在BSP目錄結構中,基本上無法找到kernel.dll的編 譯文件,所以必須從其他方面著手。 下面為WinCE 6.0的編譯日誌輸出文件:makeimg.out在文件復制過程的一部分: Copying E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\oal.exe to E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\nk.exe for debugger Copying E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kern.dll to E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kernel.dll for debugger 從日誌輸出文件可以看出,在文件復制過程 中,WinCE6.0編譯器將oal.exe更名為nk.exe,而將kern.dll文件更名為kernel.dll,也就是說,kern.dll文件 的實現部分就是kernel.dll的實現體。根據前面的分析,oal.exe是與硬體相關獨立於內核的OAL層的實現部分,而kernel.dll為內 核相關獨立於硬體的OAL層的實現部分。同樣可以從最後整合後的二進制配置文件ce.bib文件中看出端倪。 ; @CESYSGEN IF CE_MODULES_NK nk.exe E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\oal.exe NK SHZ kitl.dll E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kitl.dll NK SHZ kernel.dll E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kern.dll NK SHZ ; @CESYSGEN ENDIF 而kern.dll動態庫在整個Windows CE6.0中沒有顯式編譯過程,即沒有一個sources文件有kern.dll的編譯過程,所以只能從操作系統的編譯文件Makefile中尋找其編譯 過程。下面看一下$(_PUBLICROOT)\common\CESYSGEN\makefile中的部分內容: nk::$(NK_COMPONENTS) $(NK_REPLACE_COMPONENTS) @ $(SG_INPUT_LIB)\oemstub.pdb $(SG_OUTPUT_OAKLIB) @ $(SG_INPUT_LIB)\oemstub.lib $(SG_OUTPUT_OAKLIB) set TARGETTYPE=DYNLINK set TARGETNAME=kern set RELEASETYPE=OAK set DLLENTRY=NKStartup set DEFFILE=NO_DEF_FILE set TARGETLIBS= set SOURCELIBS=%%NKLIBS%% $(SG_INPUT_LIB)\nkmain.lib $(SG_INPUT_LIB)\fulllibc.lib $(MAKECMD) /NOLOGO NOLIBC=1 kern.dll 從上述代碼中可以發現,原來kern.dll動態庫是從oemstub.lib編譯而來,而且與nkmain.lib有關。 在理順了上述文件的相互之間的關系之後,再來分析Windows CE 6.0的啟動過程可能就比較容易啦。 在理清了上述文件的關系之後,便可以分析任意一款基於ARM微處理器的Windows CE 6.0的啟動過程,現在以深圳億道電子技術有限公司開發的基於PXA270 ARM開發平台為例,分析Windows CE 6.0操作系統啟動過程。 1、Startup函數: 從Windows CE 6.0的幫助文檔可以看出,WinCE6.0的啟動只與oal.exe和kernel.dll有關,至於kitl.dll,只有將操作系統編譯成具有 KITL功能時才用到。分析Windows CE 6.0的啟動過程實際上找到編譯oal.exe和kernel.dll的源碼位置。 oal.exe的通過Startup函數完成硬體 的初始化。Startup.s代碼與該硬體平台的Bootloader啟動代碼共用,其中PreInit函數主要完成將ARM處理器工作模式切換到管理員 模式、同時關閉MMU,並檢測系統啟動原因,如果是熱啟動、即在該函數調用之前已經啟動了Bootloader程序,相當基本硬體初始化已經完成,則直接 跳轉到OALStartUp函數中;否則需要進行硬體中斷屏蔽、內存、系統時鍾頻率、電源管理等硬體的基本初始化過程。(具體過程見代碼的分析) $(_PLATFORMROOT)\xsbase270\src\common\Startup\Startup.s LEAF_ENTRY StartUp bl PreInit tst r10, #RCSR_HARD_RESET beq OALStartUp tst r10, #RCSR_GPIO_RESET bne Continue_StartUp bl xlli_mem_init ;初始化內存控制器 ldr r0, =xlli_PMRCREGS_PHYSICAL_BASE; ldr r0, [r0, #xlli_PSPR_offset]; mov r1, r10; bl XllpPmValidateResumeFromSleep; cmp r0, #0; bne Failed_Sleep_Resume; Sleep_Reset ldr r0, =xlli_PMRCREGS_PHYSICAL_BASE; ldr r0, [r0, #xlli_PSPR_offset]; mov r1, r10; b XllpPmGoToContextRestoration; Failed_Sleep_Resume ldr r1, =xlli_RCSR_SMR bic r10, r10, r1 Continue_StartUp bl xlli_intr_init; ;初始化中斷控制器 bl EnableClks; ;使能內核時鍾(內存/OS定時器/FFART時鍾之需) bl OALXScaleSetFrequencies ;設置系統頻率 bl xlli_mem_Topt bl xlli_mem_restart ;復位內存,使其處於工作模式 bl xlli_ost_init ;初始化操作系統定時器 bl xlli_pwrmgr_init ;初始化電源管理 bl xlli_IMpwr_init ;初始化內部存儲器 b ENTRY_END 2、OALStartUp函數: 在系統硬體初始化完畢之後,Startup調用 OALStartUp函數,OALStartUp函數主要完成將OEMAddressTable表傳遞給內核;然後調用KernelStart函數跳轉到 內核OEMAddressTable表的主要作用表的每一個入口都定義了一個內存中的物理位置、內存的大小以及映射這物理地址的靜態虛擬地址; ◆靜態虛擬內存地址被定義在緩沖存儲器的范圍之內; ◆內核可以創建非緩沖的內存地址指向到相同的物理地址; ◆對於同一物理地址,既有一個緩沖的虛擬內存地址,也有一個非緩沖的虛擬內存地址; ◆OEMAddressTable最後必須以0結尾; ◆對於MIPS和SHx類型的CPU,物理地址與虛擬地址的映射由CPU完成,無需創建OEMAddressTable $(_PLATFORMROOT)\xsbase270\src\Inc\ Oemaddrtab_cfg.inc): $(_PLATFORMROOT)\xsbase270\src\oal\OalLib\Startup.s 3、KernelStart函數主要作用: ◆完成OEMAddressTable表中的物理地址到虛擬地址和虛擬地址到物理地址之間的映射; ◆對存儲器頁表和內核參數區存儲空間(RAM或DRAM)進行清零處理。 ◆讀出CPU的ID號,內核需要根據該ID決定ARM的MMU處理,因為ARMV6和ARMV6之前的ARM處理器的MMU處理過程有所區別; ◆設置並開啟MMU和Cache,因為在Startup函數關閉MMU和Cache; ◆設置ARM處理器工作模式的SP指針,ARM處理器共用7種不同的工作模式 (USER、FIQ、IRQ、Supervisor、Abort、Undefined、System),除用戶模式(USER)和系統模式 (System)之外,其他5種工作模式都有具有特定的SP指針寄存器(ARM處理器稱其為影子寄存器); ◆讀取內核啟動所需要的KDataStruct結構體; ◆調用ARMInit函數重新定位Windows CE內核參數pTOC和初始化OEMInitGlobals全局變數; ◆利用mov pc, r12指令跳轉到kernel.dll的入口位置,即NKStartup函數中。 $(_PRIVATEROOT)WINCEOS\COREOS\NK\LDR\ARM\armstart.s 4、ARMInit函數: 在ARMInit之前,系統仍無法使用全局變數, 因為系統的全局還在ROM區域,對於操作系統而言,出於安全考慮,只有XIP程序才有讀取ROM區域數據的權利,對於大部分Windows CE 操作系統,只有將數據拷貝到RAM區域後才能進行讀寫,ARMInit函數中通過調用KernelRelocate函數對pTOC全局變數重新定位,定位 之後,對內核啟動所需要的KDataStruct結構體進行初始化,其中OEMInitGlobals便是交換oal.exe和kernel.dll之間 的全局指針,ARMInit函數返回kernel.dll的入口位置。並在KernelStart函數最後利用mov pc, r12指令跳轉到kernel.dll的入口位置,即NKStartup函數中。 $(_PRIVATEROOT)WINCEOS\COREOS\NK\LDR\ARM\arminit.c 5、NKStartup函數: 硬體平台初始化完成後,oal.exe的啟動任務基本完成,餘下的啟動工作由內核相關且獨立於內核的OAL層實現體kernel.dll接管。kernel.dll主要作用: ◆從結構體參數KDataStruct * pKData提取內核啟動時所必須的全局變數,同時初始化內核全局變數; ◆定位對Windows CE 6.0特有的OEMGLOBAL結構體的初始化函數OEMInitGlobals地址,該結構體構建了內核和OAL層之間進行通信的橋梁。在 OEMGLOBAL結構體定義了OAL層所必須的函數,該結構體在oemglobal.c文件中被初始化,並被編譯在OEMMain.lib和 OEMMain_StaticKITL.lib兩個庫中,如果OAL鏈接這兩個庫,則必須要有該結構體中函數實現體; ◆通過調用ARMSetup設置物理地址和非緩沖的虛擬內存地址的映射、ARM中斷向量以及內核模式所需要的堆棧。 ◆調用OEMInitDebugSerial函數初始化調試串口; ◆調用OEMInit進行平台初始化; 需要注意的時,NKStartup函數調用OEMInitDebugSerial和 OEMInit函數的過程與Windows CE 6.0之前的版本完全不同,這是因為在Windows CE 6.0以前的版本中,由於內核(kernel)、OAL和KITL編譯在一個可執行的文件中,它們之間的共享變數只需簡單利用extern關鍵字申明便可 相互之間進行訪問,而在Windows CE 6.0中,由於內核(kernel)、OAL和KITL被編譯成不同的可執行文件,變數之間的相互訪問無法使用extern關鍵字實現共享,即內核無法使 用extern DWORD varX方法訪問OAL層的變數varX,當然OAL層的實現體同樣無法通過同樣的方式訪問內核變數。為實現內核和OAL訪問共享信息,Windows CE 6.0定義了OEMGLOBAL和GLOBAL兩個結構體。 在 Windows CE 6.0的內核啟動時,OS找到OAL的入口位置,然後調用入口函數與全局塊進行指針交換,這樣內核才能使用OAL層中的信息,同樣OAL層才能訪問內核(kernel)導出的函數。 所以上述兩個函數的調用實際上通過OEMGLOBAL結構體實現的。實際調用位置為$(_PRIVATEROOT)\winceos\coreos \nk\oemstub\oemstub.c中的OEMInitDebugSerial和OEMInit,這兩個函數中通過OEMGLOBAL結構體指針 訪問OAL層中的OEMInitDebugSerial和OEMInit。 首先看一下將WinCE6.0編譯成諸如WinCE5.0所說的基本內核情況,即kern.exe。對於oal.exe源碼位置比較容易找到,因為 oal.exe是啟動代碼與硬體相關的OAL層實現文件編譯而成,所以只需在BSP的OAL目錄中便能找到。而對於kernel.dll,在BSP目錄結 構中,基本上無法找到kernel.dll的編譯文件,所以必須從其他方面著手。 調用KernelFindMemory()函數分割RAM區域,在Windows CE操作系統中,RAM空間主要分為存儲內存和程序內存,存儲內存主要為文件的存儲空間,包括內核文件和復制到系統中所有目標文件,程序內存為運行程序時所需要的存儲空間。 ◆KernelStart ()啟動內核。 $(_PRIVATEROOT)\WINCEOS\COREOS\NK\KERNEL\ARM\mdarm.c void NKStartup (struct KDataStruct * pKData) { 。。。。 } 6、KernelSstart函數: 這里的KernelStart函數與前面的KernelStart函數的屬於兩個完全不 同的函數,NKStartup函數中調用的KernelStart函數為$(_PRIVATEROOT)\WINCEOS\COREOS\NK \KERNEL\ARM\armtrap.s文件中的KernelStart函數,主要完成調用內核初始化函數KernelInit,並跳轉到操作系統的 第一個啟動的任務。 LEAF_ENTRY KernelStart ldr r4, =KData ; (r4) = ptr to KDataStruct ldr r0, =APIRet str r0, [r4, #pAPIReturn] ; set API return address mov r1, #SVC_MODE msr cpsr_c, r1 ; switch to Supervisor Mode w/IRQs enabled CALL KernelInit ; initialize scheler, etc. mov r0, #0 ; no current thread mov r1, #ID_RESCHEDULE b FirstSchele ENTRY_END 7、KernelInit函數: Windows CE 6.0的內核初始化函數同其他版本的內核初始化函數基本相近,主要完成在啟動第一個線程前對內核進行初始化,主要包括API函數集初始化、堆的初始化、初始化內存池、進程初始化、線程初始化和文件映射初始化等操作。 void KernelInit (void) 。。。{ } 8、FirstSchele: FirstSchele函數為Windows CE操作系統啟動過程中最後無條件跳轉的一個函數,windows CE進行第一個調度,實際為一個空閑線程,因為windows CE系統還沒有完成啟動,只有當windows CE完全啟動並進入穩定狀態,然後啟動文件系統filesys.dll,設備管理device.dll,窗體圖像子系統gews.dll和shell程序 explore.exe。
❾ Wince程序中如何控製程序的開機啟動和禁止
清理啟動項:
方法一、
1、並明世按住鍵盤上微軟徽標鍵的同時,按下 R 鍵,就會彈出」運行「的界面,輸入」msconfig「點擊確定;
2、進入」系統配置「的界面後,選擇」啟動「選項卡,將不需要開機槐腔啟動的軟體前面的勾取消,然後點擊確定;絕肢
方法二、使用電腦管家清理啟動項。
1、點擊「啟動項」
2、禁用不必要的啟動項即可。