【RT-Thread】独立开发BSP工程指南(从RT-Thread源码中分离,第三部分)

上一篇:【RT-Thread】将BSP工程从RT-Thread源码中独立出来开发(2)

接上回

在使用 menuconfig 配置项目时,如果使能了 SPI 的驱动,如下:

(Top) ->
	RT-Thread Components ->
		Device Drivers ->
			[*] Using SPI Bus/Device device drivers

在使用 scons --target=cmake 生成 CMake 工程时,就出现错误了:

$ scons --target=cmake
scons: Reading SConscript files ...
TypeError: can only concatenate deque (not "list") to deque:
  File "D:\00_Workspace\01_software_proj\embed_proj\stm32f103-fire-arbitrary\SConstruct", line 60:
    DoBuilding(TARGET, objs)
  File "D:\00_Workspace\01_software_proj\embed_proj\rt-thread\tools\building.py", line 808:
    local_group(group, objects)
  File "D:\00_Workspace\01_software_proj\embed_proj\rt-thread\tools\building.py", line 766:
    CPPDEFINES = Env.get('CPPDEFINES', ['']) + group.get('LOCAL_CPPDEFINES', [''])

错误 can only concatenate deque (not "list") to deque 表示两种类型的变量无法合并,该错误发生在 File "D:\00_Workspace\01_software_proj\embed_proj\rt-thread\tools\building.py", line 766:

分析 Env.get('CPPDEFINES', [''])group.get('LOCAL_CPPDEFINES', ['']) ,使用 type() 打印变量类型,发现前者是 collections.deque 类型,而后者是 list 类型,因此错误发生在这两个不同类型的变量无法简单的相加。

但是在之前的RTT源码中,我也使用过 SPI 驱动,并没有发现这个问题,因此,可能有以下原因:

  • bsp 独立出来导致某些问题
  • RTT 源码出现的变化,和 bsp 不匹配
  • 构建系统出现了问题
  • 其他原因
  • 分析原因

    首先我想,如何排除 bsp 独立出来导致的这个现象,最简单的办法,测试 RTT 目录结构中的 bsp,打开 bsp,使用 menuconfig 选中 SPI 驱动,使用 scons 生成 cmake 工程,错误依旧。

    这基本上确定了,RTT 官方源码采用的构建方式也有这个问题,分析这个现象,基本可以认为是某个更新,导致构建脚本中 Env 和 group 的 get 函数的返回值发生了变化导致,get 函数有在这里有两个参数,一个代表键值 Key,另一个代表找不到 Key 返回的默认值,这个默认值为空的列表,list 类型。

    因此合理推测,Env 和 group 中的一个获取到了 Key,另一个没有获取到,返回了默认的空列表,因此导致两个变量无法简单相加,这里应该是一个语法不严谨加上某个更新导致的构建问题。

    为什么不使能 SPI 的默认 bsp 工程没有问题呢,一定是 SPI 驱动增加了某些配置,分析 SPI 驱动下的 Sconscript 文件:

    group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_SPI'], CPPPATH = CPPPATH, LOCAL_CCFLAGS = LOCAL_CCFLAGS)
    

    该文件在加入构建系统的时候,会为整个系统添加一个变量 LOCAL_CCFLAGS ,而在构建脚本中:

    # handle local group
        def local_group(group, objects):
            if 'LOCAL_CCFLAGS' in group or 'LOCAL_CPPPATH' in group or 'LOCAL_CPPDEFINES' in group or 'LOCAL_ASFLAGS' in group:
                CCFLAGS = Env.get('CCFLAGS', '') + group.get('LOCAL_CCFLAGS', '')
                CPPPATH = Env.get('CPPPATH', ['']) + group.get('LOCAL_CPPPATH', [''])
                CPPDEFINES = Env.get('CPPDEFINES', ['']) + group.get('LOCAL_CPPDEFINES', [''])
                ASFLAGS = Env.get('ASFLAGS', '') + group.get('LOCAL_ASFLAGS', '')
    
                for source in group['src']:
                    objects.append(Env.Object(source, CCFLAGS = CCFLAGS, ASFLAGS = ASFLAGS,
                        CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES))
    
                return True
    
            return False
    

    如果group中存在LOCAL_CCFLAGS则会出现一堆相加的调用,如果不选中 SPI 错误只是隐藏了,而不是消失了。

    如何修改

    原因找到了,问题是如何修改,这应该是某个更新导致,搜索后,找到如下回答:

    This is a SCons 4.5.0 regression. Run `pip uninstall scons` then `pip install scons==4.4.0` to fix this.
    

    查看我目前使用的 env 工具中的 scons 版本:

    $ pip show scons
    Name: SCons
    Version: 4.8.0
    Summary: Open Source next-generation build tool.
    Home-page:
    Author:
    Author-email: William Deegan <bill@baddogconsulting.com>
    License: MIT
    Location: D:\03_Tools\env-windows\.venv\Lib\site-packages
    Requires:
    Required-by: env
    

    尝试修改为 4.4.0 ,先卸载,再安装

    $ pip uninstall scons
    Found existing installation: SCons 4.8.0
    Uninstalling SCons-4.8.0:
      Would remove:
        d:\03_tools\env-windows\.venv\lib\site-packages\scons-4.8.0.dist-info\*
        d:\03_tools\env-windows\.venv\lib\site-packages\scons\*
        d:\03_tools\env-windows\.venv\scripts\scons-configure-cache.exe
        d:\03_tools\env-windows\.venv\scripts\scons.exe
        d:\03_tools\env-windows\.venv\scripts\sconsign.exe
    Proceed (Y/n)?
      Successfully uninstalled SCons-4.8.0
    
    $ pip install scons==4.4.0
    Collecting scons==4.4.0
      Using cached SCons-4.4.0-py3-none-any.whl.metadata (8.8 kB)
    Requirement already satisfied: setuptools in d:\03_tools\env-windows\.venv\lib\site-packages (from scons==4.4.0) (65.5.0)
    Using cached SCons-4.4.0-py3-none-any.whl (4.2 MB)
    Installing collected packages: scons
    Successfully installed scons-4.4.0
    

    尝试生成 CMake 工程:

    $ scons --target=cmake
    scons: Reading SConscript files ...
    Update setting files for CMakeLists.txt...
    Done!
    

    再切换为独立的bsp,也可以成功生成 CMake 工程。

    总结

    此次问题应该是较新的 env 工具使用的 scons 版本与目前 RTT 使用的 local_group 函数在语法上不兼容导致的,因为修改构建系统可能改动较大,并且我不是官方,可能后面不好维护,因此采用的方式为将 scons 改回之前的版本,测试ok。

    这估计也是我之前使用 SPI 驱动却没有出现问题的原因。

    下一篇:【RT-Thread】将BSP工程从RT-Thread源码中独立出来开发(4)

    作者:gerald0057

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【RT-Thread】独立开发BSP工程指南(从RT-Thread源码中分离,第三部分)

    发表回复