RT-Thread qemu mps2-an385 bsp 移植制作 :BSP 制作篇

下载 V2M-MPS2_CMx_BSP

在这里插入图片描述

  • 其实这是个 Keil MDK5 的 Pack 包,安装后,会有相应的头文件、简单的示例

提取启动文件与连接脚本

  • 安装 Keil.V2M-MPS2_CMx_BSP.1.8.0.pack 后, 在 V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3\Source\GCC 路径下,有 mps2-an385 的启动文件与连接脚本

在这里插入图片描述

  • V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3\Source\GCC\gcc_arm.ld 复制到工程 qemu-mps2-arm 目录下,可以改为 link.lds

V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3\Source\GCC\startup_CMSDK_CM3.S 复制到工程 qemu-mps2-arm/drivers 目录下

  • 【备注】也可把整个 V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3 目录复制到工程 qemu-mps2-arm/drivers 目录下

  • 通过简单了解到,这个启动文件与连接脚本,与 STM32F103 系列的很像。

scons 构建环境的搭建

  • RT-Thread BSP 使用 scons 进行构建,所以需要 SConscript SConstruct 两个文件,另外需要 rtconfig.py 文件,这几个文件可以从其他的 RT-Thread bsp 如 bsp\stm32\stm32f103-fire-arbitrary 复制过来,修改一下构建路径即可

  • SConscript 文件 无需修改,内容如下,遍历 当前与子目录下的 SConscript,获取构建的目标

# RT-Thread building script for bridge

import os
from building import *

cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)

for d in list:
    path = os.path.join(cwd, d)
    if os.path.isfile(os.path.join(path, 'SConscript')):
        objs = objs + SConscript(os.path.join(d, 'SConscript'))

Return('objs')
  • SConstruct 文件:只需要修改 RTT_ROOT 的路径
import os
import sys
import rtconfig

if os.getenv('RTT_ROOT'):
    RTT_ROOT = os.getenv('RTT_ROOT')
else:
    RTT_ROOT = os.path.join(os.getcwd(), '..', 'rt-thread')
    print(RTT_ROOT)

sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
from building import *

TARGET = 'rtthread.' + rtconfig.TARGET_EXT

DefaultEnvironment(tools=[])
env = Environment(tools = ['mingw'],
    AS   = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
    CC   = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,
    CXX  = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
    AR   = rtconfig.AR, ARFLAGS = '-rc',
    LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
env['ASCOM'] = env['ASPPCOM']

Export('RTT_ROOT')
Export('rtconfig')

# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT)

# make a building
DoBuilding(TARGET, objs)
  • rtconfig.py 文件: 基本不需要修改,注意复制一份 STM32F103 系列 Cortex-M3 的,如 bsp\stm32\stm32f103-fire-arbitrary\rtconfig.py

图形配置文件

  • RT-Thread 在 ubuntu 下使用 scons --menuconfig 进行图形界面配置,需要相应的 Kconfig 文件,当前需要两个 Kconfig 文件,BSP 下 Kconfig 与 bsp/drivers 下的 Kconfig,如 从 bsp\stm32\stm32f103-fire-arbitrary 复制一份,修改一下

  • qemu-mps2-arm/Kconfig 内容,注意修改 RTT_DIR 路径

mainmenu "RT-Thread Project Configuration"

config BSP_DIR
    string
    option env="BSP_ROOT"
    default "."

config RTT_DIR
    string
    option env="RTT_ROOT"
    default "../rt-thread"

config PKGS_DIR
    string
    option env="PKGS_ROOT"
    default "packages"

source "$RTT_DIR/Kconfig"
source "$PKGS_DIR/Kconfig"
source "$BSP_DIR/drivers/Kconfig"
  • qemu-mps2-arm/drivers/Kconfig

  • 这里需要配置一下 MCU 的信息,如 select ARCH_ARM_CORTEX_M3,用于选择 RT-Thread 的 rt-thread/libcpu/arm/cortex-m3/

  • mps2-an385 的串口是 uart0 开始的,配置一个用于 MSH shell 的串口,当前验证是 uart0 可以正常工作

menu "Hardware Drivers Config"

config SOC_MPS2_CORTEX_M3
    bool
    select ARCH_ARM_CORTEX_M3
    select RT_USING_COMPONENTS_INIT
    select RT_USING_USER_MAIN
    default y

menu "Onboard Peripheral Drivers"
config BSP_USING_UART0
    bool "Enable UART0"
    default y

config BSP_USING_UART1
    bool "Enable UART1"
    default n

endmenu

endmenu
  • 默认需要有一个 rtconfig.h,这个文件可以手动创建,内容为空即可,然后通过 scons --menuconfig,即可刷新 rtconfig.h 的内容,同时生成 .config 默认配置文件

mps2-an385 相关的文件

  • 当前 把 Keil\V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3 复制到 工程 qemu-mps2-arm/drivers/ 目录下,创建并修改 qemu-mps2-arm/drivers/SConscript,用于编译 qemu-mps2-arm/drivers 驱动相关的文件
import rtconfig
from building import *

cwd  = GetCurrentDir()
# src  = Glob('*.c')

src = Split('''
CMSDK_CM3/Source/system_CMSDK_CM3.c
board.c
drv_common.c
drv_uart.c
''')

list = os.listdir(cwd)
CPPPATH = [cwd]
CPPPATH += [cwd + '/CMSDK_CM3/Include']
CPPPATH += [cwd + '/cmsis/core/include']
objs = []

if rtconfig.PLATFORM in ['gcc']:
    src += ['CMSDK_CM3/Source/GCC/startup_CMSDK_CM3.S']

group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)

