TIH64 之一 编写 TIH64Vx690 的 SVD 文件及使用 SVD 辅助调试

  TIH64Vx690 是方寸微电子研发的高安全、高可靠的 RISC-V 架构的微处理器系列芯片,重点面向网络安全领域,提供安全的单芯片解决方案。TIH64Vx690 提供了 Linux SDK 和 BareMetal SDK,使用芯来的 NucleiStudio 作为集成开发环境。

  在使用中发现,相比于 ARM 架构,RISC-V 架构的相关基础设施要差了不少,在代码调试时尤为明显!类比于 ARM,突然想到了 SVD 文件用于 RISC-V 是否可行,TIH64 系列 SDK 并没有提供 SVD 文件,特此记录移植使用过程!

CMSIS

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

  使用 ARM 内核的芯片供应商则可以直接在 CMSIS 的基础上定制自己的 SDK。例如,STM32 系列的 SDK 就是在 CMSIS 的基础上添加了自己的各种源码文件、示例代码、文档等等。

现实情况是,大部分芯片供应商都是仅使用其中的 CORE 相关源码文件

Open-CMSIS-Pack Project

  Open-CMSIS-Pack 定义了一个芯片要提供的开发包需要包含哪些目录和文件以及如何打包发布。 2021 年 4 月,ARM 牵头成了 Open-CMSIS-Pack Project,将 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
    3. 实际就是原来的 CMSIS-Pack
  2. 相关工具
    1. 源码仓库:https://github.com/Open-CMSIS-Pack/devtools
    2. 实用程序:预编译的可执行程序见仓库发布页面
    3. 实际就是原来的 CMSIS-Toolbox

  Open-CMSIS-Pack 中的内容其实就是把原来 CMSIS 中的 CMSIS-Pack 和 CMSIS-Toolbox 独立出来了,本质上还是那一套东西。貌似没有几家的 SDK 是根据严格按照这个规范来发行的!

CMSIS Version 5

  现在,ARM 自家的内核软件包(本身就被称为 CMSIS)也是根据 Open-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 5 之前的时旧版本的 CMSIS,旧版本的 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 检测工具。

NMSIS

  TIH64Vx690 使用的是芯来 UX608 作为 CPU,因此,SDK 的内核源文件使用了芯来的 NMSIS。NMSIS 则是芯来参照 ARM 的 CMSIS 搞了一套自己的独立于供应商的硬件抽象层代码库。
在这里插入图片描述
  与 STM32 基于 CMSIS 提供自己的 SDK 类似,TIH64 系列 SoC 也是基于 NMSIS 提供了自己的 BareMetal SDK。但是,SDK 里面并没有实现 NMSIS 中定义的 SVD 文件。

NMSIS 应该还是初级阶段,其本身也不完善

SVD 文件

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

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

源码

  我从 ARM 的 CMSIS 中提取了相关工具并打包,组成了 TIH64-SVD 开源项目,开源地址 https://gitee.com/itexp/TIH64-SVD。TIH64Vx690 系列 SoC 寄存器一大堆,目前,我正在逐步添加中。感兴趣的可以提交 PR 共同完善。

编写

  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
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
以下是基于MATLAB的SFR函数的示例代码: ```matlab function [resolution, sfr, freq] = calculate_sfr(image, threshold, fft_size, angle) % 计算图像的分辨率 % % 输入参数: % image - 输入图像,为灰度图像 % threshold - Sobel算子的阈值,默认为0.1 % fft_size - 傅里叶变换的大小,默认为512 % angle - SFR算法的方向,0表示水平方向,90表示垂直方向,默认为0 % % 输出参数: % resolution - 图像分辨率 % sfr - SFR曲线 % freq - 空间频率 % 设置默认参数 if nargin < 4 angle = 0; end if nargin < 3 fft_size = 512; end if nargin < 2 threshold = 0.1; end % 计算边缘 if angle == 0 edge_image = edge(image, 'sobel', threshold, 'horizontal'); else edge_image = edge(image, 'sobel', threshold, 'vertical'); end % 计算SFR sfr = sum(edge_image, angle+1)'; % 对SFR进行傅里叶变换 sfr_fft = abs(fft(sfr, fft_size)); sfr_fft = sfr_fft(1:fft_size/2); % 计算空间频率 freq = (0:(fft_size/2-1)) / fft_size; % 找到SFR曲线的第一个峰值 [pks, locs] = findpeaks(sfr_fft); [~, max_idx] = max(pks); resolution = freq(locs(max_idx)); % 绘制SFR曲线 plot(freq, sfr_fft); xlabel('空间频率'); ylabel('幅度'); title(sprintf('分辨率 = %.2f', resolution)); ``` 使用示例: ```matlab image = imread('lena.png'); gray_image = rgb2gray(image); [resolution, sfr, freq] = calculate_sfr(gray_image); ``` 需要注意的是,该函数仅适用于灰度图像。如果要对彩色图像进行分辨率计算,需要先将其转换为灰度图像。此外,SFR算法的参数需要根据图像的特性进行适当调整。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZC·Shou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值