<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    文章

    117

    瀏覽量

    69463
  • 函數
    +關注

    關注

    3

    文章

    4117

    瀏覽量

    61469
  • 編譯器
    +關注

    關注

    1

    文章

    1585

    瀏覽量

    48746

原文標題:riscv gcc中添加自定義的csr支持

文章出處:【微信號:gh_390c588e521e,微信公眾號:嵌入式小作坊】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    國產riscv芯片大匯總?

    請問有統計國產的riscv芯片的嗎?能匯總一下嗎?
    發表于 04-27 11:53

    RISCV soft JTAG調試_v1.2

    因為目前軟件的限制,RISCV的邏輯不能同時共用JTAG,所以如果想要同時去調試邏輯和RISCV的話,可以通過RISCV的soft Jtag來實現。soft Jtag就是通過GPIO來實現的軟件
    的頭像 發表于 04-23 08:38 ?419次閱讀

    RISCV soft JTAG調試_v1.1

    因為目前軟件的限制,RISCV的邏輯不能同時共用JTAG,所以如果想要同時去調試邏輯和RISCV的話,可以通過RISCV的soft Jtag來實現。soft Jtag就是通過GPIO來實現的軟件
    的頭像 發表于 02-23 16:16 ?302次閱讀
    <b class='flag-5'>RISCV</b> soft JTAG調試_v1.1

    qemu-riscv在scode的gdb調試步驟

    qemu支持gdb調試,只需要在命令中添加 -s -S兩個參數即可,在bsp/qemu-riscv下已經有了qemu-dbg.sh,且加入了該參數
    的頭像 發表于 09-28 10:54 ?1045次閱讀
    qemu-<b class='flag-5'>riscv</b>在scode的gdb調試步驟

    求助,為什么會出現“relocation truncated to fit: R_RISCV_JAL ”?

    relocation truncated to fit: R_RISCV_JAL against `.L314\'編譯 mavpich2 報的錯。 我查了一下。貌似是 riscv 的連接器默認只能
    發表于 09-12 08:06

    在windows上安裝了msys2,riscv-gnu-toolchain工具鏈編譯報錯是為什么?

    在windows安裝了msys2,編譯riscv工具鏈源碼報錯,想求助各路大神幫我想想解決方法,謝謝! /d/Home/riscv-gnu-toolchain/riscv-binuti
    發表于 08-17 06:56

    RISCV如何去開啟和使用V擴展指令?

    。只需要在編譯選項中開啟即可。 從傳遞給riscvgcc的選項來看,帶有v擴展即可。 -march是指定了riscv模塊化的指令集選
    發表于 08-16 08:15

    riscv實現自定義指令并用qemu運行的過程

    qemu模擬硬件平臺,實現特定指令解析,同時寫裸機代碼來測試該指令的運行情況。當然,如果實現的很好,是需要修改riscvgcc的,讓自己的擴展指令加入。這里不做修改,后面會詳細描述細節。 自定義指令
    發表于 08-16 07:27

    全志D1開發RISCV64開箱評測

    的生態建設遠遠沒有arm強大,但是也在開源思想的引領下,開始逐步走向大眾的視野。 這塊哪吒 RISCV64的板子,從主要的核的特性上來看,與目前市面上可見的riscv開發板相比,特性主要有以下幾點: 1.
    發表于 08-16 07:05

    NucleiStudio編譯出錯是什么原因造成的?解決方法是什么?

    寫了一個代碼,編譯后爆出如下錯誤,請問哪位大神知道是什么問題,解決方法是什么? 錯誤如下: d:/fpga開發工具/nucleistudio_ide_202102-win64
    發表于 08-16 06:07

    請問蜂鳥E203的sdk開發環境是否可以將編譯工具鏈換成官方的riscv64-unknown-elf-gcc?

    我在Eclipse中將編譯器設置為了riscv64-unknown-elf-gcc,但好像編譯不了? 請問一下蜂鳥203是否支持用官方工具鏈編譯?
    發表于 08-12 08:13

    使用cygwin編譯riscv的工具鏈,切換工具鏈后報錯如何解決?

    我使用cygwin編譯riscv的工具鏈,然后將芯來IDE的工具鏈切換為我編譯出來的工具鏈但是卻報以下的問題。gcc認為沒有文件輸入,我在查詢了一些資料后認為是斜杠引起的,請問該如何
    發表于 08-12 07:51

    RISCV自定義指令編譯報錯怎么解決?

    各位老師好,本人在學習riscv指令時,在指令編譯過程中遇到如下問題,希望老師能夠不吝賜教,非常感謝!
    發表于 08-12 07:40

    將hbird-e-sdk項目下載到linux中,使用riscv-gcc工具鏈編譯報錯如何解決?

    /home/china/gnu-mcu-eclipse/riscv-none-gcc/7.2.0-4-20180606-1631/bin/../lib/gcc/riscv
    發表于 08-12 06:40

    AG32VF407環境搭建(FPGA+RISCV

    AG32VF407環境搭建(FPGA+RISCV
    的頭像 發表于 07-17 09:21 ?5384次閱讀
    AG32VF407環境搭建(FPGA+<b class='flag-5'>RISCV</b>)
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>