Trying to Compile FreeRtos for Riscv .Error: Instruction csrr requires absolute expression

Trying to Compile FreeRtos for Riscv .Error: Instruction csrr requires absolute expression

我正在尝试使用 riscv32-unknown-linux-gnu-gcc 工具链编译 FreeRTOS riscv_spike 端口,但得到了他的错误

错误: ../../Source/portable/GCC/RISCV/port.c:121: 错误:指令 csrr 需要绝对表达式

以下代码来自port.c of freeRtos Source

    __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 是无效的 我可以通过阅读规范在 "encoding" 文件中添加这个必需的定义吗?

谢谢,

根据第 3.1.15 节中的 riscv-privildged-v1.10,mtime 和 mtimecmp 公开为内存映射机器模式寄存器。它们由存储 (sw) 和加载指令 (lw) 访问,而不是由 csr* 指令访问。

因此它们依赖于平台实现 - 特别是它们的地址依赖于平台。

无法汇编您的代码,因为 csrrcsrw 需要一个值而不是您所写的可重定位表达式。但是正如开头提到的,您必须使用 sw 和 lw 指令 - 并注意实现 mtime 和 mtimecmp 以及可以访问它们的地址。