vscode 如何搭建cortex调试环境

 

如何用vscode搭建cortex的调试环境

如何用vscode搭建cortex的调试环境

J-Link Visual Studio Code

用J-Link进行调试

有一些第三方插件可以通过GDB + J-Link + GDBServer在嵌入式目标上实现Visual Studio Code的调试。 是微软的一个免费的源代码编辑器,可用于Windows、Linux和OS-X。除了允许通过安装扩展程序进行代码重构和版本控制外,还可以将这个 “简单 “的代码编辑器扩展为一个多平台的开发环境。在本教程中,我们将只介绍如何通过调试探针J-Link为Cortex内核的微控制器添加调试功能。在这个例子中,我们将使用SEGGER的emPower v2.0评估板。我们的目标MCU将是恩智浦MK66FX1M0xxx18,你可以在我们的网上商店(链接)购买。请注意,下面的配置将重新刷新你的目标,重置并连接到调试。如果你想增加附加到一个正在运行的目标上的选项,只需把 launch.json的“request”: “launch” to “request”: “attach”.

需求

  1. Visual Studio Code (link)
  2. GNU ARM Embedded tool-chain
    1. Note: under windows use version 7-2018 (link)
  3. J-Link (link)
  4. Visual Studio Code Plugins
    1. C/C++ for Visual Studio Code (link)
    2. Cortex-Debug (link)
    3. C/C++ Intellisense(link) optional

调试环境配置流程

  1. 配置c/c++
  2. 配置launch.json

Microsoft Windows Setup

  • 按F1(显示所有命令),输入 “launch “并从下拉列表中选择 “Debug:Open launch.json”

  • 之后,你会被提示选择环境。选择 “Cortex Debug”

  • launch.json文件将在你的项目文件夹中的.vscode文件夹下创建

  • 现在,我们必须用以下设置来调整.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": [
        {
          "type": "cortex-debug",
          "request": "launch",
          "name": "Debug J-Link",
          "cwd": "${workspaceRoot}",
          "executable": "${workspaceRoot}/BSP/SEGGER/K66FN2M0_emPower/Output/Debug/Start_emPower.elf",
          "serverpath": "C:/Program Files (x86)/SEGGER/JLink_V687b/JLinkGDBServerCL.exe", 
          "servertype": "jlink",
          "device": "MK66FX1M0xxx18",
          "interface": "jtag",
          "serialNumber": "", //If you have more than one J-Link probe, add the serial number here.
     	"jlinkscript":"${workspaceRoot}/BSP/SEGGER/K66FN2M0_emPower/Setup/Kinetis_K66_Target.js",
          "runToMain": true,
          "svdFile": "${workspaceRoot}/SVD/MK66F18.svd" 
        }
        ]
      }
    

    serverpath 应该是你的J-Link GDB服务器安装目录。

    如果你有一个以上的J-Link探针连接,请添加你的探针序列号。如果你只调试一个目标,你可以直接注释这个条目

    仿真寄存器描述svd文件

    • CMSIS-SVD:包含完整微控制器系统(包括外设)的程序员视图的系统视图描述 XML 文件
    • MK66F18.svd文件可从上面提供的Keil链接中的Keil.Kinetis_K60_DFP.1.5.0/SVD下找到。 将此文件夹复制到您的EMPower文件夹。

最后一步是设置ARMs GDB工具链。按F1键,写上 “config”。从下拉菜单中选择C/C++:编辑配置(JSON)。

在这个JSON配置文件中,你只需添加编译器路径和intelliSenseMode。就像下面这样:

{
  "configurations": [
    {
      "name": "Win32",
              "includePath": [
              "${workspaceFolder}/**",
              "${workspaceFolder}/GUI/Inc"
  ],
  "defines": [
      "_DEBUG",
      "UNICODE",
      "_UNICODE"
  ],
  "intelliSenseMode": "gcc-x64",
  "compilerPath": "C:\\Tool\\C\\Arm\\7_2018-q2-update\\bin\\arm-none-eabi-gcc.exe"
  }
  ],
  "version": 4
}

在设置文件中,我们必须指定armToolchainPath。要做到这一点,按F1键并输入 “settings”,然后选择 “Open Settings (JSON)”。

下面一行应该指向你的arm-none-eabi-gdb.exe所在的文件夹:

"cortex-debug.armToolchainPath": "C:\\Tool\\C\\Arm\\7_2018-q2-update\\bin"

现在设置已经全部完成。你可以按F5或从调试菜单→开始调试来开始调试。

如果你做了上面的步骤,你应该期待下面的输出。

在左侧面板上可以查看调试变量(本地、全局和静态)观察、调用栈、断点、MCU外设和核心寄存器。所有与调试你的项目有关的基本信息。

就这样了。现在你可以在Visual Studio Code中调试你的目标应用程序了。

Linux Ubuntu设置

下面的设置是用Linux Ubuntu 16.04.01 LTS测试的。

ARM GCC安装

$ sudo apt-get -y install gcc-arm-none-eabi binutils-arm-none-eabi gdb-arm-none-eabi openocd

微软Visual Studio代码安装

$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$ sudo install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
$ sudo apt-get install apt-transport-https
$ sudo apt-get update
$ sudo apt-get install code

J-Link的安装

在你下载j-link安装程序的目录中,你使用安装程序来进行安装。

J-Link的安装目录可以在/opt/SEGGER/下找到。

c/c++的配置

在终端只要输入代码就可以启动Visual Studio Code,并在Visual Studio Code扩展管理器(左面板扩展符号)下安装以下扩展:Cortex Debug和C/C++ IntelliSense。

打开你的项目文件夹 从文件菜单中选择 “Open folder”(打开文件夹),即EmPower BSP。

按F1并写下config,然后选择C/C++:编辑配置(UI):

你可以通过JSON配置文件进行同样的操作,调整你的配置,如下所示:

  {
    "configurations": [
    {
      "name": "Linux",
      "includePath": [
      	"${workspaceFolder}/**"
      ],
      "defines": [
        "\"_DEBUG\",",
        "\"UNICODE\",",
        "\"_UNICODE\""
      ],
      "compilerPath": "/usr/bin/arm-none-eabi-gcc",
      "cStandard": "c11",
      "cppStandard": "c++17",
      "intelliSenseMode": "gcc-x64"
    }
    ],
    "version": 4
  }

