按以下方式添加自己的catalog item,但是对应的变量却没有被定义,wince机关重重啊

时间:2022-07-23 18:02:07
PXA3** + wince6.0, 现有两种屏独立的驱动,需要将这两套代码整合下,用宏区分,然后通过编译前在Catalog items view勾选不同选项控制,我先用catalog编辑器修改了:

\WINCE600\PLATFORM\pxa303_bsp\CATALOG 下的***.pbcxml文件,在原display driver项下添加了一个新的item,同时配置了它的属性,且其关联变量为display_driver_panel_b;原驱动对应一种屏,其变量为display_driver_panel_a。

然后修改了BIB、注册表中的宏控制部分,并且在一套代码内用如下方式将二种屏的代码做了区分:

#ifdef display_driver_panel_b
...
hbp = 2;
hfp = 3;
...
#endif 

#ifdef display_driver_panel_a
...
#endif


按上述方式改完后,勾选了panel b对应的Item,编译,但到显示驱动时,却提示找不到hbp  hfp的定义,看来是display_driver_panel_b没有被配置上。

不知道还有那些机关需要处理,想来Item创建好了,勾选后应该能配置其对应的宏啊。
请大家帮忙看下吧,多谢。




11 个解决方案

#1


让代码里面判断环境变量吗?如果没记错的话,需要修改source文件。

#2


对,在驱动代码里判断。
修改driver\目录下的source?
bsp里原就有一套显示驱动了,新的屏的驱动就修改了一些时序参数,所以我就在原驱动上加了,这样source文件不用修改吧

#3


display_driver_panel_b是编译window里的环境变量display_driver_panel_a,你可以通过右键你的CE工程,然后Open Release Directory in Build Window来打开编译window,然后set display_driver_panel来看你的环境变量时候按你的需求设置为1。

把环境变量转换为CPP代码里的宏,需要在sources文件里做个转换,比如

!IF "$(display_driver_panel_a)"=="1"
CDEFINES= $(CDEFINES) -Ddisplay_driver_panel_a
!ENDIF

!IF "$(display_driver_panel_b)"=="1"
CDEFINES= $(CDEFINES) -Ddisplay_driver_panel_b
!ENDIF

上面的-Ddisplay_driver_panel_a就是传给编译器cl.exe的参数,表示定义一个宏display_driver_panel_a。类似你在代码里写#define display_driver_panel_a

#4


我第一句话是想说“ display_driver_panel_b和display_driver_panel_a是编译window里的环境变量

#5


另外,只有c/cpp代码需要在sources里做这种转换。.reg/.bib文件里可以直接用环境变量过滤

#6


学习了

#7


一同学习

#8


十分感谢xdkui!
应该就是这儿的问题了,原以为勾选后,系统会自动将这些变量做进一步处理。
感谢kacyquan,你没记错,我理解错了,呵呵。



#9


再贴个网友写的:

系统定义的环境变量是没法在C语言和汇编语言中起作用的,如果非要这样做
可以按照以下的步骤
1、在bsp根目录中修改 .bat 文件, 
add: 
set IS_LCD_240X320=1 

2、在bsp根目录中修改SOURCES.CMN 文件, 
add: 
!IF "$(IS_LCD_240X320)" == "1"
CDEFINES= $(CDEFINES) -DIS_LCD_240X320
!ENDIF

注:IS_LCD_240X320 必须全为大写 

