gcc __asm__语句和csrr指令

wooyq4lh  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(303)

我正在尝试编写以下代码:

#define CONFIG_PMP_SLOTS 16
#define PMPCFG_STRIDE 4
#define CSR_PMPCFG_BASE  0x3a0

void csr_pmp_check(){
    for(int i = 0; i < (CONFIG_PMP_SLOTS / PMPCFG_STRIDE); i++)
    {
        int pmp_cfg;
        __asm__ volatile("csrrs %0, %1, x0"
                         : "=r" (pmp_cfg)      // output operand
                         : "r" (CSR_PMPCFG_BASE + PMPCFG_STRIDE * i )   // input operand
                         );
    }
}

但是当我尝试编译时,我得到了以下错误:
测试c:汇编器消息:
测试c:9:错误:未知CSR 'a5'
我尝试替换:

: "r" (CSR_PMPCFG_BASE + PMPCFG_STRIDE * i )   // input operand

签署人:

: "i" (CSR_PMPCFG_BASE + PMPCFG_STRIDE * i )   // input operand

但如果我这样做,我得到一个错误告诉我warning: 'asm' operand 1 probably does not match constraints
顺便说一句,我编译如下:

riscv32-unknown-elf-gcc -nostdlib  test.c
jxct1oxe

jxct1oxe1#

所以这个代码看起来很有效。非常感谢彼得和杰斯特。

#define CONFIG_PMP_SLOTS 16
#define PMPCFG_STRIDE 4
#define CSR_PMPCFG_BASE  0x3a0

__attribute__((optimize(2))) void csr_pmp_check(){
    for(int i = 0; i < (CONFIG_PMP_SLOTS / PMPCFG_STRIDE); i++)
    {
        int pmp_cfg;
        __asm__ volatile("csrr %0, %1"
                         : "=r" (pmp_cfg)      // output operand
                         : "i" (CSR_PMPCFG_BASE + i )   // input operand
                         );
    }
}

相关问题