注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

男儿当自强的博客

每天进步一点

 
 
 

日志

 
 
 
 

WINCE多个BSP包合并总结  

2012-10-11 08:37:09|  分类: wince驱动开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1.       合并的背景

项目A和B都是采用同一个处理器和操作系统,B项目的外围设备基本上是A项目下的一个子集,GPIO口的分配也基本一样,不同的是显示屏采用的接口不一样,A项目用I80接口,而B项目采用RGB接口,在我来公司之前,可能是因为各自开发方便,A和B项目就维护独立的BSP包,但这样的方式的缺点就是,假如你解决了A项目和B项目中共同的bug的时候,就要把相应的代码分别移植到这两个BSP包中,这不仅增加没必要的工作量,而且有可能会出错。

随着项目A和项目B的推进,发现之前采用的MLC flash不是很稳定,偶尔会出现丢固件的现象,就决定了换为SLC flash,所以A项目就有MLC和SLC这两个BSP,B项目也会有自己的MLC和SLC这两个BSP,这样就需要开发和维护4个BSP包,这肯定会浪费很多时间做没有效益的维护,为了节省时间及便于后续的维护和开发,我决定把这4个BSP包合并为一个BSP包,下面就合并过程中遇到的问题和解决的方式总结一下。

2.       不通的项目通过设置环境变量指定需要编译的文件夹

 

这部分涉及到dirs文件和 smdk2451.bat文件,因为项目A比项目B多了dirvierC和dirverD驱动文件夹,在编译B项目的系统时间,不需要编译dirvierC和dirverD,那该怎么处理呢?首先在smdk2451.bat文件做如下定义

Set   BSP_PROJECT_A=1

Set   BSP_PROJECT_B=

 

set BUILD_OPTIONS=

if /i "% BSP_PROJECT_A %"=="" set BUILD_OPTIONS=%BUILD_OPTIONS% dirvierC    dirverD

再结合smdk2451\SRC\DRIVERS文件夹下dirs文件下面的内容就可以实现:

DIRS=\

drvlib  \

……

    BACKLIGHT\

 

OPTIONAL_DIRS=dirvierC\

                              dirverD\ 

DIRS后面指定项目A和项目B共有的需要编译的驱动文件夹,OPTIONAL_DIRS指定可以选择编译的目录。比如:OPTIONAL_DIRS=proj1,如果想编译proj1目录,可以设置BUILD_OPTIONS=proj1,然后运行build命令就可以了。这里是指如果要编译A项目,在dirvers驱动文件夹下就需要多编译dirverC和dirverD这两个目录下的源代码。

 

我们的项目A又因为需要支持MLC和SLC,而MLC和SLC需要支持的源代码是不一样的,在bootloader文件夹下有MLC和SLC共用的文件夹有NBL1.IROM_SD和Eboot,而MLC还有NBL1.LSB和NBL2,,SLC有STEPLDR,对于MLC系统,我只想编译共用的和NBL1.LSB和NBL2文件夹,对于SLC系统来说,我只想编译共用的和STEPLDR文件夹,那么该如何处理呢?见bootloader\dirs中的内容:

OPTIONAL_DIRS=STEPLDR\

                            NBL1.LSB\

                            NBL2\

这是SLC和MLC分别独有的代码,由smdk2451.bat部分来控制编译

DIRS=   \

         NBL1.IROM_SD                \

         Eboot

DIRS这部分是MLC和SLC共有的源代码文件夹,如果我当前要编译MLC的系统,在下smdk2451.bat中的处理部分如下:

set BSP_MLC=1

set BSP_SLC=

if /i "%BSP_MLC%"=="1" set BUILD_OPTIONS=%BUILD_OPTIONS% NBL1.LSB NBL2

if /i "%BSP_SLC%"=="1" set BUILD_OPTIONS= %BUILD_OPTIONS% STEPLDR

其他部分的源代码文件夹在那个项目哪个配置下是否需要编译,有了上面这些介绍,应该就很容易控制了。

 

3.       不同的项目通过环境变量编译不同的源代码文件等

这部分主要涉及smdk2451.bat和sources的控制,比如bootloader\eboot\sources下的一部分内容如下:

!IF "$(BSP_MLC)" == "1"

INCLUDES=$(INCLUDES);$(_TARGETPLATROOT)\src\inc;$(_TARGETPLATROOT)\src\Whimory\Inc;$(_TARGETPLATROOT)\src\Whimory\Core\VFL;$(_TARGETPLATROOT)\src\Whimory\OAM\OSLess;

!ENDIF

 

!IF "$(BSP_SLC)" == "1"

INCLUDES=$(INCLUDES);$(_TARGETPLATROOT)\Src\Common\Smartmedia\Fmd

!ENDIF

其中INCLUDES指定额外的要搜索的头文件的路径,这里的重点是通过判断是否在smdk2451.bat中定义BSP_MLC还是BSP_SLC来决定是否包含要额外的要搜索的头文件的路径了。如此类推,sources文件中的其他部分,如TARGETLIBS、SOURCES部分也用这样的方式来控制,比如SOURCES部分,MLC需要多编译nand_mlc.cpp文件,而SLC需要多编译nand_slc.cpp,那么可以这样处理:

對不起, 上一篇打錯字了, 請參考這一篇
SOURCES= \

         startup.s \

    util.s \

main.c \

……

              nand.s\
!IF "$(BSP_MLC)" == "1"
SOURCES=$(SOURCES) nand_mlc.cpp
!ENDIF
!IF "$(BSP_SLC)" == "1"
SOURCES=$(SOURCES) nand_slc.cpp
!ENDIF

这里很巧妙地用到了$(SOURCES),那么SOURCES=$(SOURCES) nand_mlc.cpp就可以把上面共用的部分和nand_mlc.cpp合并起来,告诉编译器此驱动文件夹需要编译的源代码文件。

 

另外学习一下sources文件下CDEFINES的定义

!IF "$(BSP_LCDTYPE)" == "LCD_HX"

CDEFINES=$(CDEFINES) -DLCD_HX

!ENDIF

表示如果在环境变量BSP_LCDTYPE的值为LCD_HX,就定义LCD_HX,其中它前面的-D相当于#define的意思,这样此sources文件中的文件都可以使用LCD_HX来做对应的处理了。


  评论这张
 
阅读(1093)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017