首页 > 解决方案 > 尝试为 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 无效我可以通过阅读规范在“编码”文件中添加这个必需的定义吗?

谢谢,

标签: linuxfreertosriscv

解决方案


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

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

您的代码无法组装,因为csrr&csrw期望既是一个值,又不是您编写的可重定位表达式。但正如开头提到的,您必须使用 sw 和 lw 指令 - 并注意实现 mtime 和 mtimecmp 以及可以访问它们的地址。


推荐阅读