launch的配置

现在我们需要为Cortex-Debug扩展生成并配置启动Debug文件。按F1键并输入 launch。从下拉列表中选择 “Debug:Open launch.json”,然后选择Cortex-Debug…,在生成的.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": [
      {
        "type": "cortex-debug",
        "request": "launch",
        "name": "Debug J-Link",
        "cwd": "${workspaceRoot}",
        "executable": "${workspaceRoot}/BSP/SEGGER/K66FN2M0_emPower/Output/Debug/Start_emPower.elf",
        "serverpath": "/opt/SEGGER/JLink/JLinkGDBServerCLExe", 
        "servertype": "jlink",
        "device": "MK66FX1M0xxx18",
        "interface": "jtag",
        "serialNumber": "", //If you have more than one J-Link probe, add the serial number here.
        "jlinkscript":"${workspaceRoot}/BSP/SEGGER/K66FN2M0_emPower/Setup/Kinetis_K66_Target.js",
        "runToMain": true,
        "armToolchainPath": "/usr/bin/",
        "svdFile": "${workspaceRoot}/SVD/MK66F18.svd" 
      }
    ]
}

Cortex-Debug launch.json最后应该是这样的。

为了得到.svd文件,解压Keil.Kinetis_K60_DFP.1.5.0.pack并将SVD文件夹复制到主项目文件夹。

要获得Start_emPower.elf,请到BSP/SEGGER/K66FN2M0_emPower,用SEGGER Embedded Studio建立Start_SEGGER_emPower.emProject

现在你已经准备好开始调试了。只要按F5或从菜单Debug中选择 “开始调试”。

苹果Mac OS X设置

苹果OS-X的设置非常简单,只有launch.json配置文件中的一个例外。

Visual Studio代码

下载Visual Studio for Mac。将应用程序解压到你的应用程序文件夹或你选择的任何其他文件夹。

安装ARM GCC

打开一个终端窗口,进入你下载ARM GCC工具链的目录(很可能在下载文件夹中)。将该文件夹解压到您选择的目录中。我建议在/opt下:

$ sudo tar -xjvf gcc-arm-none-eabi-8-2018-q4-major-mac.tar.bz2 -C /opt/

c/c++的配置

打开Visual Studio Code,并安装Cortex-Debug和C/C++ Intelisense扩展。

点击 “打开文件夹”,然后选择你之前下载和提取的EMPower项目文件夹。

然后按F1并写下 “config”。从下拉列表中选择 “C/C++编辑配置…”

在默认生成的json文件中,改变为以下设置:

{
  "configurations": [
  {
    "name": "Mac",
    "includePath": [
      "${workspaceFolder}/**"
    ],
    "defines": [],
    "macFrameworkPath": [
      "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks"
    ],
    "compilerPath": "/opt/gcc-arm-none-eabi-8-2018-q4-major",
    "cStandard": "c11",
    "cppStandard": "c++17",
    "intelliSenseMode": "gcc-x64"
  }
  ],
  "version": 4
}

launch的配置

最后,再按一次F1,然后写上启动,并选择 “Debug: Open launch.json”,然后选择 Cortex Debug 选项:

将默认的.json文件改为下面的设置,并为编译器增加一行。在当前版本的Cortex-Debug插件/扩展(v0.3.0)中,如果没有事先指定 “armToolchainPath”,就不可能运行调试会话:

 {
  // 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": [
    {
      "request": "launch",
      "type": "cortex-debug",
      "name": "Debug J-Link",
      "cwd": "${workspaceRoot}",
      "executable": "${workspaceRoot}/BSP/SEGGER/K66FN2M0_emPower/Output/Release/Start_emPower.elf",
      "serverpath": "/Applications/SEGGER/JLink_V684a/JLinkGDBServerCLExe",
      "servertype": "jlink",
      "armToolchainPath": "/opt/gcc-arm-none-eabi-8-2018-q4-major/bin/",
      "device": "MK66FX1M0xxx18",
      "interface": "jtag",
      "serialNumber": "", //If you have more than one J-Link probe, add the serial number here.
      "jlinkscript":"${workspaceRoot}/BSP/SEGGER/K66FN2M0_emPower/Setup/Kinetis_K66_Target.js",
      "runToMain": true,
      "svdFile":"${workspaceRoot}/SVD/MK66F18.svd"
    }
    ]
  }

为了得到.svd文件,解压Keil.Kinetis_K60_DFP.1.5.0.pack并将SVD文件夹复制到主项目文件夹。

要获得Start_emPower.elf,请到BSP/SEGGER/K66FN2M0_emPower,用SEGGER Embedded Studio建立Start_SEGGER_emPower.emProject

现在你可以通过按F5或从调试菜单→开始调试来运行一个调试会话:

在左边的面板(调试面板),你会发现所有与调试你的项目有关的信息(变量、观察、调用堆栈、断点、外围寄存器和皮质寄存器)。

最后评论

当你添加和设置调试和编译的扩展时,Visual Studio Code是基于Eclipse的开发环境的一个很好的免费替代软件。

在上面的配置中,我们只添加了选项”request”: “launch”,,但如果你想附加到一个正在运行的目标上,你可以简单地将其改为 “request”: “attach”.。或者,你可以为附加到目标添加一个额外的.json文件,并为它指定另一个快捷键。这样,你就有了两个选择。

如果你想在Visual Studio Code中进行编译,网上有很多教程可以帮助你,通过使用ARM GCC工具链来设置你的环境。

就这样了。祝您在Visual Studio Code下使用J-Link进行调试愉快。

附录

启动配置

要在VS Code中运行或调试一个简单的应用程序,在调试开始视图中选择运行和调试,或者按F5,VS Code将尝试运行你当前的活动文件。

然而,对于大多数调试场景,创建一个启动配置文件是有益的,因为它允许你配置和保存调试设置细节。VS Code 将调试配置信息保存在 launch.json 文件中,该文件位于工作区(项目根目录)的 .vscode 文件夹中或用户设置或工作区设置中。

要创建 launch.json 文件,请点击运行开始视图中的创建 launch.json 文件链接。

