• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            春暖花開
            雪化了,花開了,春天來了
            posts - 149,comments - 125,trackbacks - 0
            WinCE驅動開發問題精華集錦-2
            摘自: http://hi.baidu.com/mcu%5Fspaces/blog/item/f14d1d2af1a2e33c5243c144.html


            21、 文件格式如下所示,我想把每行的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 ) )  
            {  
            fwscanf(stream, L"%s", WCHAR1);  
                 fwscanf(stream, L"%f", float1);  
                 fwscanf(stream, L"%f", float2);  
                 fwscanf(stream, L"%f", float3);  
            }  
            fclose( stream );  
              
            22、GWES組件的功能有哪些?  
                 GWES不僅負責GDI、窗口、消息,還負責管理本機設備驅動程序,負責加載顯示、鍵盤鼠標、觸摸屏驅動程序,而且GWES本身包含電源、LED驅動程序。  
              
            23、如何在PB中預先設定好存儲內存和程序內存的大小,我想多劃分一些空間給程序內存?  
               兩種辦法:  
               1)、在定制內核時在config.bib文件中設置FSRAMPERCENT = number,具體number可參考標題為“FSRAMPERCENT ”的幫助文檔。這種辦法是修改內核的設置,所有一直有效。  
               2)、在應用程序中調用API SetSystemMemoryDivision,如果函數返回SYSMEM_CHANGED表示成功,如果返回SYSMEM_MUSTREBOOT表示需要熱啟動才能有效。這種辦法需要每次啟動后調用API才有效。  
              
            24、 如何取消鼠標光標?  
               通過取消SYS變量來實現此目的,在PB命令行下鍵入“set SYSGEN_CURSOR=”,然后回車確認。  
              
            25、EVC下調用TextOut如何編譯會出錯?  
                 類似這樣的問題很多,這是因為EVC的幫助文檔內容有錯誤??赡蹺VC的幫助文檔內容是從桌面Windows幫助文檔復制過來的,所以很多API函數還有例子代碼都有錯誤,例如幫助文檔中包含一個API函數的說明,但是實際編譯的時候提示沒有這個API,有的例子代碼采用ANSI字符串,而WINCE的API都是寬字符版本,造成直接復制過來編譯失敗。  
                 因為MFC for WINCE的CDC類中沒有TextOut成員函數,所以編譯會出錯,可以用其它類成員函數ExtTextOut或者DrawText替換。  
              
            26、我如何將我的dll軟件讓現有的ce系統認可?盡管我也知道應該使用signfile.exe程序進行簽名,但是我并不知道那個ce系統認可的簽名應該是啥  
                 如果你說的WINCE系統內核已經加入了簽名認證機制,那么沒有私鑰對你的DLL文件簽名肯定是無法運行在此內核中的,一般簽名密鑰的密鑰長度都是1024位,很難破解。  
              
            27、如果查看WINCE注冊表中的內容?  
               兩種辦法:  
               1)、建立同步后,用EVC自帶的工具“Remote Registry Editor”打開查看。  
               2)、從網上下載注冊表查看工具,放到WINCE設備中。  
              
            28、調用directshow出現鏈接錯誤,如何解決?  
            player.obj : error LNK2001: unresolved external symbol _IID_IVideoWindow  
            player.obj : error LNK2001: unresolved external symbol _IID_IMediaControl  

            這是因為鏈接器沒有找到合適的.lib文件。兩種辦法:  
            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或者其它組件。  
              
            29、在PB的config.bib文件中,“IMGFLASH”表示什么意思呢?  
                 表示能夠刷NK到ROM中,具體請查看標題為“IMG Environment Variables”的幫助文檔。  
              
            30、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下驅動開發基礎》。  
              
            31、修改了WINCE自帶的驅動程序后如何編譯?如果是自己開發的驅動程序如何編譯?  
            1)、分為IDE方式和命令行方式。  
            IDE方式的編譯很簡單,以PB5.0為例,打開定制內核的工程,在左邊的“workspace”—“FileView”中找到你已經修改了的目錄,然后單擊右鍵彈出菜單,在菜單中選擇“Build and Sysgen Current Project”,這樣PB就會編譯指定的目錄中的項目源碼文件,然后執行sysgen命令根據source文件中的內容生成目標文件并復制到當前內核工程目錄下。  
            命令行方式的編譯需要打開“Build OS”—“Open Release Directory”,以cd命令進入你已經修改的驅動程序目錄中,然后鍵入“build –cfs”,然后鍵入“sysgen –p 項目名稱”,一般項目名稱為source文件中的“TARGETNAME”。  
            2)、如果想完全自己開發驅動程序,建議直接采用EVC或者PB來編寫編譯。  
              
            32、開發PCI設備驅動時,InterruptInitialize函數的第一參數是否是PCI卡配置空間信息中的InterruptLine 參數?是否需要在HKLM\Drivers\BuiltIn\PCI\Template 加一個自己的 subkey,并填寫相應內容?如何填?  
            1)、InterruptInitialize的第一參數是IRQ,也就是邏輯中斷號,而不是物理中斷號,InterruptLine是指物理中斷號  
            2)、需要在template下加自己的PCI設備的信息,例如:  
               [HKEY_LOCAL_MACHINE\Drivers\PCI\Template\Serial]  
                 "Dll"="Com16550.Dll"  
                 "Class"=dword:07  
                 "SubClass"=dword:00  
                 "ProgIF"=dword:02  
                 "VendorID"=multi_sz:"0AF0","B320","B320"  
                 "DeviceID"=multi_sz:"0020","0300","0302"  
                 "Prefix"="COM"  
            而這些信息就來自于你執行pcienum.exe的結果。  
              
            33、編譯器報錯:error C2065: 'CFileFind' : undeclared identifier,如何解決?  
               MFC for WINCE版本沒有CFileFind類,所以要查找文件只能調用API FindFirstFile 和FindNextFile。  
              
            34、如何設置WINCE系統字體、字號?如何設置自己開發的軟件的字體、字號?  
            1)、系統字體通過注冊表設置。如下:  
            [HKEY_LOCAL_MACHINE\System\GDI\SysFnt]   ///系統字體  
            Wt=420  
            Ht=18  
            Nm=Arial  
            [HKEY_LOCAL_MACHINE\System\GWE\Menu\BarFnt]   ///菜單欄字體  
            [HKEY_LOCAL_MACHINE\System\GWE\Menu\PopFnt]   ///彈出窗口字體  
            [HKEY_LOCAL_MACHINE\System\GWE\Menu]         ///菜單字體  
            HKEY_LOCAL_MACHINE\System\GWE\Button           ///按鈕字體  
            2)、創建字體時把字體高度參數設置大點就可以了。如CFont::CreateFont(nHeight,...),也可以在LOGFONT結構中設置字體高度或者字體種類。如果是控件,調用控件的SetFont成員函數。如果是直接畫,在OnPaint響應函數中調用SelectObject選字體到DC。  
              
            35、 nk.bin和nk.nb0有什么區別?  
               這里提到的bin是一種二進制鏡像格式,以片斷(section)為單位組織數據,每個片斷都包括一個頭,頭里指定了起始地址,長度,校驗值。Platform Builder調用工具將WINCE內核所有文件以bin格式合并成一個文件,默認文件名為nk.bin。BootLoader又以同樣的格式將nk.bin分解成多個文件放到RAM中。可以在命令行中鍵入“viewbin nk.bin”來查看bin文件中具體包括了哪些內容。鍵入Cvrtbin命令轉換.bin格式文件為.sre格式或者.abx格式。  
               nb0格式是原始的二進制鏡像,它不包括頭,一般情況下將內核下載到設備的RAM中運行都采用nb0格式。要生成nbx格式的文件,需要在相關.bib文件中確定如下值:ROMSTART、ROMWIDTH、ROMSIZE。  
              
            36、在不采用硬件計時器的情況下如何創建更精確的計時器?最精確周期能否達到1毫秒?  
            對于精確值的要求不同,所采用的辦法不同。以下闡述幾種辦法。  
            1)、在單線程中循環調用API Sleep函數,Sleep函數精確程度為如果Sleep(N),那么實際睡眠時間在N到N+1毫秒之間。而且還要注意調用Sleep的線程優先級的問題。如果任務過多并且此線程優先級低,那誤差就更大些。  
            2)、調用API QueryPerformanceCounter函數,舉例如下:  
            LARGE_INTEGER   liFrequency;  
            if (QueryPerformanceFrequency(&liFrequency))   // 查詢系統時鐘的頻率,這里將返回1000  
            {  
               liFrequency.QuadPart /= 1000;    
               LARGE_INTEGER   liTimeOut;    
               if (QueryPerformanceCounter(&liTimeOut))   //得到截至到當前累計發生的系統時鐘中斷次數  
               {  
                   liTimeOut.QuadPart += liFrequency.QuadPart;   ///計算下一秒到來時總的中斷次數是多少  
                   LARGE_INTEGER   liCurrent;  
                   do  
                   {          
                     QueryPerformanceCounter(&liCurrent);     // 循環查詢累計的的中斷次數  
                   } while (liCurrent.QuadPart < liTimeOut.QuadPart); ///到達下一秒  
               }  
            }  
            調用QueryPerformanceCounter同調用Sleep在本質上都是一樣的,都是在單線程中無限循環等到周期一到執行任務,相比較QueryPerformanceCounter要比Sleep更精確些,越精確就越要求線程的優先級,保障線程能夠正常得到處理器。  
            3)、以上辦法難以保證周期精確到1毫秒并且WINCE系統穩定地運行,所以要從中斷入手。以x86平臺為例,先在Timer.c中將默認的SetTimer0(TIMER_COUNT)中的TIMER_COUNT /=2,SetTimer0函數負責設置系統時鐘的頻率,默認1毫秒發生一次中斷,如果除以2就是0.5毫秒發生一次中斷。然后在fwpc.c文件中修改ISR函數PeRPISR,因為原來默認是1毫秒發生一次中斷,在處理INTR_TIMER0時系統負責累計計數、管理線程的調度,返回相應的SYSINTR值,而我們沒有辦法再添加代碼返回自己定義的SYSINTR值,所以現在要修改原來的處理代碼,例如設置一個BOOL型變量,TRUE就執行原來默認的代碼,而FALSE就返回我們自己定義的SYSINTR值,這樣即不影響原來的ISR處理,又加入了我們的中斷響應代碼。ISR返回我們定義的SYSINTR后WINCE內核激活相對應的EVENT事件,我們就可以在我們編寫的IST里處理任務了。  
              
            37、flash中存放了BootLoader和內核鏡像,如何把剩余flash部分劃分為一個存儲區域供應用程序讀寫?  
               以WINCE提供的驅動(FAT文件系統和MSFLASH驅動)來舉例說明。如果采用默認common.reg中的注冊表設置,那么MSFLASH驅動默認把整個flash作為存儲區域來讀寫,這不符合問題的要求,所以必須告訴MSFLASH驅動程序可供讀寫的區域的起始地址和長度。以下是一個注冊表例子:  
            [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FASLD]  
                 "Dll"="fasld.dll"         ///實際Flash存儲器的驅動程序  
                 "Order"=dword:2       ///該驅動程序相對于其它驅動程序的加載順序  
                 "Prefix"="DSK"         ///前綴  
                 "Ioctl"=dword:4         ///IOCTL碼,設備管理器加載驅動的時候調用IOControl函數,傳遞這個IOCTL碼。  
            "Profile"="MSFlash"     ///Profile名稱,也就是[HLM\System\StorageManager\Profiles\MSFlash]  
            ///當設備管理器加載此驅動程序的同時發送通知給系統,IClass(GUID)的值表明這是一個存儲設備的驅動程序。  
            "IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"    
                 "MemBase"=dword:00000000     ///Flash中可供讀寫區域的起始物理地址,也就是Flash的首地址+偏移量  
                 "MemLen"=dword:00000000     ///Flash中可供讀寫區域的長度  
            [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash]  
                 "DefaultFileSystem"="FATFS"   ///MSFlash驅動默認采用的文件系統  
                 "PartitionDriver"="mspart.dll"     ///采用的分區驅動程序  
                 "MountAsRoot"=dword:1         ///此目錄作為文件系統的根目錄  
                 "Folder"="NOR Flash"           ///目錄名稱  
                 "Name"="FLASH Disk Block Device"   ///Flash驅動名稱  
            "PartitionDriverName"="MSPART" ///分區驅動名稱  
            "AutoMount"=dword:1         ///自動裝載檢測到的分區  
                 "AutoPart"=dword:1             ///自動分區  
                 "AutoFormat"=dword:1           ///自動格式化分區  
            [HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\MSFlash]  
                 "DriverPath"="Drivers\\BuiltIn\\FASLD"     ///Flash驅動在注冊表中的位置  
                 "LoadFlags"=dword:1                 ///這個值可以被設置為0、1、2。1表示同步加載,其它表示異步加載  
                 "Order"=dword:0  
            [HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]  
                 "FriendlyName"="FAT FileSystem"     ///文件系統名稱  
                 "Dll"="fatfsd.dll"                   ///文件系統驅動程序  
                 "Flags"=dword:00000064             ///標志,詳見幫助文檔  
                 "Paging"=dword:1                   ///是否分頁  
                 "EnableCache"=dword:1               ///是否允許緩存數據  
                 "CacheSize"=dword:0                 ///指定緩存大小,0表示默認  

            38、驅動程序如何發通知給應用程序?  
               這里介紹一下常見的兩種辦法。  
               1)、驅動程序調用API SendNotifyMessage,發送特定的消息給應用程序,這就要求應用程序要有消息循環機制并且要事先做好消息的處理。參數1為窗口句柄,可以設置HWND_BROADCAST表示廣播消息。要注意的是不要在參數中傳遞指針(虛擬地址),因為執行驅動程序的線程和應用程序并不在同一個進程空間中。解決辦法可以利用內存映射文件技術,比如在驅動程序中創建一個內存映射文件對象,申請一塊物理內存,然后把對象名稱和內存長度傳遞給應用程序,應用程序打開同名的內存映射文件對象,讀取里面的數據。對象名稱可以事先協定好,也可以通過注冊表來傳遞,內存長度是32位值,通過消息參數就可以傳遞,也可以通過注冊表來傳遞。另外一種解決辦法是在定制內核時候預留一塊物理內存,這樣驅動程序和應用程序都可以通過VirtualAlloc和VirtualCopy來映射到同一塊物理內存,其原理同內存映射文件技術一樣,但是這塊物理內存不具備通用性。最后一個辦法是應用程序事先將一個緩沖區地址傳遞給驅動程序,驅動程序調用MapPtrToProcess映射應用程序傳遞過來的地址,當驅動程序調用SendNotifyMessage后應用程序可以直接到該地址中讀取數據。  
               設備管理器就是調用此函數廣播WM_DEVICECHANGE消息的。另外WINCE的一個例子程序RNAApp在撥號連接建立的時候也是調用這個函數廣播WM_NETCONNECT消息的。  
               2)、驅動程序調用API CeEventHasOccurred指明一個事件A發生,在此之前應用程序調用API CeRunAppAtEvent將驅動程序指明的A事件和一個應用程序名稱相關聯,或者和一個事件B相關聯。這樣當A事件發生時,如果指明和一個應用程序名稱關聯,那這個應用程序就會被啟動。如果指明了和一個事件B相關聯,那么等待事件B的線程將被激活。如果想了解當前系統內部所有驅動程序支持哪些類似事件A的事件,調用API CeNotifyPublic_FilterEvent,在該API的幫助文檔里也列舉了常見的事件,例如NOTIFICATION_EVENT_NET_CONNECT和 NOTIFICATION_EVENT_NET_DISCONNECT。  
              
            40、 EVC創建的工程名稱如果用中文就出錯,該怎么辦?  
               用EVC創建的工程名稱如果為中文將導致資源文件打不開和編譯出錯,可以改資源文件名稱為英文,再編輯.rc文件中的資源文件名稱。但建議盡量不要用中文為工程名稱。  
               作為習慣,應該在EVC創建一個工程后,立刻在“project”—“settings”中設置資源的語言屬性,然后在“resource view”中設置每個資源的語言屬性,這些工作做完后再修改資源就沒有問題了。有人詢問對話框的標題為亂碼,其原因就是在沒有修改語言屬性的情況下設置標題為中文。
            posted @ 2009-07-16 15:41 Sandy 閱讀(735) | 評論 (0)編輯 收藏
            WinCE驅動開發問題精華集錦-1
            摘自: http://hi.baidu.com/mcu%5Fspaces/blog/item/12662a088108f9d563d9867b.html

            近日越來越發現知識的匱乏,所以需要好好努力才可以.

            加油,加油!

            精華集錦1__內容如下
            1、在應用程序中,如何向修改本機的ip 地址等網絡參數,并使之立即生效?  
                   網絡設置保存在注冊表中,位置[HKEY_LOCAL_MACHINE\Comm\網卡名稱\Parms\TcpIp],例如常見的CS8900網卡設置:  
            [HKEY_LOCAL_MACHINE\Comm\CS89001\Parms\TcpIp]  
               "EnableDHCP"=dword:0  
               "DefaultGateway"="192.168.0.1"  
               "DNS"="111.111.111.111"  
               "UseZeroBroadcast"=dword:0  
               "IpAddress"="192.168.0.2"  
               "Subnetmask"="255.255.255.0"  
                 設置之后要生效有兩種辦法:一種熱啟動,調用KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL),熱啟動時間很短暫;另外一種調用DevieceIoControl API,傳遞IOCTL=IOCTL_NDIS_REBIND_ADAPTER。  
              
            2、如何向控制面板中那樣,修改系統聲音的音量  
                 調用API waveOutSetVolume(HWAVEOUT, dwVolume ),一般參數1為0。在[HKEY_CURRENT_USER\ControlPanel\Volume]下是系統聲音的注冊表設置。  
              
            3、在應用程序中如何實現jpg、gif圖片的顯示  
            有幾種辦法:  
            1)、在MSDN中搜索標題為“Windows CE .NET Technical Frequently Asked Questions”的文檔,其中有一個問題“How can I display JPEG, GIF, and other graphics files?”,下面就是答案。  
            2)、如果安裝了Windows CE 5.0,一個例子源碼位于WINCE500\PUBLIC\GDIEX\SDK\SAMPLES\SIMPLE。  
            3)、用IWebBrowser組件實現。  

            4、 在應用程序中如何實現系統待機  
            void GwesPowerOffSystem(void);  

            5、   在WINCE中如何得到網卡MAC地址  
                 事實證明,獲得物理網卡的MAC地址并沒有被統一成一個API或者IOCTL,如果網卡驅動程序沒有提供接口的話只能直接訪問寄存器獲得。讀者可以參考目錄WINCE500\PUBLIC\COMMON\OAK\DRIVERS\NETCARD里的一些驅動源碼。  
              
            6、Windows XP Embedded 和Windows CE有何區別  
                 簡單地說Windows XP Embedded采用Windows XP內核,只能運行在x86處理器上,優點是能夠運行PC上現有的應用軟件,缺點是授權費太高,標價¥900元;Windows CE采用Windows CE內核,能夠運行在多種處理器上,如x86、ARM、SHX、MIPS等,優點是授權費低,最低Core版標價¥30元。缺點是需要單獨開發應用軟件、定制內核,甚至開發BSP、Driver。  

            7、 wince下只是把調制解調器的驅動掛接在了com1,如何將器驅動掛接在com2上?  
                 1)、在HLM\drivers\buildin\com2\unimodem下復制和com1一樣的數據
                 2)、在HLM\ExtModems\HayesCompat下改寫Port為COM2:,再改寫FriendlyName為"Hayes Compatible 在 COM2:"。  
              
            8、如何定制自己的外殼  
               1)、先開發一個外殼軟件,假設名稱為MyShell.exe  
               2)、刪除注冊表[HKEY_LOCAL_MACHINE\init]下如下一行:  
                       "Launch50"="explorer.exe"  
                 3)、在注冊表[HKEY_LOCAL_MACHINE\init]下添加如下一行:  
                       "Launch50"="MyShell.exe"  
                 上述的“LaunchXX”中的XX為序列數,內核依據這個序列數按由小到大的順序來分別執行所有子鍵列出的應用程序,具體數值應該為多少請參考幫助文檔的說明。  
                 如果原來的內核中添加了標準外殼(standard shell)組件,或者添加了其它組件而這些組件需要依賴標準外殼,那么在PB中是無法刪除標準外殼組件的,解決辦法一是保留explorer.exe在內核中,二是刪除依賴標準外殼的組件。  

            9、我原來的工程是x86版本的,編譯選項只有x86,我如何能夠編譯ARM版本的  
            兩種辦法:  
               1)、用EVC新建一個工程的時候,建議復選“CPUs”列表,這樣發生了這種事情也能夠輕易通過選擇“WCE Configuration”工具欄中的CPU列表來編譯不同CPU版本的軟件  
                 2)、如果打開工程后CPU列表中只有x86,而此時已經安裝了ARM版本的SDK,那么單擊EVC菜單“build”-“configurations”,然后單擊“add”按鈕來添加CPU。  

              
            10、通常情況下WINCE采用串口1作為調試時輸出信息用途,要正式出產品前如何去掉串口1的調試功能,正常情況下串口1只有在編譯debug版本的內核時才在BootLoader中初始化串口1用于輸出信息,而編譯release版本會跳過此代碼。而有些BSP設計成沒有宏定義,也就是說無論什么版本都會在BootLoader中初始化串口1,這樣造成WINCE啟動后串口1無法被應用程序使用。對于這種情況只能在BootLoader源碼中刪除初始化代碼,如OEMInitDebugSerial。  
              
            11、基于wince的應用程序能建成console project么?  
                   不能  

            12、ARM系統外擴一片512K RAM,驅動程序經過映射可以使用這一段RAM。1、應用系統如何使用這一段RAM?要加一層驅動嗎?2、如果要將這一段RAM當作RAM盤存儲系統,該如何作呢?應該要加文件系統吧,如何加呢?
               解答這個問題前,先要說一下WINCE的地址映射機制。對于包含MMU(存儲器管理單元)的處理器來說,如ARM和x86,WINCE要求OEM在定制內核的時候填寫一個虛擬地址與物理地址映射關系的表,稱為OEMAddressTable,在這個表中定義了所有物理設備的起始物理地址,對應的起始虛擬地址,地址空間大小,RAM就包括在其中(如果是x86平臺還要求RAM起始虛擬地址從0x80000000開始)。如果有多片RAM,應該在OEMAddressTable中將它們定義在一起,使之地址連續。對于非OEM的開發者來說,他們拿到的是定制好的內核,不能做任何修改,如果在產品中外擴一片RAM,只能通過API函數通知操作系統增加一條虛擬地址與物理地址映射關系表項。相關API函數有兩個,分別是CreateStaticMapping和VirtualCopy。它們的相同之處是都用于建立物理地址和虛擬地址的映射關系。它們的不同之處是CreateStaticMapping映射的虛擬地址范圍在0xC400 0000 到 0xE000 0000之間,這個范圍只能由內核訪問,一般用于ISR訪問,因為ISR只能訪問靜態映射的虛擬地址空間,不能用VirtualCopy。VirtualCopy通常和VirtualAlloc配合使用,映射的虛擬地址空間在0x8000 0000以下,一般用于驅動程序和應用程序訪問。  
            1)、應用程序要訪問這片RAM,和驅動程序訪問方法一樣,調用VirtualAlloc和VirtualCopy。  
            2)、可以做一個流驅動程序專門用于讀寫這片RAM,這樣所有應用程序就可以通過調用流驅動接口函數來訪問,非要加文件系統也是可行的,通過修改注冊表就可以做到,但是麻煩一些。  

            13、我怎么能在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”添加到左邊的內核工程中。  

            14、 WINCE有沒有相對路徑概念?如果沒有如何得到當前模塊的路徑?  
                 1) 、WINCE沒有相對路徑概念,只有絕對路徑,所以凡是涉及到路徑均為絕對路徑。  
                 2)、調用API GetModuleFileName,傳遞一個模塊的實例句柄就能夠得到模塊的絕對路徑。  

            15、   怎樣讓 POCKET WORD打開*.dat格式(里面都是數據)的文件?
                 兩種辦法:  
                 1)、調用API ShellExecuteEx,在結構體SHELLEXECUTEINFO中添加.dat文件的路徑。  
                 2)、調用API CreateProcess,在第二個參數中設置.dat文件的路徑。  

            16、 x86 Rom Boot Loader真的可以實現嗎?它確實能代替BIOS啟動計算機?  
               Rom Boot 被設計存放在Flash/EEPROM中,也就是原來BIOS的位置,這樣當上電后CPU到固定地址執行代碼,也就是執行了Rom Boot的代碼,它對整個硬件系統進行初始化和檢測,并且支持通過網卡從遠程機器上下載nk.bin或者從本地IDE/ATA 硬盤的活動分區中尋找nk.bin文件加載。Rom Boot的優點就是引導并且加載速度快,而且它自身完成了所有的操作,這樣就不用BIOS、MSDOS,更不用Loadcepc了。  
              
            17、 對于x86 Rom Boot Loader,如何Build得到Romboot.rom?  
               1)、在PB中打開一個內核工程(x86的)
               2)、單擊PB菜單“Build”-“Open Build Release Directory”
               30 、用cd命令進入 %_WINCEROOT%\Platform\Geode\Romboot 4、build  
              
            18、如何設置、更改顯示分辨率  
                 能否設置、更改顯示分辨率由顯示驅動程序決定,而沒有統一的標準。例如CEPC,在啟動的時候可以通過設置loadcepc.exe的參數 /L來決定WINCE啟動后的顯示分辨率,這是由于顯示驅動“VGA Linear Framebuffer”支持,而Geode可以通過在定制內核時修改注冊表項來決定WINCE啟動后的顯示分辨率。  
              
            19、 幾個硬件使用同一個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處理。  
              
            20、請問在wince中如何在內核中增加一個與\windows同級的目錄?  
                 在platform.dat或者project.dat中添加語句。例如要創建根目錄下子目錄Program Files,語句如下:  
                 root:-Directory("Program Files")
            posted @ 2009-07-16 15:34 Sandy 閱讀(525) | 評論 (0)編輯 收藏
            昨天進行了上一季度的述職總結,自己也羅列了自身的一些問題,如單元測試不充分,需求理解不透徹,等等問題。領導也針對我的總結提出了幾點:
            一是一定要重視需求。這個贊同?,F在所作的項目頻繁的需求變更壓得有時不怎么重視需求。這點提得對。
            二是一定要重視單元測試。這個贊同,的確單元測試做得不是很充分,就拉上了系統測試,暴漏了很多問題。
            三是要有條理。這個贊同。首先我的述職報告條理性就沒有別人的好。一二三看起來不是很分明。所以這點以后要多加改進。層次也突出不好。其次呢就是學習要有條理,不能什么都想學。一定要有條理的學習。
            四是敬業精神。這個一開始不太好接受。自認為還比較敬業,主動發現問題和加班,敬業有佳。但回去思考了一晚,想想自己還真的不是很敬業,離真正的敬業還是很有差距的。主動發現問題,不只是一個方面,應該是多方面的,比如說原先代碼的不合理處,自己清楚,卻沒有主動提出改進方案。這個不是很敬業。所以以后需要好好改進。

            有這么多問題,所以一定要從自身找問題,積極改進。做一個積極向上的好人。
            posted @ 2009-07-16 09:37 Sandy 閱讀(493) | 評論 (0)編輯 收藏
            昨天發現了一個問題,在我們發布的產品中的各個版本都有。這是一個很棘手的問題。還好,已經有人對問題代碼進行了優化。
            但是問題又出來了,優化的代碼的接口變了。這又是問題。
            此時我就想把他的代碼改呀改,或者改我自己的代碼,以便利用他優化后的代碼。發現還是錯了。

            此時,經驗豐富的大師會告訴我利用派生,封裝。這的確是一個好辦法。看來面向對象的思想還沒有深入到我的骨髓,不能很好的體會和運用。

            這是昨天的一點收獲。拿到別人的代碼不要著急去改,如果要用的話,要學會派生和封裝,否則改壞了代碼,維護代價會更大的。
            不過收獲歸收獲,代碼封裝真的不是很好做,我最后還是放棄了。對比代碼的不同,進行修改。有些東西需要搞懂原理,這才是根本。

            posted @ 2009-07-15 09:39 Sandy 閱讀(220) | 評論 (0)編輯 收藏
            解決方案是:在編輯狀態下,點項目菜單 -> XXX屬性頁 -> 配置屬性 -> 清單工具,將右面的“使用FAT32解決辦法”選為“是”即可。

            摘自:http://space.loudly.cn/index.php/2/action_viewspace_itemid_63.html

            不過我的是英文的,路徑是Property Pages 下, Configuration Properties->Manifest Tool->General中,將Use FAT32 Work-around 選為Yes即可。
            posted @ 2009-07-14 13:45 Sandy 閱讀(267) | 評論 (0)編輯 收藏
            有一個內存泄露的問題,折騰了我很長時間了,這個問題存在,也確確實實是內存泄露了。把代碼查了一遍又一遍,就是沒有看出什么問題,也想了很多方式方法,似乎也都不見效。
            怎么辦呢?
            今天都在想是不是指針被修改了,造成的問題。
            發現少打印了一處,奇怪,為什么沒有走到那里?原來前面一個出錯判斷,我直接返回了,沒有走到刪除的那一步。哈哈,終于被我找到了。

            分析了一下原因:
            1、代碼的問題。代碼處理的邏輯還未負責,對此就有了遺漏。建議利用goto,最后做一些刪除的處理。這個道理明白,有時用起來就忘了。
            2、用心的問題。應該及早的發現該問題,但還是沒有認真的對自己的代碼進行審查造成的。所以以后要走到自己的代碼里面調,盡快發現問題。

            加油!不要再犯了。
            posted @ 2009-07-10 16:43 Sandy 閱讀(218) | 評論 (0)編輯 收藏

            今天在看Windows Mobile Team Blog的時候,看到關于SDK, DTK, DRK的文章,通過閱讀,簡單的了解一些。所以也和大家分享一下。
            摘自: SDK, DTK, DRK: WTF?!
            http://blogs.msdn.com/windowsmobile/archive/2009/06/04/sdk-dtk-drk-wtf.aspx

            SDK: Software Development Kit
            We have not released a new SDK for Windows Mobile 6.5. The Windows Mobile 6 Professional SDK or Windows Mobile 6 Standard SDK are required for Windows Mobile 6.5 application development.

            6.5 依然沿用了Windows Mobile 6 的SDK。

            DTK: Developer Toolkit
            The Windows Mobile 6.5 Developer Toolkit (DTK) is not an SDK! The DTK contains emulators, gesture APIs, and samples useful for developing Windows Mobile 6.5 applications. You will still need to install Visual Studio and the Windows Mobile 6 SDK prior to running the toolkit installer.

            6.5發布了一個開發包,下載地址是
            http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=20686a1d-97a8-4f80-bc6a-ae010e085a6e
            其中有了簡體中文的模擬器。
            在機子上安裝了一下,界面效果比原來好看許多,但是改動讓我有一些不熟悉。

            里面增加了幾個頭文件:
            <gesture.h>
            <GesturePhysicsEngine.h>
            <WindowAutoGesture.h>

            還有幾個附帶的例子。

            DRK: Developer Resource Kit

            The Windows Mobile Developer Resource Kit (DRK) is an offline DVD copy of the most useful and relevant Windows Mobile application development tools and resources. Traditionally the DRK does not contain any exclusive content, in that nearly everything on the DRK is available for download online. This time we are pleased to publish the Windows Mobile 6.5 DRK with several sample chapters of Microsoft Mobile Development Handbook from Microsoft Press (Wigley, Moth, and Foot).


            這個詞是我第一次聽說。沒有下過。

            posted @ 2009-07-08 15:34 Sandy 閱讀(1814) | 評論 (0)編輯 收藏

            【進程】

                Mobile 中的進程信息大體包含在PROCESSENTRY32結構中,我們可以獲得進程的諸多信息,此處無法獲得進程所占內存和CPU利用率。
            數據結構

            typedef struct tagPROCESSENTRY32 {

              DWORD dwSize;

              DWORD cntUsage;

              DWORD th32ProcessID;

              DWORD th32DefaultHeapID;

              DWORD th32ModuleID;

              DWORD cntThreads;

              DWORD th32ParentProcessID;

              LONG  pcPriClassBase;

              DWORD dwFlags;

              TCHAR szExeFile[MAX_PATH];

              DWORD th32MemoryBase;

              DWORD th32AccessKey;

              } PROCESSENTRY32;

              typedef PROCESSENTRY32* PPROCESSENTRY32;

                                          
            代碼示例

             1
             2// 創建快照句柄
             3
             4HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
             5
             6if (INVALID_HANDLE_VALUE != hSnapshot)
             7
             8{
             9
            10     // 先搜索系統中第一個進程的信息
            11
            12     Process32First(hSnapshot, &pe);
            13
            14     do{      
            15
            16           // 可通過pe獲取指定的信息
            17
            18//……
            19
            20          // 獲取感興趣的進程信息
            21
            22          //……
            23
            24          // 獲取進程所在路徑
            25
            26TCHAR processPath[MAX_PATH]
            27
            28          HPROCESS hProcess = OpenProcess(0, FALSE, pe.th32ProcessID);
            29
            30          if (NULL != hProcess)
            31              GetModuleFileName((HMODULE) hProcess, processPath, sizeof(processPath));
            32
            33          CloseHandle(hProcess);
            34
            35}
            while ( Process32Next(hSnapshot, &pe));
            36
            37// 關閉快照句柄
            38
            39CloseToolhelp32Snapshot(hSnapshot); 
            40
            41}

            42

             

             

            【模塊】

            已知進程ID,便可獲得對應各模塊的信息。在此介紹了如何獲得模塊的信息。

            數據結構



            代碼示例

             1MODULEENTRY32 me; // 定義模塊對象
             2me.dwSize = sizeof(me);
             3// 創建對應進程的模塊快照
             4HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe.th32ProcessID);
             5if (INVALID_HANDLE_VALUE != handle)
             6{
             7// 先搜索系統中第一個模塊的信息
             8Module32First(handle, &me);
             9    do{
            10          // 獲取模塊信息
            11          //……
            12// 獲取感興趣的模塊信息
            13//……
            14
            15          // 獲取模塊所在路徑
            16          GetModuleFileName(me.hModule, me.szExePath, sizeof(me.szExePath)); 
            17    }
            while (Module32Next(handle, &me));
            18// 關閉快照
            19CloseToolhelp32Snapshot(handle); 
            20 }

            21
            posted @ 2009-07-03 15:57 Sandy 閱讀(835) | 評論 (0)編輯 收藏
             

            藍牙的狀態有三種狀態,分別為:BTH_POWER_OFFBTH_CONNECTABLE、BTH_DISCOVERABLE

            三種狀態分別是關閉藍牙;打開藍牙,使藍牙可連接;打開連接,使藍牙可連接和可發現。

            獲取藍牙的狀態是利用API函數BthGetMode。設置藍牙的狀態是利用API函數BthSetMode。


            首先我們看一下BthGetMode
            其原型為:
            int BthGetMode(
              DWORD* pdwMode
            );
            其作用為:獲得藍牙設備當前的狀態模式.
            返回值:如果返回ERROR_SUCCESS ,則成功,否則失敗。

            pdwMode
            );
            其作用為:獲得藍牙設備當前的狀態模式.
            返回值:如果返回ERROR_SUCCESS ,則成功,否則失敗。

            BthSetMode
            其原型為:
            int BthSetMode(
              DWORD dwMode
            );
            其作用為:設置藍牙設備的狀態模式,并將它表現在控制面板上。自啟或硬件插入的時候都將維持此狀態模式。
            返回值:如果返回ERROR_SUCCESS ,則成功,否則失敗。

            比較簡單吧。不舉例了。

            posted @ 2009-07-03 15:45 Sandy 閱讀(491) | 評論 (0)編輯 收藏
            轉自: http://www.blogjava.net/TiGERTiAN/archive/2009/03/19/260906.html
            【實用技巧】Windows Mobile 手機連接電腦時,如何使用GPRS上網,同時跟電腦保持連接。(USB和GPRS共存問題)

            最近移動項目接近尾聲,以及很多相關的新項目又接踵而至,所以經常需要帶著手機到處去演示?,F在有個問題就是,我們連接的是移動專網,而且帶了手機卡驗證,沒有辦法通過互聯網去連接,這就需要我們一邊連著電腦一邊去連接GPRS上網,之前公司的D600搭配ActiveSync 4.5是可以的,就是把高級網絡功能關閉,這樣既可以連接電腦,又可以上GPRS,后來不知怎么的,不能用了。只好另想他法,在國外論壇上面,我發現了一個方法就是使用Pocket Controller。
            步驟是:
            1、先安裝PC上面的Pocket Controller,然后通過ActiveSync開啟高級網絡功能連接手機,然后Pocket Controller在連接時會自動提示給手機安裝客戶端。
            2、安裝完之后,在Pocket Controller中的設置里面,建立一個新的連接通過TCP/IP的。IP就是169.254.2.1
            3、確認手機開啟了TCP/IP連接允許,然后使用Pocket Controller去連接手機。連接成功之后,禁掉ActiveSync,也就是關閉連接設置里面的 允許USB連接和允許通過以下端口連接 兩項。
            4、這樣操作之后Pocket Controller仍然與手機保持連接,而且手機也可以上GPRS或者Edge了。

            還未進行驗證是否可行,先收入囊中,以防找不到了。
            posted @ 2009-07-01 11:08 Sandy 閱讀(665) | 評論 (0)編輯 收藏
            僅列出標題
            共15頁: 1 2 3 4 5 6 7 8 9 Last 
            国产AV影片久久久久久| 中文字幕久久欲求不满| 欧美久久一级内射wwwwww.| 久久综合狠狠综合久久激情 | 久久久久亚洲爆乳少妇无| 久久成人18免费网站| 一本一道久久a久久精品综合 | 综合久久国产九一剧情麻豆| 久久棈精品久久久久久噜噜| 久久免费高清视频| 久久午夜福利电影| 欧美久久一级内射wwwwww.| 伊人精品久久久久7777| 久久午夜夜伦鲁鲁片免费无码影视 | 久久99精品免费一区二区| 91久久精品视频| 久久久久亚洲精品中文字幕| 久久性精品| 久久久久免费精品国产| 久久精品18| 亚洲成色999久久网站| 久久久久久国产精品无码下载| 蜜臀久久99精品久久久久久| 亚洲伊人久久综合影院| 久久久免费精品re6| 91久久香蕉国产熟女线看| 四虎国产精品成人免费久久| 人妻无码久久一区二区三区免费| 无码8090精品久久一区| 久久青青草原精品国产| 久久国产乱子伦精品免费午夜| 国产A级毛片久久久精品毛片| 久久精品成人免费网站| 久久久婷婷五月亚洲97号色| 亚洲午夜精品久久久久久人妖| 亚洲日韩欧美一区久久久久我| 国产精品久久久久AV福利动漫| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 欧美久久久久久午夜精品| 久久久久久国产精品美女| 国内精品久久久久影院网站|