linux - 尝试为 Riscv 编译 FreeRtos。错误:指令 csrr 需要绝对表达式
问题描述
我正在尝试使用 riscv32-unknown-linux-gnu-gcc 工具链编译 FreeRTOS riscv_spike 端口,但得到了他的错误
错误:../../Source/portable/GCC/RISCV/port.c:121:错误:指令 csrr 需要绝对表达式
以下代码来自freeRtos Source的port.c
__asm volatile("csrr t0,mtime");
__asm volatile("add t0,t0,%0" :: "r"(configTICK_CLOCK_HZ/configTICK_RATE_HZ));
__asm volatile("csrw mtimecmp,t0");
谁能描述我需要做哪些改变?我猜 mtime,mtimecmp 无效我可以通过阅读规范在“编码”文件中添加这个必需的定义吗?
谢谢,
解决方案
根据第 3.1.15 节中的 riscv-privildged-v1.10,mtime 和 mtimecmp 作为内存映射机器模式寄存器公开。它们由存储 ( sw
) 和加载指令 ( lw
) 访问,而不是由csr*
指令访问。
因此,它们依赖于平台实现——特别是它们的地址依赖于平台。
您的代码无法组装,因为csrr
&csrw
期望既是一个值,又不是您编写的可重定位表达式。但正如开头提到的,您必须使用 sw 和 lw 指令 - 并注意实现 mtime 和 mtimecmp 以及可以访问它们的地址。
推荐阅读
- docker - Docker 守护进程不会启动空间不足 catch-22
- javascript - 如何绕过 vuetify 的 v-select 内部状态
- c - Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?
- javascript - 动态存储对 setTimeout() 的引用
- python-3.x - 如何有粗体标题,但非粗体单元格 - 填充 pygsheets==2.0.1 的 worksheet.append_table
- mysql - 如何使用两个日期和 BETWEEN 将查询更新为计算 SUM 或 COUNT?
- javascript - JS - atob() 要解码的字符串包含无效字符
- python-3.x - 仅将升序值从 CSV 导入列表 - Python
- java - 在 Java 中使用 Log4j 显示休眠统计信息和 sql
- node.js - 对嵌套对象进行 OR 比较的 Mongoose 查询返回一个空数组