Risc-V:能够利用 GCC 的简单 RV32I 实现的最低 CSR 要求

2023-12-04

对于能够运行 GCC 生成的机器代码的 RV32I,最低的 CSR 要求是什么?

我正在考虑一个简单的基于 fpga(嵌入式)的实现。不需要虚拟内存或 Linux 支持。

另外,我应该使用什么 GCC 标志来防止它使用未实现的 CSR 相关指令?

浏览完 RISCV 特权 ISA 规范后,我仍然很困惑。

Thanks!


看看RARS模拟器作为简单 RISC V 实现的示例。它实现了足够的 CSR(例如异常原因、处理器状态、异常 pc、向量表地址等),您可以对中断处理程序进行编程。

你需要:

  • utvec— 设置异常处理程序地址
  • ustatus— 启用/禁用中断,
  • uscratch- 软件异常处理程序需要,
  • ucause— 说明异常的原因
  • uepc— 告诉异常时未完成指令的地址

还有其他一些。在RARS中,您可以在寄存器显示中看到实现的寄存器,控制和状态 tab.

我相信 RARS 支持计时器,所以有一些 为此的企业社会责任。它还提供浮点单元,因此一些 CSR 对于例外情况以及舍入配置。为了 处理内存访问异常,它有utval。然后它 提供一些柜台。另见表 2.2文件版本 20190608-Priv-MSU-已批准

我认为您对 CSR 的使用将仅限于独立应用程序配置,例如初始启动和中断处理,两者都可以用汇编语言编写。

很难想象编译后的 C 代码(目标文件,.o)会以任何方式触及 CSR。如果您有这样的例子,请分享。

在某些环境中,C 实现允许独立(例如非托管)程序。由某些编译器创建的此类程序可能包括启动配置和异常处理程序,尽管这些更有可能是用户提供的。例如,参见http://cs107e.github.io/guides/gcc/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Risc-V:能够利用 GCC 的简单 RV32I 实现的最低 CSR 要求 的相关文章

  • “yield”不是“std::this_thread”的成员

    我试图产生当前线程 std this thread yield 但不幸的是 海湾合作委员会更清楚 yield 不是 std this thread 的成员 我是否忘记了一些类似于 D GLIBCXX USE NANOSLEEP 的 hack
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 每次升级 Xcode 时,我都会遇到安装了 Brew 的 GCC 的链接器错误

    因此 我升级到 Mavericks 以及最新版本的 Xcode 5 02 并且正如预期的那样 无法编译任何包含 C 扩展的新 Ruby gem 这种情况尤其发生在我自己的项目 NMatrix 中 其中包含 C 和 C 代码 我重新安装了 X
  • 如何检测 gcc 5 的线程清理程序

    如何检测使用 gcc 5 的构建是否已打开线程清理程序 两者之间都没有 has feature thread sanitizer nor SANITIZE THREAD work include
  • 使用 -g 进行编译本身会降低性能吗? [复制]

    这个问题在这里已经有答案了 这是一个关于 gcc 和 clang 的问题 但可能适用于其他编译器 如果我编译我的 C 或 C 代码 并使用 g开关 这本身是否会以任何方式降低编译程序的性能 具有最小的优化 O0 具有最大优化 O3 Note
  • _mm256_fmadd_ps 比 _mm256_mul_ps + _mm256_add_ps 慢?

    我有一个图像处理算法来计算a b c d与AVX 伪代码如下 float a new float N float b new float N float c new float N float d new float N assign va
  • 如何在 g++ 中使用不同的 STL

    我想对 g 使用不同的 STL 而不是其默认的 libstdc 做到这一点最简单的方法是什么 我发现 nostdinc 标志禁止 g 查找其 STL 标头 但这只是编译时的事情 它仍然会使 g 链接到它自己的 STL 所以我需要找到一种方法
  • 我可以让 C++ 编译器在编译时实例化对象吗?

    我正在编写一些代码 其中包含大量相当简单的对象 我希望它们在编译时创建 我认为编译器能够做到这一点 但我无法弄清楚如何做到 In C我可以执行以下操作 include
  • 如何使用 #pragma 在 G++ 中启用优化

    我想在没有命令行参数的情况下启用 g 优化 我知道 GCC 可以通过写来做到这一点 pragma GCC optimize 2 在我的代码中 但它似乎在 G 中不起作用 此页面可能有帮助 http gcc gnu org onlinedoc
  • 警告:c 中指针和整数之间的比较[默认启用]

    我想检查用户输入是否仅包含数字 所以 我使用以下代码 for i 0 argv 1 i NULL i if isdigit argv 1 i printf Error return 1 它工作得很好 但我收到了这个警告 warning co
  • C 程序的“编译器正确”命令

    这是关于中提到的编译步骤Linux 期刊文章 https www linuxjournal com article 6463 C 程序是使用编译的cpp cc1 as and ld该文章中的命令 我能够执行这些步骤cpp as and ld
  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以
  • Linux 的 gcc __attribute__((selectany)) 替代方案?

    我想知道是否有替代方案 attribute selectany 在Linux中 我想定义这样的东西 char a qwe zxc 并将其包含在许多链接在一起的 c 文件中 因此链接器将看到 a 的多个定义 因此不会链接 我读过这个属性 se
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • C++ while 循环优化无法正常工作

    我有这个代码段 include
  • c - 将 .data 发送到不同的部分

    我想把其中的符号 data为特定 C 文件生成的节并将它们放在不同的节中 例如 mydata 在最终的可执行文件中 例如 normaldata c char my str this should appear in data special
  • 错误:“std::this_thread”尚未声明

    我尝试使用 std this thread sleep for 函数但收到错误 error std this thread has not been declared 包括标志 GLIBCXX USE NANOSLEEP 还需要什么来强制它
  • 如何检查给定调用站点的重载决策集

    如何检查重载解析集 我在多个调用站点中使用了 4 个相互竞争的函数 在一个调用站点中 我期望调用一个函数 但编译器会选择另一个函数 我不知道为什么 这不是微不足道的 为了了解发生了什么 我正在使用enable if disable if打开
  • GCC:数组类型具有不完整的元素类型

    我已经宣布了struct 我尝试传递这些结构的数组 以及double双精度数组和一个整数 到一个函数中 我得到一个 数组类型具有不完整的元素类型 当我编译它时来自 gcc 的消息 我在通过考试的过程中犯了什么错误struct到函数 type

