Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
QEMU
RT-Thread qemu mps2-an385 bsp 移植制作 :系统启动篇
发布于 2023-07-23 17:10:57 浏览:694
订阅该版
[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) ## 前言 - 前面准备了 RT-Thread qemu `mps2-an385` bsp 制作相关的环境与相关文件,本篇开始讲解 bsp 如何适配到 RT-Thread - CPU 部分已经适配好了,也就是通过 使能 `ARCH_ARM_CORTEX_M3` ,来使能 `rt-thread/libcpu/arm/cortex-m3`,这部分不需要改动 - 定时器部分:systick 部分,这部分需要配置,`mps2-an385` 系统时钟应该是 `25MHz` - RT-Thread 启动入口的执行, 在使用 gcc 时,入口函数为 :`entry` - `mps2-an385` MCU 上电,第一次执行的是 `Reset_Handler`,可以查看 链接脚本 `qemu-mps2-arm/drivers/CMSDK_CM3/Source/GCC/gcc_arm.ld` `ENTRY(Reset_Handler)` ## 创建 main.c - 创建 `main.c`,位置 `qemu-mps2-arm/applications/main.c`,可以其他的 bsp 复制一份,代码简单一点即可,注意把 构建脚本 `SConscript` 也复制一份过来 ```c #include
int main(void) { rt_kprintf("Hello RT-Thread!\n"); while (1) { rt_thread_mdelay(5000); } } ``` ## 配置 VS Code gdb 调试 - 使用 qemu 最方便 gdb 调试,使用 VS Code,可以源码调试,非常的方便,同时利于 代码执行流程的梳理,问题的排查定位 - 在没有配置或者启动 RT-Thread 前,在没有开启 uart 串口前,使用 gdb 调试,无疑是必要的。 - qemu 正常启动脚本:`qemu.sh` `chmod +x qemu.sh` ```c qemu-system-arm --version qemu-system-arm -M mps2-an385 \ -kernel rtthread.bin \ -nographic ``` - qemu 调试启动脚本:`qemu-dbg.sh` `chmod +x qemu-dbg.sh` ```c qemu-system-arm --version qemu-system-arm -M mps2-an385 \ -kernel rtthread.bin \ -nographic \ -s -S ``` - VS Code debug 脚本: `.vscode/launch.json`,点击VS Code 左栏 调试按钮,初次创建 `launch.json`  ```c { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Launch QEMU RTOSDemo", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/qemu-mps2-arm/rtthread.elf", "cwd": "${workspaceFolder}", "miDebuggerPath": "/home/zhangsz/linux/tools/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin/arm-none-eabi-gdb", "miDebuggerServerAddress": "localhost:1234", "stopAtEntry": true, } ] } ``` ## 初次调试 确认是否进入 Reset_Handler - 运行 `qemu-dbg.sh`, 进入 `qemu-mps2-arm` 目录,先执行 `./qemu-dbg.sh`,此时会 qemu 会卡住 - 点击 VS Code 调试按钮,然后点击 开始调试按钮,【Start Debugging F5】,我的 VS Code 不能直接点击 F5,这里使用鼠标点击 开始调试  - 如果正常进入 `Reset_Handler`,说明 启动脚本参与编译并工作了,接下来就需要对接 `entry` RT-Thread 入口函数了 ## 系统时钟 25MHz - `Reset_Handler` 是 程序的入口, 第一个执行的函数: `SystemInit`,单步进入,这里可以获取到系统的时钟:`SYSTEM_CLOCK` 为 `25MHz`  - `Reset_Handler` 继续执行,复制 Flash 中的 `.text` 段 到 SRAM,并且 清零 `.bss`,启动文件的一些符号,可以通过查看对比 链接脚本 获取到 - 【备注】这里 `bl _start` 应该直接进入 main 函数,由于 RT-Thread 在 main 函数之前,做了初始操作,所以需要改为 RT-Thread `entry` 入口函数   ## 进入 RT-Thread entry - `Reset_Handler` >> `bl _start` 改为 `bl entry`,这样调试发现进入了 RT-Thread 的 entry 入口,开始 RT-Thread 系统初始化   ## RT-Thread 自动初始化等预留的符号 - RT-Thread 自动初始化、MSH shell 等符号,在使用 gcc 编译工具链时,需要在 链接脚本中预留,否则 RT-Thread 自动初始化失效、MSH shell cmd 也不能正常的使用 - 修改链接文件 `qemu-mps2-arm/link.lds`,在 `.text` 段,增加  ```c /* section information for finsh shell */ . = ALIGN(4); __fsymtab_start = .; KEEP(*(FSymTab)) __fsymtab_end = .; . = ALIGN(4); __vsymtab_start = .; KEEP(*(VSymTab)) __vsymtab_end = .; /* section information for initial. */ . = ALIGN(4); __rt_init_start = .; KEEP(*(SORT(.rti_fn*))) __rt_init_end = .; ``` - 待续: 接下来开启 RT-Thread 系统 tick 定时器,适配 uart 串口,让 RT-Thread 运行起来 ## 小结 - 本篇主要通过 VS Code gdb 的方式,调试入口函数的执行,通过修改入口函数 `_start`,执行 RT-Thread 入口函数 `entry`,从而进入 RT-Thread 世界 - 由于没有 tick 定时器、串口打印,所以需要进一步完善设备驱动 - 注意连接脚本:需要为 RT-Thread 自动初始化、MSH shell cmd 等预留 符号在 `.text` 段
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
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
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部