for d in list:
    path = os.path.join(cwd, d)
    if os.path.isfile(os.path.join(path, 'SConscript')):
        objs = objs + SConscript(os.path.join(d, 'SConscript'))
objs = objs + group

Return('objs')
  • 从其他 bsp,复制一份 board.c board.h 文件 到 qemu-mps2-arm/drivers,board 初始化

  • 从其他 bsp,复制一份 drv_uart.c drv_uart.h 文件 到 qemu-mps2-arm/drivers,串口驱动

  • 从其他 bsp,复制一份 drv_common.cqemu-mps2-arm/drivers,当前主要是 定时器初始化

编译并解决编译错误

  • scons 构建 drivers/system_CMSDK_CM3.c:35:4: error: #error device not specified!,可以在 qemu-mps2-arm/drivers/CMSDK_CM3/Source/system_CMSDK_CM3.c 文件上面定义 MCU 的型号 #define CMSDK_CM3

  • scons 构建 缺少 core_cm3.h 文件: 这部分可以复制 Keil MDK5 pack 路径下的 \ARM\CMSIS\5.8.0\CMSIS\Core\Include\core_cm3.h

  • 工程里面创建 qemu-mps2-arm/drivers/cmsis/core/include 目录,把以下文件复制过来

  • \ARM\CMSIS\5.8.0\CMSIS\Core\Include\cmsis_compiler.h

  • \ARM\CMSIS\5.8.0\CMSIS\Core\Include\cmsis_gcc.h

  • \ARM\CMSIS\5.8.0\CMSIS\Core\Include\cmsis_version.h

  • \ARM\CMSIS\5.8.0\CMSIS\Core\Include\core_cm3.h

  • \ARM\CMSIS\5.8.0\CMSIS\Core\Include\mpu_armv7.h

  • 待进一步完善驱动、配置、修改并启动 RT-Thread

小结

  • 本篇主要是 RT-Thread qemu mps2-an385 bsp 相关文件的准备工作,了解构建过程,并为进一步 适配启动 RT-Thread 做准备

  • 本篇的 qemu board mps2-an385 资料比较少,主要是通过 ARM 官方 Keil.V2M-MPS2_CMx_BSP.1.8.0.pack 获取到,并且文档也比较少,不过 RT-Thread 移植主要是 定时器与 串口的移植, CPU 架构部分,RT-Thread libcpu 已经支持 ARM Cortex-M3,所以移植起来主要是 BSP 相关的适配与修改

  • 接下来开始 适配与修改BSP,让 mps2-an385 RT-Thread 跑起来

猜你喜欢

转载自blog.csdn.net/tcjy1000/article/details/131879622
BSP