Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
QEMU
RT-Thread qemu mps2-an385 bsp 移植制作 :BSP 制作篇
发布于 2023-07-23 16:16:30 浏览:393
订阅该版
[tocm] [RT-Thread qemu mps2-an385 bsp 移植制作 :环境搭建篇](https://club.rt-thread.org/ask/article/c0be3f8a4b751b10.html) [RT-Thread qemu mps2-an385 bsp 移植制作 :BSP 制作篇](https://club.rt-thread.org/ask/article/c4d2aacf5ab2a160.html) [RT-Thread qemu mps2-an385 bsp 移植制作 :系统启动篇](https://club.rt-thread.org/ask/article/d9c2825cc94b8b39.html) [RT-Thread qemu mps2-an385 bsp 移植制作 :系统运行篇](https://club.rt-thread.org/ask/article/499d407fa948c318.html) ## 下载 V2M-MPS2_CMx_BSP - mps2 的资料很少,所以唯一能下载的是 ARM 官方的 `V2M-MPS2_CMx_BSP`,下载地址为: [https://keilpack.azureedge.net/pack/Keil.V2M-MPS2_CMx_BSP.1.8.0.pack](https://keilpack.azureedge.net/pack/Keil.V2M-MPS2_CMx_BSP.1.8.0.pack)  - 其实这是个 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`,获取构建的目标 ```c # 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` 的路径 ```c 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` 路径 ```c 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 可以正常工作 ```c 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` 驱动相关的文件 ```c 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.c` 到 `qemu-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 跑起来
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
813
被采纳
177
关注TA
发私信
相关文章
1
Linux下的Qemu mini2440虚拟机(32位和64位)
2
有qemu Linux的rt-thread开发环境建立吗?
3
qemu+mini2440+bootloader问题
4
QEMU gdbstub 在Win7下的bug
5
请教如何在windows下使用qemu测试rrt0.31中的例子
6
QEMU运行os问题
7
QEMU-mini2440 模拟环境上运行RT-thread这篇
8
在Ubuntu上执行qemu的configure命令checkzlib失败
9
求大舅:telnet-连接QEMU时,QEMU segmentation fault 结束
10
RealTouch打算出QEMU模拟器吗
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
10
个答案
3
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
lizimu
2
篇文章
9
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部