RISC-V篇-VSCode+qemu+gdb可视化调试OpenSBI

本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多原创技术文章!

“现在有了qemu+gdb调试OpenSBI的环境,也有了VSCode远程开发环境,这两者如果能结合起来,那将会极大提升开发、调试的效率,特别是debug的时候,可以实时跟踪代码会很爽的~”

01 VSCode安装C/C++插件

想要在VSCode中进行debug,那必须要安装插件,对于c代码来说,就安装微软开发的C/C++插件即可:

注意一定要点install in SSH: xxx,在虚拟机或远程机器上安装

02 配置VSCode Debugger

点击debug图标:

然后点击create a launch.json file:

选择Node.js:

然后输入如下内容:

{
  // 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": "opensbi-debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/platform/generic/firmware/fw_jump.elf",
            "args": [],
            "stopAtEntry": true,
            "stopAtConnect": true,
            "cwd": "${workspaceFolder}",
            "postRemoteConnectCommands": [
                {
                  "description": "remove symbol file",
                  "text": "symbol-file"
                }
                {
                  "description": "add symbol file",
                  "text": "add-symbol-file ${workspaceFolder}/build/platform/generic/firmware/fw_jump.elf 0x80000000"
                }
            ],
            "MIMode": "gdb",
            "miDebuggerPath":"/usr/bin/gdb-multiarch",
            "miDebuggerServerAddress": "localhost:1234"
    }
  ]
}

注意,其中的program就是fw_jump.elf的路径,还有postRemoteConnectCommands要在连接之后先使用symbol-file命令将vscode启动gdb时默认加载的symbol清除掉,然后再使用add-symbol-file命令将symbol添加到0x80000000(为啥是0x80000000,请观看RISC-V篇-qemu+gdb调试OpenSBI源码),否则后面debug时会有问题,比如,设置断点,会命中多个地址等

03 在VSCode中调试OpenSBI

现在可以在VSCode中调试OpenSBI了,先在VSCode中打开终端,并启动qemu:

然后分别点击debug按钮,Start Debugging按钮:

启动debug之后,如下图:

现在可以直接在代码的左侧点击设置断点,或者在DEBUG CONSOLE下输入 -exec b xxx 设置断点,如下图,左侧红色的小点就是设置的断点:

点击countinue按钮运行:

就会命中断点,左侧还提供了非常丰富的信息:

好了,先写到这里,更多用法需要你自己去探索了~

如果你觉得本文对你有帮助,请点赞,关注一下哦~

本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多远程技术文章!

### 开始使用RISC-V架构进行开发 #### 选择合适的开发环境 对于初次接触RISC-V架构的开发者而言,选择一个适合自己的集成开发环境(IDE)至关重要。目前支持RISC-V的主流IDE包括GNU MCU Eclipse、VSCode配合相应的插件以及厂商提供的特定IDE。这些平台提供了图形化的界面来简化编译链接过程,并且能够方便地调试程序。 #### 安装必要的工具链 为了能够在本地计算机上编写并运行针对RISC-V的目标代码,安装一套完整的工具链必不可少。这通常包含了编译器(riscv64-unknown-elf-gcc),汇编器(assembler),连接器(linker),二进制文件转换工具(objcopy), 和反汇编工具(objdump)[^1]。 #### 获取或设计硬件模型 如果计划做软件仿真测试,则可以通过QEMU模拟器加载Linux操作系统镜像来进行;而对于更深入的学习者来说,获取一块实际的支持RISC-V指令集的开发板会更加理想。市面上已有多种基于此架构的产品可供选购,比如SiFive Freedom系列或者其他第三方制造商推出的评估套件。 #### 编程实践 一旦上述准备工作完成之后就可以着手于具体的编程练习了。下面给出一段简单的C语言示例代码用来点亮LED灯: ```c #include "board.h" int main(void){ Board_Init(); while (true){ GPIO_SetValue(LED_PORT, LED_PIN); /* Turn on the LED */ delay_ms(500); GPIO_ClearValue(LED_PORT, LED_PIN);/* Turn off the LED */ delay_ms(500); } } ``` 这段代码假设存在名为`Board_Init()`函数初始化外设资源,在循环体内通过设置GPIO端口高低电平控制外部电路中LED的状态变化从而达到闪烁效果[^2]。 #### 学习内核状态寄存器(CSRs) 理解如何操作机器模式下的特殊功能寄存器也是掌握RISC-V的重要部分之一。例如利用`csrrw`指令可以在不破坏原有数据的情况下更新某个CSR的内容。具体语法如下所示: ```assembly csrrw rd, csr, rs1 ``` 这里`rd`代表目的寄存器编号,用于保存旧值;而`csr`则是指代待访问的具体控制与状态寄存器地址编码;最后参数`rs1`表示新输入的数据来源位置。当只需要执行写入动作时可令`rd=x0`;反之亦然只关心读取结果则让`rs1=x0`即可[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux底层小工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值