VS Code会尝试自动检测你的调试环境,但如果失败了,你将不得不手动选择它。

注意,启动配置中可用的属性因调试器而异。你可以使用IntelliSense建议(⌃Space)来查找特定调试器存在哪些属性。悬停帮助也适用于所有属性。

不要以为对一个调试器有效的属性会自动对其他调试器有效。如果你在启动配置中看到绿色的斜线,请将鼠标悬停在它们上面,了解问题所在,并在启动调试会话之前尝试修复它们。

检查所有自动生成的值,并确保它们对您的项目和调试环境有意义。

启动与附加配置

在VS Code中,有两种核心调试模式,启动和附加,它们处理两种不同的工作流程和开发人员的环节。根据你的工作流程,要知道哪种类型的配置适合你的项目可能会很困惑。

如果你来自浏览器开发工具的背景,你可能不习惯于 “从工具中启动”,因为你的浏览器实例已经打开。当你打开DevTools时,你只是把DevTools附加到你打开的浏览器标签上。另一方面,如果你来自服务器或桌面背景,让你的编辑器为你启动进程是很正常的,你的编辑器会自动将其调试器附加到新启动的进程上。

解释启动和附加的最好方法是把启动配置看作是如何在VS Code附加到你的应用程序之前以调试模式启动你的应用程序的配方,而附加配置是如何把VS Code的调试器连接到已经运行的应用程序或进程的配方。

VS Code调试器通常支持在调试模式下启动一个程序或在调试模式下附加到一个已经运行的程序。根据不同的请求(附加或启动),需要不同的属性,VS Code的 launch.json 验证和建议应该可以帮助解决这个问题。

添加一个新的配置

要向现有的 launch.json 添加新的配置,请使用以下技术之一:

  • 如果你的光标位于配置阵列内,则使用IntelliSense
  • 按下 “添加配置 “按钮,在阵列的开始处调用片段IntelliSense
  • 在运行菜单中选择添加配置选项

VS Code也支持复合启动配置,用于同时启动多个配置;更多细节请阅读本节。

为了启动一个调试会话,首先使用运行视图中的配置下拉菜单选择名为启动程序的配置。一旦你设置了你的启动配置,用F5启动你的调试会话。

另外,你也可以通过命令面板(⇧ ⌘P)运行你的配置,在Debug上过滤。选择并开始调试,或者输入 “debug”,然后选择你要调试的配置。

调试会话一开始,DEBUG CONSOLE面板就会显示,并显示调试输出,状态栏也会改变颜色(默认颜色主题为橙色)。

Launch.json属性

有许多 launch.json 属性,以帮助支持不同的调试器和调试场景。如上所述,你可以使用IntelliSense(⌃Space)来查看可用属性的列表,一旦你为类型属性指定了一个值。

以下属性对每个启动配置都是强制性的:

  • type - 这个启动配置要使用的调试器的类型。每个已安装的调试扩展都会引入一个类型:例如,内置的Node调试器是node,PHP和Go扩展是php和go
  • request - 这个启动配置的请求类型。目前,支持启动和附加。
  • name - 在Debug启动配置下拉菜单中出现的方便读者的名称
    • 这里有一些可供所有发射配置使用的可选属性。

以下是所有启动配置可用的一些可选属性:

  • presentation - 使用presentation对象中的order、group和hidden属性,你可以在Debug配置下拉菜单和Debug快速选择中对配置和化合物进行排序、分组和隐藏。
  • preLaunchTask - 要在调试会话开始前启动一个任务,把这个属性设置为tasks.json(在工作区的.vscode文件夹)中指定的任务的标签。或者,可以将其设置为${defaultBuildTask}以使用你的默认构建任务
  • postDebugTask - 要在调试会话的最后启动一个任务,请将此属性设置为tasks.json(在工作空间的.vscode文件夹中)中指定的任务名称
  • internalConsoleOptions - 这个属性控制调试会话期间调试控制台面板的可见性
  • debugServer - 仅用于调试扩展作者:该属性允许你连接到一个指定的端口,而不是启动调试适配器
  • serverReadyAction - 如果你想在调试中的程序向调试控制台或集成终端输出特定信息时在网络浏览器中打开一个URL。详见下面的 “调试服务器程序时自动打开一个URI”。

许多调试器支持以下一些属性:

  • program - 启动调试器时要运行的可执行程序或文件
  • args - 传递给要调试的程序的参数
  • env - 环境变量(值null可以用来 “不定义 “一个变量)
  • envFile - 包含环境变量的dotenv文件的路径
  • cwd - 当前工作目录,用于查找依赖关系和其他文件
  • port - 连接到一个正在运行的进程时的端口
  • stopOnEntry - 程序启动时立即中断
  • console - 使用哪种控制台,例如,internalConsole、integratedTerminal或externalTerminal

变量替换

VS Code将常用的路径和其他值作为变量,并支持在 launch.json 的字符串中进行变量替换。这意味着你不必在调试配置中使用绝对路径。例如,${workspaceFolder}给出了工作区文件夹的根路径,${file}是活动编辑器中打开的文件,而${env:Name}是环境变量 “Name”。你可以在《变量参考》中看到预定义变量的完整列表,或者通过在launch.json字符串属性中调用IntelliSense。

{
  "type": "node",
  "request": "launch",
  "name": "Launch Program",
  "program": "${workspaceFolder}/app.js",
  "cwd": "${workspaceFolder}",
  "args": ["${env:USERNAME}"]
}

平台特定属性

Launch.json支持定义依赖于调试器运行的操作系统的值(例如,要传递给程序的参数)。要做到这一点,在launch.json文件中放入一个特定平台的字样,并在该字样中指定相应的属性。

下面是一个例子,在Windows上以不同的方式向程序传递 “args”:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "program": "${workspaceFolder}/node_modules/gulp/bin/gulpfile.js",
      "args": ["myFolder/path/app.js"],
      "windows": {
        "args": ["myFolder\\path\\app.js"]
      }
    }
  ]
}

CMSIS SVD(System View Description) 系统视图说明

系统视图描述 (SVD) 文件以基于格式化的 XML 提供了外设信息和其他设备参数。

