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*
指令访问。
因此它们依赖于平台实现 - 特别是它们的地址依赖于平台。
无法汇编您的代码,因为 csrr
和 csrw
需要一个值而不是您所写的可重定位表达式。但是正如开头提到的,您必须使用 sw 和 lw 指令 - 并注意实现 mtime 和 mtimecmp 以及可以访问它们的地址。
我正在尝试使用 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*
指令访问。
因此它们依赖于平台实现 - 特别是它们的地址依赖于平台。
无法汇编您的代码,因为 csrr
和 csrw
需要一个值而不是您所写的可重定位表达式。但是正如开头提到的,您必须使用 sw 和 lw 指令 - 并注意实现 mtime 和 mtimecmp 以及可以访问它们的地址。