CE開發中可能遇到的問題

來源:互聯網
上載者:User

我會在blog中將開發CE5.0時遇到的問題總結出來,供有遇到相同問題的朋友參考。因為我在解決這些問題時,也是參考了網上很多朋友的文章或文章,在這裡對他們表示一下感謝呵呵。 我對問題的解釋如果有不對的地方還請高手指正,免得誤人子弟哈。

1.       如何加入或刪除BSP中的模組。

這裡以display驅動為例來講解。

BSP的根目錄下有一個$(platform name).bat檔案。裡面定義了一系列的開關,比如:

set BSP_NODISPLAY=

set BSP_NODISPLAY=1

我們可以在workspace下的platform.bib中可以看到有這麼一段定義:

IF BSP_NODISPLAY !

    S3C2440DISP.dll        $(_FLATRELEASEDIR)/S3C2440DISP.dll          NK  SH

ENDIF BSP_NODISPLAY !

因此,如果我們在.bat中定義了BSP_NODISPLAY為1,則S3C2440DISP.dll不會被加入到NK中。反之,則在產生NK的時候需要加入S3C2440DISP.dll。

 

而如何將display驅動加入編譯列表呢。這就要看WINCE500/PLATFORM/$(platform name)/Src/Drivers下的dirs檔案了。檔案裡枚舉了要參與編譯的子檔案夾。display驅動在Display檔案夾內。因此,如果要將display驅動加入編譯,則要在dirs檔案中加入Display檔案夾,反之則去掉。

再看Display檔案夾內的內容,看到有一個sources檔案,裡面有這麼一段:

TARGETNAME=S3C2440DISP

TARGETTYPE=DYNLINK

表示將會產生一個名為S3C2440DISP的動態連結程式庫。

 

看到這裡就明白了,如果要加入或刪除BSP中的驅動,要改動檔案有:

$(platform name).bat:添加或修改開關

dirs:決定驅動代碼是否參與編譯

platform.bib:如果在加入新的驅動時,需要修改這裡,把新的驅動加入NK中。

 

2.       在build自己配置的OS時,可能遇到的幾個錯誤及其解決方案

我曾經遇到過這個錯誤:

BUILD: [01:0000000341:ERRORE] PowerButton.obj : error LNK2019: unresolved external symbol SetSystemPowerState referenced in function PWR_IST

BUILD: [01:0000000342:ERRORE] PowerButton.obj : error LNK2019: unresolved external symbol GetSystemPowerState referenced in function PWR_IST

BUILD: [01:0000000343:ERRORE] C:/WINCE500/platform/smdk2440a/target/ARMV4I/debug/PowerButton.dll : fatal error LNK1120: 2 unresolved externals

根據資訊,看出是在產生driver裡的power button時,找不到兩個函數。我查了文檔,這兩個函數都是聲明在coredll.lib中的,然後我又去看了我產生的coredll.lib,發現的確找不到這兩個函數。檢查了一下OS的組件,發現原來是因為沒有把power management組件添加進來。

 

而下面這個錯誤就明顯了:

BUILD: [01:0000000445:ERRORE] NMAKE :  U1073: don't know how to make 'C:/WINCE500/PBWorkspaces/tiny_kernel/WINCE500/smdk2440a_ARMV4I/cesysgen/sdk/lib/ARMV4I/debug/ndis.lib'

BUILD: [01:0000000447:ERRORE] NMAKE.EXE   -i -c BUILDMSG=Stop.  LINKONLY=1 NOPASS0=1 MAKEDLL=1 failed - rc = 2

這個就是因為沒有添加NDIS相關組件,導致在編譯BSP裡網路相關的driver時,找不到相應的lib而報錯。

 

3.       沒有產生stepldr.bin和eboot.bin

檢查一下是不是在debug模式下,如果是,切換到release模式下就可以了。

 

4.       遇到Error - cannot open input file <...> /postproc/nlscfg.inf

運行Build OS下的Copy Files to Release Directory

 

5.       BLDDEMO: There were errors building (projectname),但error為0

把clean before building勾上,再sysgen一次。

 

6.       在編譯BSP的內容時,出現:

NMAKE :  U1073: don't know how to make 'C:/WINCE500/public/common/sdk/lib/ARMV4I/retail/coredll.lib'

我檢查了log,發現在此之前是一句

Linking /WINCE500/PLATFORM/SMDK2440A/Src/Common/Smartmedia/Dll/ directory.

因此看出是在smartmedia/dll檔案夾裡面出了問題。開啟這個檔案夾,開啟裡面的sources檔案,可以看到coredll.lib被定義為