SVD 文件通常与设备参考手册中芯片供应商提供的信息相匹配。

SVD相当于把传统的芯片手册(DATA SHEET)给“数字化”了, 手册是给人看的,而SVD采用XML文档结构化的方式,是给机器、开发环境、MDK/IAR等软件“看”的,

SVD文件中定义了某个芯片的非常详细的信息,包含了哪些片内外设,每一个外设的硬件寄存器,每一个寄存器中每一个数据位的值,以及详细的说明信息等等。

SVD足够详细,与手册内容完全匹配,根据SVD文件可以生成芯片的头文件定义,厉害吧!

因此,SVD文件的内容非常详细,基本上人看不懂,虽然是XML,但看起来还是像天书一样,但对于软件、工具,则是清晰明了。

CMSIS\Documentation\SVD

Cortex-Debug 插件说明

对ARM Cortex-M微控制器的调试支持,具有以下特点:

  • 支持J-Link、OpenOCD GDB服务器
  • 初步支持STMicroelectronic的ST-LINK GDB服务器(尚无SWO支持)
  • 部分支持PyOCD和textane/stlink(st-util)GDB服务器(SWO只能通过串行端口捕获)
  • 对Black Magic Probe的初步支持(这还没有经过大量的测试;SWO只能通过串行端口捕获)
  • Cortex Core 寄存器查看器
    • 在某些情况下,st-util GDB服务器报告不完整/不正确的寄存器,所以这里可能有一些问题
  • 外设寄存器查看器(通过标准SVD文件定义)
  • SWO解码–“控制台 “文本输出和二进制数据(有符号和无符号的32位整数、Q16.16定点整数、单精度浮点值)
    • 属于DWT、TPIU和ITM调试组件的寄存器将自动配置,不需要在固件中设置。
    • 固件可能仍然需要启用SWO输出引脚,因为这部分的设置取决于微控制器。
    • 目前不支持通过SWO引脚对ETM数据进行解码。
  • 支持自定义ITM数据解码器
    • 能够定义JavaScript模块来解码通过一个或多个ITM端口流传的复杂数据格式。数据可以打印到一个输出窗口,或发送到图形系统。
  • 解码的ITM数据的实时图表。
  • 原始内存查看器(”Cortex-Debug: View Memory “命令)。
  • 能够查看并逐步了解反汇编的二进制文件。有三种方式显示反汇编的代码
    • 如果不能找到相应的源代码,反汇编代码将自动显示
    • 你可以手动查看某个特定函数的反汇编(”Cortex-Debug: View Disassembly (Function)”命令)
    • 你可以设置调试器总是显示反汇编(”Cortex-Debug: Set Force Disassembly “命令)
  • 变量视图中的全局和静态作用域
  • 对Rust代码的初步支持(大部分功能可以使用;反汇编视图和变量视图可能仍有问题)
  • 支持RTOS(J-Link和OpenOCD–支持的RTOS取决于GDB服务器支持情况
    • 一般来说,在你的RTOS的调度器启动之前,不要尝试使用步进指令–在许多情况下,这往往会使GDB服务器崩溃或使其处于不一致的状态。

安装

需要

  • ARM GCC Toolchain
  • 至少有一个
    • J-Link软件工具 - 为基于J-Link的调试器提供J-Link GDB服务器
    • OpenOCD - 提供一个GDB服务器,可以与一些调试器一起使用
    • Texane的st-util GDB服务器 - 只支持ST-Link Debug Probes
    • ST-LINK GDB server
      • 该服务器与STM32CubeIDE一同打包,必须安装。STM32CubeIDE和相关工具的位置是自动解决的,但也可以使用配置设置(armToolchainPath、stm32cubeprogrammer和serverpath)进行覆盖。
    • pyOCD GDB Server:GDB服务器,支持CMSIS-DAP调试器在一些嵌入式板上的调试。
    • Black Magic Probe

Cortex-Debug for Visual Studio Code

Cortex-Debug for Visual Studio Code | Alone on a Mountaintop (lonesometraveler.github.io)

本周,我了解了VS Code的Cortex-Debug扩展。在VSCode的背景下运行GDB和ITM,听起来非常酷。所以,我试了一下,发现它非常棒。

有了这个扩展,我只需点击一个按钮就可以轻松地启动一个调试会话。图形化的前端真的很好。不用再为GDB和ITM打开单独的终端窗口。这就像在经历了漫长的乏味的徒步旅行之后,我的眼前出现了一道风景。这里的景色是非常不同的。

配置

安装非常容易。配置也不差。因为我用cortex-m-quickstart生成了我的项目,默认设置几乎是我的Discovery板所需要的全部。

cortex-m-quickstart模板有一个名为.vscode的文件夹,看起来应该是这样的:

.vscode
  - extensions.json
  - launch.json
  - tasks.json

我们修改 launch.json 来配置调试功能

参数

这里是 launch.json 中的参数列表。为你的特定设备和环境配置它们:

  • “cwd”:项目的路径
  • “configFiles”: 要加载的OpenOCD配置文件。
  • “device”: 目标设备标识符
  • “interface”: 用于连接的调试接口类型(默认为SWD) - 用于J-Link和BMP探头。
  • “name”: 配置的名称;出现在启动配置下拉菜单中。
  • “preLaunchTask”。调试会话开始前要运行的任务。指定一个在tasks.json中定义的任务。
  • “request”: 配置的请求类型。可以是 “启动 “或 “附加”。
  • “runToMain”。如果启用,调试器将运行到主函数的开始。
  • “serialNumber”。J-Link的特定参数。J-Link的序列号–只有在多个J-Link连接到计算机时才需要。
  • “servertype”: GDB服务器类型 - 支持的类型有jlink、openocd、pyocd、pe和stutil
  • “svdFile”: 描述微控制器外围设备的SVD文件的路径;如果没有提供,可以根据输入的 “设备 “选择一个。这可能会根据 “设备 “自动加载。
  • “swoConfig”: SWO/ITM配置
    • “enable”: 启用SWO解码
    • “cpuFrequency”: 目标CPU频率,单位为Hz。
    • “swoFrequency”: SWO频率,单位为Hz。
    • “source”: SWO数据的来源。可以是 “probe”,直接从调试探头获取,也可以是一个串口设备,使用调试探头外部的串口。
    • “decoders”: SWO解码器配置
      • “label”: 输出窗口的标签
      • “port”: ITM端口号

Example 1: Discovery Board / OpenOCD

这里是我的Discovery 板的配置。这基本上是[cortex-m-quickstart](https://github.com/rust-embedded/cortex-m-quickstart的默认设置:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "cortex-debug",
            "request": "launch",
            "name": "Debug (OpenOCD)",
            "servertype": "openocd",
            "cwd": "${workspaceRoot}",
            "preLaunchTask": "cargo build",
            "runToMain": true,
            "executable": "./target/thumbv7em-none-eabihf/debug/project-name",
            "device": "STM32F303VCT6",
            "configFiles": [
                "interface/stlink-v2-1.cfg",
                "target/stm32f3x.cfg"
            ],
            "svdFile": "${workspaceRoot}/.vscode/STM32F303.svd",
            "swoConfig": {
                "enabled": true,
                "cpuFrequency": 8000000,
                "swoFrequency": 2000000,
                "source": "probe",
                "decoders": [
                    { "type": "console", "label": "ITM", "port": 0 }
                ]
            }
        }
    ]
}