更详细的用法参考以下说明 
Quote 
发篇CE BSP开发入门的文章
CE BSP开发入门之重要的配置文件 BSP中有一些很重要的文件,我们在开发过程中必须要给予足够的重视。 
1 mybsp.bat,位于BSP的根目录中,用于定义一些全局的环境变量,比如定义某个驱动的环境变量,从而使生成的系统支持此驱动。其实,这个文件在大多数的BSP里,例如2410的,对应的文件就是smdk2410.bat.
2 source.cmn,位于BSP的根目录中,主要用于定义一些BSP及DRIVER中会用到的预定义及环境变量。 
一般这个文件有以下作用: 
1)定义INCLUDES,这样,BSP中的其它目录中就不用特别定义INCLUDES了。 
2)根据系统定义的一些环境变量而定义C语言与汇编语言使用的预定义,这一点特别重要,系统定义的环境变量是没法在C语言和汇编语言中起作用的,这一点在Cirrus的BSP中表现最为突出。使用该BSP,可以在Workspace文件中定义硬件平台类型,SDRAM及FLASH的地址,大小等信息。当然,也可以在各个模块的SOURCES文件中定义这些东西,但如果两个以上的模块中使用相同的环境变量,则在这个文件中定义更加方便,因为在这定义一次,每个模块都可以使用,而不需要在各模块中各自定义。 
CDEFINES定义C语言使用的变量,ADEFINES定义汇编评议中使用的变量,例如, 

ADEFINES=$(ADEFINES) -pd "FLASH_TYPE SETS \"J3\"" 
CDEFINES=$(CDEFINES) -DFLASH_TYPE=J3 
分别为汇编语言和C语言设置FLASH_TYPE为"J3",需要注意的是C语言中好像没法将一个变量定义成字符串. 

3.dirs.这个文件用于指定在当前目录中有哪些目录需要被编译. 

4.sources.这个文件定义当前目录的代码生成DLL/LIB等模块时的必要信息,主要有以下几项. 

TARGETNAME,定义模块名称. 
TARGETTYPE,模块的种类,可以是DYNLINK, LIBRARY,EXE. 
如果TARGETTYPE是DLL,则可以定义DLLENTRY,将Dll入口定义成别的不是DLLMain的函数 
如果TARGETTYPE是EXE,则可以定义EXEENTRY,用于指定EXE的入口函数. 

INCLUDES,如果一个模块需要使用非标准路径下的头文件时,需要定义INCLUDES,用于包含更多的头文件路径,用法如下: 

INCLUDES=$(INCLUDES);\new directory\...,注意定义新的INCLUDES时,需要包含INCLUDES原来的值. 

TARGETLIBS,SOURCELIBS用于定义该模块需要链接哪些库文件.我不知道这两个的具体区别,如果某个库文件链接时发生了错误,可以把它移到另一个变量下试试. 

WINCECOD,如果将其定义为1,则编译器会为每一个文件生成.cod文件,它是一个汇编文件. 

SOURCES,定义该模块需要哪些源文件。

#10


这个宏很特别啊,注意哦

#11


该回复于2012-08-17 08:20:18被版主删除

#1


让代码里面判断环境变量吗?如果没记错的话,需要修改source文件。

#2


对,在驱动代码里判断。
修改driver\目录下的source?
bsp里原就有一套显示驱动了,新的屏的驱动就修改了一些时序参数,所以我就在原驱动上加了,这样source文件不用修改吧

#3


display_driver_panel_b是编译window里的环境变量display_driver_panel_a,你可以通过右键你的CE工程,然后Open Release Directory in Build Window来打开编译window,然后set display_driver_panel来看你的环境变量时候按你的需求设置为1。

把环境变量转换为CPP代码里的宏,需要在sources文件里做个转换,比如

!IF "$(display_driver_panel_a)"=="1"
CDEFINES= $(CDEFINES) -Ddisplay_driver_panel_a
!ENDIF

!IF "$(display_driver_panel_b)"=="1"
CDEFINES= $(CDEFINES) -Ddisplay_driver_panel_b
!ENDIF

上面的-Ddisplay_driver_panel_a就是传给编译器cl.exe的参数,表示定义一个宏display_driver_panel_a。类似你在代码里写#define display_driver_panel_a

#4


我第一句话是想说“ display_driver_panel_b和display_driver_panel_a是编译window里的环境变量

#5


另外,只有c/cpp代码需要在sources里做这种转换。.reg/.bib文件里可以直接用环境变量过滤