随机推荐

  • 将自定义图标添加到 Woocommerce 购物车和结帐中的运输选项

    我想将图标添加到 Woocommerce 购物车和结账中的运输选项 例如 在 本地取货 选项中 我想在选项旁边显示一个小商店图标 如下所示 https ibb co jz0jJgk 我尝试在 Woocommerce gt 设置 gt 运输选
  • 谁创建了索引?

    是否可以检查谁在 SQL Server 上创建了索引 我只找到列出时间的脚本 select STATS DATE so object id index id StatsDate si name IndexName schema name s
  • 为 Angular 2 身份验证启用 WebAPI CORS

    我在 stackoverflow 上看到了一些答案 但我迷路了 我有 webapi 2 独立的 Angular 2 webapi项目来自模板 我唯一改变的是我添加了 CORS 并将以下行添加到 IdentityConfig cs gt Ap
  • 如何创建可在 Bootstrap 3 中缩放的响应式图像

    我目前正在使用 twitter bootstrap 3 并且在创建响应式图像时遇到问题 我用过img responsive班级 但图像尺寸并未放大 如果我使用width 100 代替max width 100 然后它就完美地工作了 哪里有问
  • ASP.NET MVC:将 ViewModel 相互嵌套,是否存在反模式?

    我有一个项目 其中 ViewModel 相互嵌套 因此它们本质上是域层次结构的字符串类型复制 例如 如果我们的域具有以下关系 组织有 1 到多个环境 环境有 1 到多台机器 那么将会有一个 OrganizationViewModel 其中包
  • Leetcode 200. 岛屿数量 TLE

    问题链接 https leetcode com problems number of islands 给定一个由 1 陆地 和 0 水 组成的二维网格图 计算岛屿的数量 岛屿四面环水 相邻陆地水平或垂直连接而成 您可以假设网格的所有四个边缘
  • R pheatmap:执行聚类并显示每个注释类别的树状图

    我知道如何使用 pheatmap 按注释类别对行 基因 进行分组 并且我知道如何对整组行 基因 执行 Person 的相关聚类 但我想要完成的是执行聚类 并显示独立的每个类别独立的树状图 这可能吗 或者我是否被迫为每个类别创建单独的热图以在
  • 4 个条件中的 2 个以上正则表达式

    我对用户密码有4个要求 至少 1 个 a z 字符 至少 1 个 A Z 字符 至少 1 个 0 9 字符 至少 1 个符号 但是 用户只需满足 4 个条件中的 2 个以上即可 密码VVVV1111 234567 AaAaAaAa or A
  • Python中的一等函数是什么

    我仍然对什么是一流函数感到困惑 如果我理解正确的话 一等函数应该使用一个函数作为对象 它是否正确 这是一流的功能吗 def this is example myarg1 return myarg1 def this is another e
  • 具有位置条件的 MongoDB 分页

    我想要获取按字段排序的数据 例如 db Users find limit 200 sort rating 1 skip 0 这是工作 我得到了排序的数据 并且可以使用分页 但是 如果添加条件 find location near 12 32
  • 将搜索文本字段实现到 jTable 中

    现在我有一个使用 KeyReleased 事件实现的搜索文本字段 当我开始输入例如 Andrew 中的 An 时 它没有找到 更新 jTable 并且在我完成准确输入 区分大小写 我想要的名称之后寻找 所以 我想要的是从此实现 Filter
  • 有没有办法在 Perl 的文件读取器中指定行标记分隔符?

    我正在 Perl 中通过 CGI 读取文本文件 并注意到当文件保存在 mac 的 textEdit 中时 行分隔符可以被识别 但是当我上传直接从 Excel 导出的 CSV 时 它们不能被识别 我猜这是一个 n 与 r 问题 但这让我想到
  • Mercurial 每种文件类型的合并策略

    All 我想使用 kdiff 合并具有特定后缀 例如 c h 的所有文件 并且我想对具有另一个后缀 例如 c h 的所有文件做两件事 关闭预合并并使用内部 其他 mdl 这样做的目的是允许我对特定文件类型使用一种 破坏合并 即 不可合并的文
  • 使用 javascript 将文件附加到 input type="file"

    我需要将 JavaScript 生成的文件 最多几 MB 发送到服务器 我需要用 POST 不是 ajax POST 来完成 如何通过 JavaScript 将文件添加到 input type file 根据预填充 HTML 表单文件输入由
  • 无法在 JavaScript 中启用按钮

    我也尝试过这个 但仍然不起作用 find set enabled true
  • 清单合并失败:uses-sdk:minSdkVersion 8 不能小于库中声明的版本 9 [com.google.android.gms:play-services:7.8.0]

    问题是 错误 任务 app processDebugManifest 执行失败 清单合并失败 uses sdk minSdkVersion 8 不能小于库 com google android gms play services 7 8 0
  • 优化的合并排序比快速排序更快

    http jsperf com optimized mergesort versus quicksort 为什么这种半缓冲区合并排序的速度与快速排序一样快 快速排序是 虽然它占用了原地log n 递归 堆栈空间 缓存友好 这个半缓冲区合并排
  • belongs_to 和 has_one 之间有什么区别?

    和有什么区别belongs to and a has one 阅读 Ruby on Rails 指南对我没有帮助 他们本质上做同样的事情 唯一的区别是你站在关系的哪一边 如果一个User has a Profile 然后在User你会上的课
  • 带三角形条的圆圈

    我一直在尝试在 OpenGL 中创建一个圆圈 但我不能使用三角形扇形 因为我读到它们在 directx 中不再可用 而且我还将进行 directx 调用 我不太明白三角形带是如何工作的 我所有的实现都有漏洞或奇怪的怪癖 任何人都可以帮助我
  • Risc-V:能够利用 GCC 的简单 RV32I 实现的最低 CSR 要求

    对于能够运行 GCC 生成的机器代码的 RV32I 最低的 CSR 要求是什么 我正在考虑一个简单的基于 fpga 嵌入式 的实现 不需要虚拟内存或 Linux 支持 另外 我应该使用什么 GCC 标志来防止它使用未实现的 CSR 相关指令