$(_COMMONSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib

而error資訊為C:/WINCE500/public/common/sdk/lib/ARMV4I/retail/coredll.lib

說明_COMMONSDKROOT等於C:/WINCE500/public/common/sdk,而此時_COMMONSDKROOT應該跟_SYSGENSDKROOT一樣才是對的。

 

在WINCE500/PUBLIC/COMMON/OAK/MISC/sources.default中,有如下定義

_COMMONSDKROOT=$(_COMMONPUBROOT)/sdk

_COMMONOAKROOT=$(_COMMONPUBROOT)/oak

_COMMONDDKROOT=$(_COMMONPUBROOT)/ddk

_SYSGENSDKROOT=$(_PROJECTROOT)/cesysgen/sdk

_SYSGENOAKROOT=$(_PROJECTROOT)/cesysgen/oak

_SYSGENDDKROOT=$(_PROJECTROOT)/cesysgen/ddk

 

我又參看了makefile.def中對_ COMMONPUBROOT的定義:

比較長,共分了四種情況

(1) OS projects during sysgen

(2) OS projects during compile

(3) WINCEPROJ projects

(4) Other projects.

其中,在build BSP的時候,應該是屬於第四種。

為了便於理解,我去掉了log和注釋。

!if "$(_IN_CESYSGEN)" != ""

_COMMONPUBROOT=$(_PUBLICROOT)/common

__PROJROOT = $(_PROJECTROOT)/cesysgen

!else if ("$(WINCETREE)" == "winceos") || EXIST($(_PUBLICROOT)/$(WINCETREE)/cesysgen/makefile)

_COMMONPUBROOT=$(_PUBLICROOT)/common

__PROJROOT = $(_PUBLICROOT)/$(WINCEPROJ)

!else if "$(WINCEPROJ)" != ""

_COMMONPUBROOT=$(_PROJECTROOT)/cesysgen

__PROJROOT = $(_PUBLICROOT)/$(WINCEPROJ)

!else

_COMMONPUBROOT=$(_PROJECTROOT)/cesysgen

__PROJROOT = $(_PROJECTROOT)

!endif

為了搞清楚是怎麼回事,我修改了makefile.def,加入MESSAGE語句,看看在build的時候到底跑到了哪個分支裡。

修改完後,進入控制台,進入smartmedia/dll檔案夾下,輸入build。運行完後,開啟檔案夾下的build.log,發現跑到了第二種情況裡。

原來是因為EXIST($(_PUBLICROOT)/$(WINCETREE)/cesysgen/makefile這個條件滿足了。

其中_PUBLICROOT即WINCE500/public,而WINCETREE在makefile.def中定義為WINCETREE=$(_CURSLMTREE),從set命令中可以查到,_CURSLMTREE是項目名,我的項目名是voip。則整個路徑就成了

WINCE500/public/voip/cesysgen/makefile,結果這個路徑恰好存在,囧。

看來以後給項目起名字要複雜點,避免這個衝突,不然真是搞死人啊。

 

7.       Warning: Image exceeds specified memory size by 4012 bytes and may not run.

核心組件加多了,超出了config.bib原有的定義。因此修改config.bib,增加RAMIMAGE的大小。注意,修改的是workspace下的config.bib而不是PLATFORM下的。我之前直接在platform builder的parameter view裡面修改,結果改的config.bib根本就不會被工程訪問到。

另外,最好把ROMSIZE也改成RAMIMAGE一樣的大小,這樣NK.nb0就可以裝下整個NK了,否則會產生NK.nb1甚至更多。

 

但有可能在下載NK.bin的時候會發生錯誤,原因是eboot中有兩個宏定義要和config.bib保持一致。ROM_RAMIMAGE_START和ROM_RAMIMAGE_SIZE。這兩個宏要和config.bib中的RAMIMAGE的相關定義保持一致。

 

這樣改完後,就可以正常運行了。

 

8.       直接用DNW將.nb0下載到RAM中無法運行

檢查一下DNW的configuration中的download address,要和你下載的.nb0對應的.bib中RAMIMAGE的起始地址保持一致,但RAMIMAGE規定的是虛擬位址,而DNW的download address是物理地址,要通過尋找MMU映射表,將其轉換為物理地址。CE5.0上的映射表在oemaddrtab_cfg.inc檔案中。

9.要使用ActiveSync除了SYSGEN_AS_BASE之外,還需要哪些其他組件才能使用

SYSGEN_USBFN_SERIAL和SYSGEN_PPP。當然,如果你想使用EVC上的遠端偵錯工具,還需要加入Platform Manager組件。

 

10.修改OAL中的編譯開關

log.c中,定義了:

UINT32 g_oalLogMask = OAL_LOG_ERROR|OAL_LOG_WARN|OAL_LOG_INFO;

oal_log.h中,定義了

#define OAL_LOG_ERROR       (0)

#define OAL_LOG_WARN        (1)

#define OAL_LOG_FUNC        (2)

#define OAL_LOG_INFO        (3)

然後#define OALZONE(n)          (g_oalLogMask&(1<<n))

那我就覺得奇怪了,為啥在定義g_oalLogMask的時候,不是移位了再或呢?

我先嘗試了一下,將定義修改為UINT32 g_oalLogMask = OAL_LOG_ERROR|OAL_LOG_WARN|OAL_LOG_INFO|OAL_LOG_IO|OAL_LOG_FUNC;

但發現Trace並沒有什麼變化。看來對g_oalLogMask的修改是無效的,所以最好的方法是在OEMInit的一開始中,調用OALLogSetZones來設定要開啟的ZONE。

11. 修改了微軟的代碼如何編譯

第一步,進入命令列模式

第二步,進入要編譯的檔案的目錄,build

第三步,sysgen 模組名  
第四步,makeimg

12. 按下開發板複位鍵記憶體不會掉電,所以如果出現奇怪的情況,最好斷電再次上電看看。

from : http://blog.csdn.net/liuvictor2005/article/details/2581207

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.