#6


学习了

#7


一同学习

#8


十分感谢xdkui!
应该就是这儿的问题了,原以为勾选后,系统会自动将这些变量做进一步处理。
感谢kacyquan,你没记错,我理解错了,呵呵。



#9


再贴个网友写的:

系统定义的环境变量是没法在C语言和汇编语言中起作用的,如果非要这样做
可以按照以下的步骤
1、在bsp根目录中修改 .bat 文件, 
add: 
set IS_LCD_240X320=1 

2、在bsp根目录中修改SOURCES.CMN 文件, 
add: 
!IF "$(IS_LCD_240X320)" == "1"
CDEFINES= $(CDEFINES) -DIS_LCD_240X320
!ENDIF

注:IS_LCD_240X320 必须全为大写 

更详细的用法参考以下说明 
Quote 
发篇CE BSP开发入门的文章
CE BSP开发入门之重要的配置文件 BSP中有一些很重要的文件,我们在开发过程中必须要给予足够的重视。 
1 mybsp.bat,位于BSP的根目录中,用于定义一些全局的环境变量,比如定义某个驱动的环境变量,从而使生成的系统支持此驱动。其实,这个文件在大多数的BSP里,例如2410的,对应的文件就是smdk2410.bat.
2 source.cmn,位于BSP的根目录中,主要用于定义一些BSP及DRIVER中会用到的预定义及环境变量。 
一般这个文件有以下作用: 
1)定义INCLUDES,这样,BSP中的其它目录中就不用特别定义INCLUDES了。 
2)根据系统定义的一些环境变量而定义C语言与汇编语言使用的预定义,这一点特别重要,系统定义的环境变量是没法在C语言和汇编语言中起作用的,这一点在Cirrus的BSP中表现最为突出。使用该BSP,可以在Workspace文件中定义硬件平台类型,SDRAM及FLASH的地址,大小等信息。当然,也可以在各个模块的SOURCES文件中定义这些东西,但如果两个以上的模块中使用相同的环境变量,则在这个文件中定义更加方便,因为在这定义一次,每个模块都可以使用,而不需要在各模块中各自定义。 
CDEFINES定义C语言使用的变量,ADEFINES定义汇编评议中使用的变量,例如, 

ADEFINES=$(ADEFINES) -pd "FLASH_TYPE SETS \"J3\"" 
CDEFINES=$(CDEFINES) -DFLASH_TYPE=J3 
分别为汇编语言和C语言设置FLASH_TYPE为"J3",需要注意的是C语言中好像没法将一个变量定义成字符串. 

3.dirs.这个文件用于指定在当前目录中有哪些目录需要被编译. 

4.sources.这个文件定义当前目录的代码生成DLL/LIB等模块时的必要信息,主要有以下几项. 

TARGETNAME,定义模块名称. 
TARGETTYPE,模块的种类,可以是DYNLINK, LIBRARY,EXE. 
如果TARGETTYPE是DLL,则可以定义DLLENTRY,将Dll入口定义成别的不是DLLMain的函数 
如果TARGETTYPE是EXE,则可以定义EXEENTRY,用于指定EXE的入口函数. 

INCLUDES,如果一个模块需要使用非标准路径下的头文件时,需要定义INCLUDES,用于包含更多的头文件路径,用法如下: 

INCLUDES=$(INCLUDES);\new directory\...,注意定义新的INCLUDES时,需要包含INCLUDES原来的值. 

TARGETLIBS,SOURCELIBS用于定义该模块需要链接哪些库文件.我不知道这两个的具体区别,如果某个库文件链接时发生了错误,可以把它移到另一个变量下试试. 

WINCECOD,如果将其定义为1,则编译器会为每一个文件生成.cod文件,它是一个汇编文件. 

SOURCES,定义该模块需要哪些源文件。

#10


这个宏很特别啊,注意哦

#11


该回复于2012-08-17 08:20:18被版主删除