出于好奇,我把Nucleo-F429的STLink固件升级为JLink。因此,对于我的装有J-Link固件的Nucleo,我把 “servertype “改为 “jlink”,”interface “改为 “swd”。

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "cortex-debug",
            "request": "launch",
            "name": "Debug (J-Link)",
            "cwd": "${workspaceRoot}",
            "executable": "./target/thumbv7em-none-eabihf/debug/project-name",
            "servertype": "jlink",
            "device": "STM32F429ZI",
            "interface": "swd",
            "serialNumber": "",
            "preLaunchTask": "cargo build",
            "runToMain": true,
            "svdFile": "${workspaceRoot}/.vscode/STM32F429.svd",
            "swoConfig": {
                "enabled": true,
                "cpuFrequency": 8000000,
                "swoFrequency": 2000000,
                "source": "probe",
                "decoders": [
                    { "type": "console", "label": "ITM", "port": 0 }
                ]
            }
        },
    ]
}
view raw

附录

vscode的tasks与launch

tasks.json

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "${workspaceRoot}/build.sh",
            "args": [],
            "group": "build",
            "presentation": {
                // Reveal the output only if unrecognized errors occur.
                "reveal": "always"
            },
        },
        {
            "label": "gdb server",
            "type": "shell",
            "command": "${workspaceRoot}/gdbserver.sh",
            "group": "build",
        }
    ]
}

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": [
        {
            //"preLaunchTask": "build",
            //"preLaunchTask": "gdb server",
            "request": "launch",
            "type": "cortex-debug",
            "name": "Debug J-Link",
            "cwd": "${workspaceRoot}",
            "executable": "${workspaceRoot}/src/debug/main.elf",
            "serverpath": "/Applications/SEGGER/JLink_V720/JLinkGDBServerCLExe",
            "servertype": "jlink",
            "gdbPath": "/Users/wilson/software/program/riscv64-toolchain-10.2.0/bin/riscv64-unknown-elf-gdb",
            "device": "FE310",
            "interface": "jtag",
            "serialNumber": "", //If you have more than one J-Link probe, add the serial number here.
            "jlinkscript": "",
            "runToEntryPoint": "main",
            "svdFile": "${workspaceRoot}/SVD/design.svd",
        }
    ]
}

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "macFrameworkPath": [
                "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
            ],
            "compilerPath": "/Users/wilson/software/program/riscv64-toolchain-10.2.0/bin/riscv64-unknown-elf-gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

JATG和SWD的区别

ARM芯片有两种调试模式,一种是JTAG,一种是SWD,

  • JTAG的全称是Joint Test Action Group (测试行动联合组织),它是由几家主要电子制造商发起制订的PCB 和IC 测试标准,主要应用于电路的边界扫描测试和可编程芯片的在线系统编程。
  • SWD,全称是Serial Wire Debug(串行调试),它的接线方式较JTAG简单,2线式:SWDIO–串行数据线、SWDCLK–串行时钟线
    • SWD模式比JTAG在高速模式下更加可靠,在大数据量的情况下JTAG下载程序会失败,但是SWD发生的几率会小很多,基本使用JTAG的模式下可以直接使用SWD模式的,前提是仿真器支持。2)
    • 在GPIO口刚好缺一个的时候,可使用SWD仿真,这种模式支持更少的引脚;3)
    • 在PCB设计体积有限的时候推荐使用SWD模式

RED-V的Jlink下载与调试

  • Upload:
    hex=/Users/wilson/Downloads/test/src/debug/main.hex
    jlink=JLinkExe
    
    echo -e "loadfile $hex\nrnh\nexit" | $jlink -device FE310 -if JTAG -speed 4000 -jtagconf -1,-1 -autoconnect 
    
  • Debug:
    export RISCV_PATH=/Users/wilson/software/program/riscv64-toolchain-10.2.0
    extra_gdb=("-ex" "monitor allowsimulation 0")
    elf=/Users/wilson/Downloads/test/src/debug/main.elf
    gdb=$(RISCV_PATH)/bin/riscv64-unknown-elf-gdb
    GDB_PORT=3333
    
    $jlink -device RISC-V -port $GDB_PORT &
    
    $gdb $elf -ex "set remotetimeout 240" -ex "target extended-remote localhost:${GDB_PORT}" "${extra_gdb[@]}"
    

