CE開發中可能遇到的問題

原文地址:http://www.5icceu.com/article.asp?id=20970

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. 按下開發板復位鍵內存不會掉電,所以如果出現奇怪的情況,最好斷電再次上電看看

>

發佈了31 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章