加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

WINCE多个BSP包合并总结

发布时间:2020-12-15 18:29:35 所属栏目:百科 来源:网络整理
导读:? 1. ?????? 合并的背景 项目 A 和 B 都是采用同一个处理器和操作系统, B 项目的外围设备基本上是 A 项目下的一个子集, GPIO 口的分配也基本一样,不同的是显示屏采用的接口不一样, A 项目用 I80 接口,而 B 项目采用 RGB 接口,在我来公司之前,可能是因

?

1.?????? 合并的背景

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

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

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

?

这部分涉及到dirs文件和 smdk2451.bat文件,因为项目A比项目B多了dirvierCdirverD驱动文件夹,在编译B项目的系统时间,不需要编译dirvierCdirverD,那该怎么处理呢?首先在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

再结合smdk2451SRCDRIVERS文件夹下dirs文件下面的内容就可以实现:

DIRS=

drvlib?

……

??? BACKLIGHT

?

OPTIONAL_DIRS=dirvierC

??????????????????????????? ? dirverD?

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

?

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

OPTIONAL_DIRS=STEPLDR

??????????????????????????? NBL1.LSB

??????????????????????????? NBL2

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

DIRS=??

???????? NBL1.IROM_SD ??????????????

???????? Eboot

DIRS这部分是MLCSLC共有的源代码文件夹,如果我当前要编译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.batsources的控制,比如bootloaderebootsources下的一部分内容如下:

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

INCLUDES=$(INCLUDES);$(_TARGETPLATROOT)srcinc;$(_TARGETPLATROOT)srcWhimoryInc;$(_TARGETPLATROOT)srcWhimoryCoreVFL;$(_TARGETPLATROOT)srcWhimoryOAMOSLess;

!ENDIF

?

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

INCLUDES=$(INCLUDES);$(_TARGETPLATROOT)SrcCommonSmartmediaFmd

!ENDIF

其中INCLUDES指定额外的要搜索的头文件的路径,这里的重点是通过判断是否在smdk2451.bat中定义BSP_MLC还是BSP_SLC来决定是否包含要额外的要搜索的头文件的路径了。如此类推,sources文件中的其他部分,如TARGETLIBSSOURCES部分也用这样的方式来控制,比如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来做对应的处理了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读