CE开发中可能遇到的问题
2012-11-26 11:14
405 查看
我会在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
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
相关文章推荐
- CE开发中可能遇到的问题(一)
- CE开发中可能遇到的问题
- CE开发中可能遇到的问题(一)
- CE开发中可能遇到的问题
- CE开发中可能遇到的问题
- CE开发中可能遇到的问题
- CE开发中可能遇到的问题
- 微信企业号开发可能遇到的问题
- android新浪微博开发-------授权部分实例+官方Api解析+可能遇到的问题
- 使用CMake + MinGW + Eclipse 开发OpenCV --编译,使用以及可能遇到的问题详解
- android studio 开发jar包的一般步骤及可能遇到的问题(包含AS升级到3.1版本)
- [Windows通用应用开发] 代码编写StoryBoard时可能遇到的几个问题
- Win10 下使用 VS2008 开发 WinCE 应用可能遇到的问题
- Android开发过程中可能遇到的问题
- vs2010 学习Silverlight学习笔记(1):用vs2010开发Silverlight时可能遇到的问题
- 百度地图 导航开发 可能遇到问题
- 安装 ZendServer-CE 可能遇到的问题
- 网页ActiveX插件开发可能遇到的几个问题
- JavaWEB开发项目可能遇到的问题
- [DragDraw开发]Vista/XP下IIS配置可能遇到的问题收集