0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RISCV的模块化的概念及编译开发riscv gcc相关

嵌入式小作坊 来源:嵌入式IoT 作者: bigmagic 2021-08-10 10:03 次阅读

1.概述由于RISCV的模块化的指令集的定义,各家都有着自己的实现方式。从当前看来,除了标准的CSR外,很多都实现了自己的CSR指令扩展。如何自定义CSR并且让编译器能够识别,本文将进行一定的分析,同时从riscv gcc开发的角度出发,来分析编译器开发的流程。

2.不改变编译工具链实现CSR添加如果想读写CSR,可以使用汇编指令进行操作。

void test_csr()

{

int a = 0x00200;

asm volatile(“csrw 0x307,%0”::“r”(a));

}

通过反汇编

riscv32-unknown-elf-objdump -D virt_test.elf 》 1.txt

得到该函数的汇编代码

c8a2b35c-f86c-11eb-9bcf-12bb97331649.png

由于编号为0x307的CSR没有标准定义,所以会直接会体现在汇编函数中。但是这样并不会影响功能的使用。

对于这些非标准的CSR的读写操作,RISCV GCC并不会根据特定的编码序号生成相应的名称。

比如芯来科技为其eclic定义的一条CSR。

如果用标准的GCC进行编译,那么需要给定CSR地址(0x7ed)。

这样的实现,在写汇编函数的时候,给定CSR的地址即可,不能写名字。比如:

csrw 0x7ed,zero

通过上述的方式,可以完成不改变编译器的情况下,实现非标准的CSR的操作。

3.在编译器中集成CSR名称往往通过汇编去查看时,若没有CSR名称,直接去查看CSR的地址,有时候还需要通过CSR的地址,查阅相关的寄存器手册,才能明白读写哪个寄存器。为了简化这种操作,可以将CSR的名称添加到gcc中。这里借用玄铁C906上的扩展指令进行实验。

如果不想改变gcc,那么实现上直接可以通过内联汇编。

void test_csr()

{

int a = 0x00200;

asm volatile(“csrw 0x7c0,%0”::“r”(a));

}

那么最后反汇编得到结果如下:

c9b764e0-f86c-11eb-9bcf-12bb97331649.png

这显然还是不够直观。

为了让其更加的直观,可以修改RISCV工具链。

这里使用的是riscv-gnu-toolchain,目前做编译器开发需要对该仓库的使用非常熟悉。

https://github.com/riscv/riscv-gnu-toolchain.git

将代码进行clone后,更新子模块。

git submodule init

git submodule update

其中需要修改的是riscv-gnu-toolchain/riscv-binutils/include/opcode/riscv-opc.h

同时将MXSTATUS的地址添加进去。

这样就能够,编译工具链,用生成的编译工具链去编译代码,就能够正常的看到反汇编的执行效果了。

这样,无论是传递地址csrw 0x7c0,zero,还是传递名称csrw mxstatus,zero,汇编器都能够正常的输出CSR名称。

通过对编译器的修改,也是非常的简单的实现了这个功能。

4.编译开发riscv gcc相关如果要研究riscv gcc的开发工作,搭建环境,加快编译效率很关键。由于编译工具链很大,涉及到的模块很多,而且编译的过程很复杂,为了节省编译的时间,可以通过编译选项来进行约束。

通常情况下,编译全功能的gcc,可以采用

。/configure --prefix=$PREFIX --enable-multilib --with-cmodel=medany

当使能了--enable-multilib,就能够编译很多版本的lib库。

。/riscv64-unknown-elf-gcc --print-multi-lib

。;

rv32i/ilp32;@march=rv32i@mabi=ilp32

rv32ic/ilp32;@march=rv32ic@mabi=ilp32

rv32im/ilp32;@march=rv32im@mabi=ilp32

rv32imc/ilp32;@march=rv32imc@mabi=ilp32

rv32iac/ilp32;@march=rv32iac@mabi=ilp32

rv32imac/ilp32;@march=rv32imac@mabi=ilp32

rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f

rv32imafdc/ilp32d;@march=rv32imafdc@mabi=ilp32d

rv32e/ilp32e;@march=rv32e@mabi=ilp32e

rv32ec/ilp32e;@march=rv32ec@mabi=ilp32e

rv32emc/ilp32e;@march=rv32emc@mabi=ilp32e

rv32ema/ilp32e;@march=rv32ema@mabi=ilp32e

rv32emac/ilp32e;@march=rv32emac@mabi=ilp32e

rv32eac/ilp32e;@march=rv32eac@mabi=ilp32e

rv64i/lp64;@march=rv64i@mabi=lp64

rv64im/lp64;@march=rv64im@mabi=lp64

rv64imc/lp64;@march=rv64imc@mabi=lp64

rv64imac/lp64;@march=rv64imac@mabi=lp64

rv64imafc/lp64f;@march=rv64imafc@mabi=lp64f

这样实际上也是消耗了很多时间,为了解决这个问题,可以指定特定的march和mabi进行编译和测试,待开发完成后,发布时在进行整体编译。这样开发效率会高出很多。

make clean

。/configure --prefix=$RISCV/0727/rv32 --with-arch=rv32gc --with-abi=ilp32d --disable-gdb

