1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      CE開發(fā)中可能遇到的問題

      更新時間: 2011-10-28 09:31:36來源: 粵嵌教育瀏覽量:1330

        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的動態(tài)鏈接庫。

        看到這里就明白了,如果要加入或刪除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

        根據(jù)信息,看出是在生成driver里的power button時,找不到兩個函數(shù)。我查了文檔,這兩個函數(shù)都是聲明在coredll.lib中的,然后我又去看了我生成的coredll.lib,發(fā)現(xiàn)的確找不到這兩個函數(shù)。檢查了一下OS的組件,發(fā)現(xiàn)原來是因為沒有把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的內容時,出現(xiàn):

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

        我檢查了log,發(fā)現(xiàn)在此之前是一句

        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,發(fā)現(xiàn)跑到了第二種情況里。

        原來是因為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的時候會發(fā)生錯誤,原因是eboot中有兩個宏定義要和config.bib保持一致。ROM_RAMIMAGE_START和ROM_RAMIMAGE_SIZE。這兩個宏要和config.bib中的RAMIMAGE的相關定義保持一致。

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

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

        檢查一下DNW的configuration中的download address,要和你下載的.nb0對應的.bib中RAMIMAGE的起始地址保持一致,但RAMIMAGE規(guī)定的是虛擬地址,而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;

        但發(fā)現(xiàn)Trace并沒有什么變化??磥韺_oalLogMask的修改是無效的,所以的方法是在OEMInit的一開始中,調用OALLogSetZones來設置要打開的ZONE。

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

        步,進入命令行模式

        第二步,進入要編譯的文件的目錄,build

        第三步,sysgen 模塊名

        第四步,makeimg

        12. 按下開發(fā)板復位鍵內存不會掉電,所以如果出現(xiàn)奇怪的情況,斷電再次上電看看。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲中文字幕网 | 亚洲AV秘一区二区三区 | 日本综合久久久久久久久久久 | 中文字幕乱码亚洲∧ⅴ日本 | 日韩精品一区二区三区中文在线 | 伊人久久综在合线亚洲2019人澡 |