RT-Thread qemu mps2-an385 bsp 移植制作 :系统启动篇

前言

  • 前面准备了 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 也复制一份过来
#include <rtthread.h>

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

qemu-system-arm --version
qemu-system-arm -M mps2-an385 \
        -kernel rtthread.bin \
        -nographic
  • qemu 调试启动脚本:qemu-dbg.sh chmod +x qemu-dbg.sh
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

在这里插入图片描述

{
    
    
    // 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_CLOCK25MHz

在这里插入图片描述

  • 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 段,增加

在这里插入图片描述

    /* 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

猜你喜欢

转载自blog.csdn.net/tcjy1000/article/details/131880856
今日推荐