make -j8

例如上面的命令,只编译march为rv32gc,abi为ilp32d的gcc模型。省略掉很多库的编译,让编译的时间缩短了不少。

5.小结为自己的处理器添加特定的CSR支持,一种情况下可以使用CSR的地址进行,另外一种就是修改汇编器,前一种方法比较直观,适合使用riscv通用编译器的开发方式进行开发,但是不够直观。后一种则需要修改汇编器,并且需要自己编译工具链,比较复杂,但是使用起来直观,简单。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CSR
    CSR
    +关注

    关注

    3

    文章

    118

    浏览量

    69698
  • 函数
    +关注

    关注

    3

    文章

    4345

    浏览量

    62911
  • 编译器
    +关注

    关注

    1

    文章

    1642

    浏览量

    49252

原文标题:riscv gcc中添加自定义的csr支持

文章出处:【微信号:gh_390c588e521e,微信公众号:嵌入式小作坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RISCV 操作常见问题集 - v4

    /riscv-xpack-toolchain_8.3.0-2.3_windows/bin/../lib/gcc/riscv-none-embed/8.3.0/../../../../riscv
    的头像 发表于 11-01 11:06 375次阅读

    谐波的概念及应用

    本文简单介绍了谐波的概念及应用。
    的头像 发表于 10-18 14:14 659次阅读
    谐波的<b class='flag-5'>概念及</b>应用

    riscv架构和arm的区别是什么

    都可以自由地使用、修改和分发RISC-V的设计,而不需要支付许可费用。 2. 模块化: RISC-V的设计非常模块化,它提供了基本的指令集(RV32I/RV64I)以及可选的扩展,如浮点运算(F)、向量处理(V)、原子操作(A)等。这种
    的头像 发表于 09-07 09:37 2044次阅读

    RISCV的主流指令集有哪些?

    如题,就像X86中指令集有MMX,SSE,SSE2等,就像ARM指令集有ARM和Thumb等,但是总是感觉RISCV特别乱,可能是厂商比较多的缘故吧,我知道的有WCH的青稞RISC-V,玄铁
    发表于 08-29 13:49

    在ubuntu 24.04下尝试使用riscv64-linux-musleabi_for_x86_64-pc-linux-gnu工具链编译cv1800大核出现报错的原因?

    在ubuntu 24.04下尝试使用riscv64-linux-musleabi_for_x86_64-pc-linux-gnu工具链编译cv1800大核,结果出现如下报错: /home
    发表于 07-16 08:20

    https_server编译报错的原因?

    /riscv32-esp-elf/esp-2021r2-patch3-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.
    发表于 06-26 07:05

    ESP-IDF 4.4例程hello_world编译失败的原因?

    32-esp-elf/esp-2021r2-patch2-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../
    发表于 06-17 06:41

    Eclipse IDE+IDF- 蓝牙例程“A2DP_Source\"编译错误:undefined reference to...\"怎么解决?

    大家好,最近因为需要选择蓝牙音频例程a2dp_source作为基本模板做开发,但是第一步就卡住了。 在eclipse IDE中导入例程,编译的时候出错,很多undefined reference
    发表于 06-11 07:00

    使用ESP32 h2开发低功耗的过程中,无法调用低功耗接口的API如何解决?

    /riscv32-esp-elf/esp-12.2.0_20230208/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/12.2.0
    发表于 06-07 06:57

    国产riscv芯片大汇总?

    请问有统计国产的riscv芯片的吗?能汇总一下吗?
    发表于 04-27 11:53

    RISCV Debug连接报错问题

    今天有同事反馈出这样一个在使用RISCV 调试时的问题: Error: no device found Error: unable to open ftdi device with vid 0403
    的头像 发表于 04-23 14:49 1383次阅读
    <b class='flag-5'>RISCV</b> Debug连接报错问题

    RISCV soft JTAG调试_v1.2

    因为目前软件的限制,RISCV的逻辑不能同时共用JTAG,所以如果想要同时去调试逻辑和RISCV的话,可以通过RISCV的soft Jtag来实现。soft Jtag就是通过GPIO来实现的软件
    的头像 发表于 04-23 08:38 1154次阅读

    全志D1s开发板软件入门之Hello World演示

    /riscv64-unknown-linux-gnu-gcc -o hello_word hello_word.c 编译完成后会在当前文件夹生成名为hello_word文件,这个就是可以在开发板上运行的可执行文件
    发表于 03-06 11:30

    RISCV soft JTAG调试_v1.1

    因为目前软件的限制,RISCV的逻辑不能同时共用JTAG,所以如果想要同时去调试逻辑和RISCV的话,可以通过RISCV的soft Jtag来实现。soft Jtag就是通过GPIO来实现的软件
    的头像 发表于 02-23 16:16 730次阅读
    <b class='flag-5'>RISCV</b> soft JTAG调试_v1.1

    rtthread d1s编译报错的原因是什么?如何处理?

    scons: building terminated because of errors. 我怀疑这是我的riscv编译器不对导致的,但是Xuantie-900-gcc-elf-newlib-mingw-V2.6.1-gdbt
    发表于 02-22 06:43