编译记录

  • make BSP=metal PROGRAM=hello TARGET=sifive-hifive1-revb upload
    /wilson/gitrepos/freedom-e-sdk/freedom-metal/src/drivers/sifive_local-external-interrupts0.c &&\
          mv -f $depbase.Tpo $depbase.Po
    depbase=`echo src/drivers/sifive_pwm0.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
          riscv64-unknown-elf-gcc -DPACKAGE_NAME=\"freedom-metal\" -DPACKAGE_TARNAME=\"freedom-metal\" -DPACKAGE_VERSION=\"v0.1.2\" -DPACKAGE_STRING=\"freedom-metal\ v0.1.2\" -DPACKAGE_BUGREPORT=\"https://github.com/sifive/freedom-metal/issues\" -DPACKAGE_URL=\"https://github.com/sifive/freedom-metal\" -DPACKAGE=\"freedom-metal\" -DVERSION=\"v0.1.2\" -I. -I/Users/wilson/gitrepos/freedom-e-sdk/freedom-metal     -march=rv32imac -mabi=ilp32 -mcmodel=medlow -ffunction-sections -fdata-sections -I/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include --specs=nano.specs -DMTIME_RATE_HZ_DEF=32768 -O0 -g -MT src/drivers/sifive_pwm0.o -MD -MP -MF $depbase.Tpo -c -o src/drivers/sifive_pwm0.o /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/src/drivers/sifive_pwm0.c &&\
          mv -f $depbase.Tpo $depbase.Po
    depbase=`echo src/drivers/sifive_rtc0.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
          riscv64-unknown-elf-gcc -DPACKAGE_NAME=\"freedom-metal\" -DPACKAGE_TARNAME=\"freedom-metal\" -DPACKAGE_VERSION=\"v0.1.2\" -DPACKAGE_STRING=\"freedom-metal\ v0.1.2\" -DPACKAGE_BUGREPORT=\"https://github.com/sifive/freedom-metal/issues\" -DPACKAGE_URL=\"https://github.com/sifive/freedom-metal\" -DPACKAGE=\"freedom-metal\" -DVERSION=\"v0.1.2\" -I. -I/Users/wilson/gitrepos/freedom-e-sdk/freedom-metal     -march=rv32imac -mabi=ilp32 -mcmodel=medlow -ffunction-sections -fdata-sections -I/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include --specs=nano.specs -DMTIME_RATE_HZ_DEF=32768 -O0 -g -MT src/drivers/sifive_rtc0.o -MD -MP -MF $depbase.Tpo -c -o src/drivers/sifive_rtc0.o /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/src/drivers/sifive_rtc0.c &&\
          mv -f $depbase.Tpo $depbase.Po
                  mv -f $depbase.Tpo $depbase.Po
    depbase=`echo gloss/sys_write.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
          riscv64-unknown-elf-gcc -DPACKAGE_NAME=\"freedom-metal\" -DPACKAGE_TARNAME=\"freedom-metal\" -DPACKAGE_VERSION=\"v0.1.2\" -DPACKAGE_STRING=\"freedom-metal\ v0.1.2\" -DPACKAGE_BUGREPORT=\"https://github.com/sifive/freedom-metal/issues\" -DPACKAGE_URL=\"https://github.com/sifive/freedom-metal\" -DPACKAGE=\"freedom-metal\" -DVERSION=\"v0.1.2\" -I. -I/Users/wilson/gitrepos/freedom-e-sdk/freedom-metal     -march=rv32imac -mabi=ilp32 -mcmodel=medlow -ffunction-sections -fdata-sections -I/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include --specs=nano.specs -DMTIME_RATE_HZ_DEF=32768 -O0 -g -MT gloss/sys_write.o -MD -MP -MF $depbase.Tpo -c -o gloss/sys_write.o /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/gloss/sys_write.c &&\
          mv -f $depbase.Tpo $depbase.Po
    rm -f libmetal-gloss.a
    riscv64-unknown-elf-ar cru libmetal-gloss.a gloss/crt0.o gloss/nanosleep.o gloss/sys_access.o gloss/sys_chdir.o gloss/sys_chmod.o gloss/sys_chown.o gloss/sys_clock_gettime.o gloss/sys_close.o gloss/sys_execve.o gloss/sys_exit.o gloss/sys_faccessat.o gloss/sys_fork.o gloss/sys_fstat.o gloss/sys_fstatat.o gloss/sys_ftime.o gloss/sys_getcwd.o gloss/sys_getpid.o gloss/sys_gettimeofday.o gloss/sys_isatty.o gloss/sys_kill.o gloss/sys_link.o gloss/sys_lseek.o gloss/sys_lstat.o gloss/sys_open.o gloss/sys_openat.o gloss/sys_read.o gloss/sys_sbrk.o gloss/sys_stat.o gloss/sys_sysconf.o gloss/sys_times.o gloss/sys_unlink.o gloss/sys_utime.o gloss/sys_wait.o gloss/sys_write.o 
    riscv64-unknown-elf-ranlib libmetal-gloss.a
    /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/install-sh -c -d '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/lib/debug'
    /usr/bin/install -c -m 644  libmetal.a libmetal-gloss.a '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/lib/debug'
    ( cd '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/lib/debug' && riscv64-unknown-elf-ranlib libmetal.a )
    ( cd '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/lib/debug' && riscv64-unknown-elf-ranlib libmetal-gloss.a )
    /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/install-sh -c -d '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include'
    /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/install-sh -c -d '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include/metal/machine'
    /usr/bin/install -c -m 644  metal/machine/inline.h metal/machine/platform.h '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include/metal/machine'
    /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/install-sh -c -d '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include/metal'
    /usr/bin/install -c -m 644  metal/machine.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/atomic.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/button.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/cache.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/clock.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/compiler.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/cpu.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/csr.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/gpio.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/hpm.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/i2c.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/init.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/interrupt.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/io.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/itim.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/led.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/lim.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/lock.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/memory.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/pmp.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/privilege.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/pwm.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/rtc.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/shutdown.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/scrub.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/spi.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/switch.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/timer.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/time.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/tty.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/uart.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/watchdog.h '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include/metal'
    /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/install-sh -c -d '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include/metal/drivers'
    /usr/bin/install -c -m 644  /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/fixed-clock.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/fixed-factor-clock.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/riscv_clint0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/riscv_cpu.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/riscv_plic0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_buserror0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_ccache0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_clic0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_fe310-g000_hfrosc.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_fe310-g000_hfxosc.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_fe310-g000_lfrosc.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_fe310-g000_pll.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_fe310-g000_prci.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_global-external-interrupts0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_gpio-buttons.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_gpio-leds.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_gpio-switches.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_gpio0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_i2c0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_l2pf0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_local-external-interrupts0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_pwm0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_rtc0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_spi0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_test0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_trace.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_uart0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_simuart0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/sifive_wdog0.h /Users/wilson/gitrepos/freedom-e-sdk/freedom-metal/metal/drivers/ucb_htif0.h '/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include/metal/drivers'
    date > /Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/lib/debug/stamp
    /Library/Developer/CommandLineTools/usr/bin/make -f scripts/virtualenv.mk virtualenv
    make[1]: Nothing to be done for `virtualenv'.
    . /Users/wilson/gitrepos/freedom-e-sdk/venv/bin/activate && scripts/ldscript-generator/generate_ldscript.py -d /Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/design.dts -o /Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/metal.default.lds
    Generating linker script with default layout
    Using layout:
            rom: 0x20010000-0x2007a11f (/soc/spi@10014000)
            ram: 0x80000000-0x80003fff (/soc/dtim@80000000)
            itim: 0x08000000-0x08001fff (/soc/itim@8000000)
    RAM memories:
            itim_0: 0x08000000-0x00002000
            dtim_0: 0x80000000-0x00004000
    Consolidated RAM memories:
            dtim_0: 0x80000000-0x00004000
            itim_0: 0x08000000-0x00002000
    mkdir -p /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/
    /Library/Developer/CommandLineTools/usr/bin/make -C /Users/wilson/gitrepos/freedom-e-sdk/software/hello hello \
        PORT_DIR= \
        PROGRAM=hello \
        AR=/Users/wilson/software/program/riscv64-toolchain-10.2.0/bin/riscv64-unknown-elf-ar \
        CC=/Users/wilson/software/program/riscv64-toolchain-10.2.0/bin/riscv64-unknown-elf-gcc \
        CXX=/Users/wilson/software/program/riscv64-toolchain-10.2.0/bin/riscv64-unknown-elf-g++ \
        ASFLAGS="-march=rv32imac -mabi=ilp32 -mcmodel=medlow --specs=nano.specs -O0 -g" \
        CCASFLAGS="-march=rv32imac -mabi=ilp32 -mcmodel=medlow -I/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include --specs=nano.specs" \
        CFLAGS="-march=rv32imac -mabi=ilp32 -mcmodel=medlow -ffunction-sections -fdata-sections -I/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include --specs=nano.specs -DMTIME_RATE_HZ_DEF=32768 -O0 -g" \
        CXXFLAGS="-march=rv32imac -mabi=ilp32 -mcmodel=medlow -ffunction-sections -fdata-sections -I/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include --specs=nano.specs -DMTIME_RATE_HZ_DEF=32768 -O0 -g" \
        XCFLAGS="-DMETAL_WAIT_CYCLE=0" \
        LDFLAGS="-Wl,--gc-sections -Wl,-Map,hello.map -nostartfiles -nostdlib -L/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/lib/debug/ -T/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/metal.default.lds" \
        LDLIBS="-Wl,--start-group -lc -lgcc -lm -lmetal -lmetal-gloss -Wl,--end-group" \
        FREERTOS_METAL_VENV_PATH="/Users/wilson/gitrepos/freedom-e-sdk/venv"
    /Users/wilson/software/program/riscv64-toolchain-10.2.0/bin/riscv64-unknown-elf-gcc -march=rv32imac -mabi=ilp32 -mcmodel=medlow -ffunction-sections -fdata-sections -I/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/include --specs=nano.specs -DMTIME_RATE_HZ_DEF=32768 -O0 -g  -Wl,--gc-sections -Wl,-Map,hello.map -nostartfiles -nostdlib -L/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/install/lib/debug/ -T/Users/wilson/gitrepos/freedom-e-sdk/bsp/sifive-hifive1-revb/metal.default.lds  hello.c  -Wl,--start-group -lc -lgcc -lm -lmetal -lmetal-gloss -Wl,--end-group -o hello
    mv /Users/wilson/gitrepos/freedom-e-sdk/software/hello/hello /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/hello.elf
    mv /Users/wilson/gitrepos/freedom-e-sdk/software/hello/hello.map /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/
    touch -c /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/hello.elf
    /Users/wilson/software/program/riscv64-toolchain-10.2.0/bin/riscv64-unknown-elf-objdump --source --all-headers --demangle --line-numbers --wide /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/hello.elf > /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/hello.lst
    /Users/wilson/software/program/riscv64-toolchain-10.2.0/bin/riscv64-unknown-elf-size /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/hello.elf
      text    data     bss     dec     hex filename
      26750    2768    3236   32754    7ff2 /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/hello.elf
    /Users/wilson/software/program/riscv64-toolchain-10.2.0/bin/riscv64-unknown-elf-objcopy -O ihex /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/hello.elf /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/hello.hex
    scripts/upload --hex /Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/hello.hex --jlink JLinkExe
    SEGGER J-Link Commander V7.20 (Compiled Apr 28 2021 17:34:16)
    DLL version V7.20, compiled Apr 28 2021 17:34:09
    
    Connecting to J-Link via USB...O.K.
    Firmware: J-Link OB-K22-SiFive compiled Mar  3 2021 14:13:05
    Hardware version: V1.00
    S/N: 979005765
    VTref=3.300V
    Device "FE310" selected.
    
    
    Connecting to target via JTAG
    ConfigTargetSettings() start
    ConfigTargetSettings() end
    TotalIRLen = 5, IRPrint = 0x01
    JTAG chain detection found 1 devices:
    #0 Id: 0x20000913, IRLen: 05, Unknown device
    Debug architecture:
      RISC-V debug: 0.13
      AddrBits: 7
      DataBits: 32
      IdleClks: 5
    Memory access:
      Via system bus: No
      Via ProgBuf: Yes (16 ProgBuf entries)
    DataBuf: 1 entries
      autoexec[0] implemented: Yes
    Detected: RV32 core
    CSR access via abs. commands: No
    Temp. halted CPU for NumHWBP detection
    HW instruction/data BPs: 8
    Support set/clr BPs while running: No
    HW data BPs trigger before execution of inst
    RISC-V identified.
    
    
    Downloading file [/Users/wilson/gitrepos/freedom-e-sdk/software/hello/debug/hello.hex]...
    J-Link: Flash download: Bank 0 @ 0x20000000: 1 range affected (65536 bytes)
    J-Link: Flash download: Total: 3.191s (Prepare: 2.008s, Compare: 0.401s, Erase: 0.131s, Program & Verify: 0.636s, Restore: 0.014s)
    J-Link: Flash download: Program & Verify speed: 101 KB/s
    O.K.
    ConfigTargetSettings() start
    ConfigTargetSettings() end
    TotalIRLen = 5, IRPrint = 0x01
    JTAG chain detection found 1 devices:
    #0 Id: 0x20000913, IRLen: 05, Unknown device
    Debug architecture:
      RISC-V debug: 0.13
      AddrBits: 7
      DataBits: 32
      IdleClks: 5
    Memory access:
      Via system bus: No
      Via ProgBuf: Yes (16 ProgBuf entries)
    DataBuf: 1 entries
      autoexec[0] implemented: Yes
    Detected: RV32 core
    CSR access via abs. commands: No
    HW instruction/data BPs: 8
    Support set/clr BPs while running: No
    HW data BPs trigger before execution of inst
    RISC-V: Performing reset via <ndmreset>
    
    freedom-e-sdk on  master [!?] took 16s 
    [I] ➜ 
    

    正常的GDB连接过程:

    SEGGER J-Link GDB Server V6.80a Command Line Version
    
    JLinkARM.dll V6.80a (DLL compiled May 29 2020 16:28:29)
    
    Command line: -if jtag -device FE310 -endian little -speed 1000 -port 2331 -swoport 2332 -telnetport 2333 -vd -ir -localhostonly 1 -singlerun -strict -timeout 0 -nogui
    -----GDB Server start settings-----
    GDBInit file:                  none
    GDB Server Listening port:     2331
    SWO raw output listening port: 2332
    Terminal I/O port:             2333
    Accept remote connection:      localhost only
    Generate logfile:              off
    Verify download:               on
    Init regs on start:            on
    Silent mode:                   off
    Single run mode:               on
    Target connection timeout:     0 ms
    ------J-Link related settings------
    J-Link Host interface:         USB
    J-Link script:                 none
    J-Link settings file:          none
    ------Target related settings------
    Target device:                 FE310
    Target interface:              JTAG
    Target interface speed:        1000kHz
    Target endian:                 little
    
    Connecting to J-Link...
    J-Link is connected.
    Firmware: J-Link OB-K22-SiFive compiled Mar  3 2020 13:20:23
    Hardware: V1.00
    S/N: 979005765
    Checking target voltage...
    Target voltage: 3.30 V
    Listening on TCP/IP port 2331
    Connecting to target...
    
    J-Link found 1 JTAG device, Total IRLen = 5
    JTAG ID: 0x20000913 (RISC-V)
    Connected to target
    Waiting for GDB connection...
    
    Connected to 127.0.0.1
    Reading all registers
    Received monitor command: speed 1000
    Target interface speed set to 1000 kHz
    Received monitor command: clrbp
    Received monitor command: reset
    Resetting target
    Received monitor command: halt
    Halting target CPU...
    ...Target halted (PC = 0x00001004)
    Received monitor command: regs
    X0 = 00000000, X1 = 20015758, X2 = 80000E60, X3 = 80001288
    X4 = 00000000, X5 = 20010C22, X6 = 00000000, X7 = 00000000
    X8 = 00000000, X9 = 02000080, X10= 00000000, X11= 80000E80
    X12= 00000000, X13= 00000001, X14= 00000000, X15= 80000E80
    X16= 00000000, X17= 200176A7, X18= 02000080, X19= 00000000
    X20= 00000000, X21= 00000000, X22= 00000000, X23= 00000000
    X24= 00000000, X25= 00000000, X26= 00000000, X27= 00000000
    X28= 00000025, X29= 00000000, X30= 00000000, X31= 00000000
    PC = 00001004
    Reading all registers
    Received monitor command: speed auto
    Select auto target interface speed (4000 kHz)
    Received monitor command: flash breakpoints 1
    Flash breakpoints enabled
    Received monitor command: semihosting enable
    Semi-hosting enabled (SVC Addr = 0x08)
    Received monitor command: semihosting IOClient 1
    Semihosting I/O set to TELNET Client
    Downloading 732 bytes @ address 0x20010000 - Verified OK
    Downloading 12 bytes @ address 0x200102E0 - Verified OK
    Downloading 122 bytes @ address 0x200102EC - Verified OK
    Downloading 3044 bytes @ address 0x20010368 - Verified OK
    Downloading 15584 bytes @ address 0x20010F80 - Verified OK
    Downloading 7268 bytes @ address 0x20014C60 - Verified OK
    Downloading 2756 bytes @ address 0x200168C8 - Verified OK
    Comparing flash   [....................] Done.
    Erasing flash     [....................] Done.
    Programming flash [....................] Done.
    Writing register (pc = 0x20010000)
    Reading 64 bytes @ address 0x20010F80
    Read 4 bytes @ address 0x20010F88 (Data = 0x200107B7)
    Read 4 bytes @ address 0x20010F88 (Data = 0x200107B7)
    Reading all registers
    Setting breakpoint @ address 0x20010F88, Size = 4, BPHandle = 0x0002
    Starting target CPU...
    Reading all registers
    Removing breakpoint @ address 0x20010F88, Size = 4
    Reading 64 bytes @ address 0x80000F40
    Reading 64 bytes @ address 0x00000000
    Reading 64 bytes @ address 0x00000040
    Reading 64 bytes @ address 0x00000080
    Read 4 bytes @ address 0x200102E4 (Data = 0x20010310)
    Read 4 bytes @ address 0x200102E0 (Data = 0x200102EC)
    Read 4 bytes @ address 0x200102E8 (Data = 0x2001033C)
    Read 4 bytes @ address 0x80000AA4 (Data = 0x80000F70)
    Reading 8 bytes @ address 0x80000F70
    Read 4 bytes @ address 0x80000AA8 (Data = 0x80000AB4)
    ........
    Read 4 bytes @ address 0x80000A6C (Data = 0x00000000)
    Read 4 bytes @ address 0x80000A70 (Data = 0x00000000)
    Read 4 bytes @ address 0x80000A74 (Data = 0x00000000)
    Reading 64 bytes @ address 0x20010F80
    Reading 64 bytes @ address 0x20010FC0