我正在尝试使用riscv32-unknown-linux-gnu-gcc工具链编译FreeRTOS riscv_spike端口,但出现了错误
错误: ../../Source/portable/GCC/RISCV/port.c:121:错误:指令csrr需要绝对表达式
以下代码来自freeRtos源的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无效 我可以通过阅读规范在“编码”文件中添加此必需的定义吗?
谢谢
答案 0 :(得分:1)
根据第3.1.15节中的riscv-privildged-v1.10,mtime和mtimecmp公开为内存映射的机器模式寄存器。通过存储(sw
)和加载指令(lw
)可以访问它们,而不是通过csr*
指令来访问它们。
因此,它们依赖于平台实施-特别是其地址取决于平台。
您的代码无法汇编,因为csrr
和csrw
既期望值,也不期望您编写的表达式可重定位。但是,正如开头所述,您必须使用sw和lw指令-并确保实现了mtime&mtimecmp以及可以在哪个地址访问它们。