RISC-V 之一 使用 ARM CMSIS 的 SVD 文件辅助调试

  现在,工作重点从 ARM 架构转到了 RISC-V 架构,在使用中发现,相比于 ARM 架构,RISC-V 架构的相关基础设施要差了不少。在代码调试时尤为明显!类比于 ARM,突然想到了 SVD 文件用于 RISC-V 是否可行,特此记录分享一下!

CMSIS

  CMSIS 最初是 ARM 自家为了自己的 Cortex-M 核制定的一些列规范,因此,它原来是 Cortex Microcontroller Software Interface Standard 的缩写。后来它不断被完善及扩展,现在则被称为 Common Microcontroller Software Interface Standard。

Open-CMSIS-Pack Project

  2021 年 4 月,ARM 牵头成了 Open-CMSIS-Pack Project,将 CMSIS-Pack 升级为一个开放的标准,以此来标准化嵌入式代码的分发(重用性)。Open-CMSIS-Pack 定义了一个芯片要提供的开发包需要包含哪些目录和文件以及如何打包发布。

  目前,Open-CMSIS-Pack Project 目前由 Linaro 与 Arm、NXP 和 ST 合作,作为孵化项目进行托管和管理。相关标准及工具都托管于 Github 仓库,主要由以下部分内容:

  1. Open-CMSIS-Pack-Spec
    1. 规范源码:https://github.com/Open-CMSIS-Pack/Open-CMSIS-Pack-Spec
    2. 在线文档:https://open-cmsis-pack.github.io/Open-CMSIS-Pack-Spec/main/html/index.html
  2. 相关工具
    1. 源码仓库:https://github.com/Open-CMSIS-Pack/devtools
    2. 实用程序:预编译的可执行程序见仓库发布页面

CMSIS Version 5

  现在,ARM 自家的内核软件包(本身就被称为 CMSIS)也是根据 Open-CMSIS-Pack 制定的规范来发布的。CMSIS-Pack 中除了包含大量 ARM 内核使用的相关代码,还包含了大量的模板,以供芯片厂商发布的软件包时添加自己的内容,从而形成一个完整的 CMSIS-Pack 以供用户直接使用。

  1. 源码仓库:https://github.com/ARM-software/CMSIS_5
  2. 在线文档:https://arm-software.github.io/CMSIS_5/latest/General/html/index.html
  3. 实用工具:包含于 CMSIS-Pack 的 CMSIS/Utilities 中,内含 SVD 转换工具,PACK 检测工具。实际就是从 https://github.com/Open-CMSIS-Pack/devtools 直接拿过来的。

CMSIS Version 4

  CMSIS 原本是 ARM 自家为了自己的 Cortex-M 核制定的一些列规范。旧版本的 CMSIS 也是采用 CMSIS-Pack 发布,但是部分模块没有提供源码。旧版已经不再维护,但是目前有部分芯片软件包还在使用旧版规范及相关工具。

  1. 源码仓库:https://github.com/ARM-software/CMSIS
  2. 在线文档:https://arm-software.github.io/CMSIS_5/latest/General/html/index.html
  3. 实用工具:包含于 CMSIS-Pack 的 CMSIS/Utilities 中,内含 SVD 转换工具,PACK 检测工具。这里面是旧版工具!

SVD 文件

  SVD(System View Description) 文件是 CMSIS(Common Microcontroller Software Interface Standard) 中的定义的一个 XML 格式的纯文本文件,其包含了芯片内核、芯片所具有的外设以及内核和外设的寄存器的完整描述(详细到寄存器的每个 BIT 位)。

  CMSIS 本身主要是针对 ARM 自家 Cortex 架构的,但是 CMSIS 足够开放,其他架构基本也可以模仿。因此,我们的 RISC-V 架构的芯片同样可以使用 SVD 文件。唯一需要注意的是 <cpu> 中的 <name> 填写 other 就可以了,其他填写规则与 ARM 一样即可(以下仅仅是个示例)。
在这里插入图片描述

编写

  SVD 文件是一个 XML 格式的文本文件,可以使用任何编辑器进行编辑。所有的字段解释在 Open-CMSIS-Pack 文档中都有详细的介绍,编写后,通过使用以下命令可以检查我们写的 SVD 文件是否有错误:

  1. 执行 SVDConv.exe UX600.svd -o Output -b Output/UX600.log,确保 0 错误 0 警告
  2. 执行 SVDConv.exe UX600.svd --generate=sfr -o Output,确保 0 错误 0 警告

用途

目前,SVD 主要有以下两大用途。

生成 芯片.h

  SVD 文件的内容足够详细,以至于使用相关工具命令(SVDConv.exe UX600.svd -o Output -b Output/UX600.log --generate=header)就可以根据编写的 SVD 文件直接生成芯片的顶级头文件(UX600.svd --> UX600.h)。
在这里插入图片描述
  注意,随着 CMSIS 规范的升级,SVD 文件内容及相应的工具出现了一些差异,尤其是生成的芯片头文件的代码格式。因此,我将两个版本的 SVD 独立保留。理论上,SVD 文件是向后兼容的,因此,这两个版本下的 SVD 基本是一致的,随便选择一个使用即可。

调试

  SVD 文件最主要的目的是调试时直接显示寄存器的每个比特位的状态。由于 ARM 在嵌入式领域的统治地位,目前,几乎所有主流嵌入式开发工具(部分可能需要依赖插件)均支持在调试时动态解析 SVD 文件。例如 Eclipse 中的使用效果如下:
在这里插入图片描述

注意,不同于 Keil 和 IAR 等,Eclipse 不支持实时显示寄存器值。因此,需要暂停程序执行后才可以查看寄存器值。

使用示例

  目前,绝大多数嵌入式开发工具都支持手动导入 SVD 文件。部分工具(例如,Keil)也使用二进制的 SFR 文件,需要使用命令 SVDConv.exe UX600.svd --generate=sfr -o Output 手动将 SVD 文件转换为二进制的 SFR 文件。

SfrCC2.Exe 就来自于 Keil

eclipse

调试配置界面有专门的 TAB 页来运行用户指定 SVD 文件,如下图所示:
在这里插入图片描述
进入调试界面,就可以在 Peripherals 标签下,看到我们添加的外设,选中想要查看的外设,就可以显示外设寄存器。
在这里插入图片描述

参考

  1. https://arm-software.github.io/CMSIS_5/General/html/index.html

猜你喜欢

转载自blog.csdn.net/ZCShouCSDN/article/details/127144450