日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RISCV的模塊化的概念及編譯開(kāi)發(fā)riscv gcc相關(guān)

嵌入式小作坊 ? 來(lái)源:嵌入式IoT ? 作者: bigmagic ? 2021-08-10 10:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.概述由于RISCV的模塊化的指令集的定義,各家都有著自己的實(shí)現(xiàn)方式。從當(dāng)前看來(lái),除了標(biāo)準(zhǔn)的CSR外,很多都實(shí)現(xiàn)了自己的CSR指令擴(kuò)展。如何自定義CSR并且讓編譯器能夠識(shí)別,本文將進(jìn)行一定的分析,同時(shí)從riscv gcc開(kāi)發(fā)的角度出發(fā),來(lái)分析編譯器開(kāi)發(fā)的流程。

2.不改變編譯工具鏈實(shí)現(xiàn)CSR添加如果想讀寫CSR,可以使用匯編指令進(jìn)行操作。

void test_csr()

{

int a = 0x00200;

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

}

通過(guò)反匯編

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

得到該函數(shù)的匯編代碼

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

由于編號(hào)為0x307的CSR沒(méi)有標(biāo)準(zhǔn)定義,所以會(huì)直接會(huì)體現(xiàn)在匯編函數(shù)中。但是這樣并不會(huì)影響功能的使用。

對(duì)于這些非標(biāo)準(zhǔn)的CSR的讀寫操作,RISCV GCC并不會(huì)根據(jù)特定的編碼序號(hào)生成相應(yīng)的名稱。

比如芯來(lái)科技為其eclic定義的一條CSR。

如果用標(biāo)準(zhǔn)的GCC進(jìn)行編譯,那么需要給定CSR地址(0x7ed)。

這樣的實(shí)現(xiàn),在寫匯編函數(shù)的時(shí)候,給定CSR的地址即可,不能寫名字。比如:

csrw 0x7ed,zero

通過(guò)上述的方式,可以完成不改變編譯器的情況下,實(shí)現(xiàn)非標(biāo)準(zhǔn)的CSR的操作。

3.在編譯器中集成CSR名稱往往通過(guò)匯編去查看時(shí),若沒(méi)有CSR名稱,直接去查看CSR的地址,有時(shí)候還需要通過(guò)CSR的地址,查閱相關(guān)的寄存器手冊(cè),才能明白讀寫哪個(gè)寄存器。為了簡(jiǎn)化這種操作,可以將CSR的名稱添加到gcc中。這里借用玄鐵C906上的擴(kuò)展指令進(jìn)行實(shí)驗(yàn)。

如果不想改變gcc,那么實(shí)現(xiàn)上直接可以通過(guò)內(nèi)聯(lián)匯編。

void test_csr()

{

int a = 0x00200;

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

}

那么最后反匯編得到結(jié)果如下:

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

這顯然還是不夠直觀。

為了讓其更加的直觀,可以修改RISCV工具鏈。

這里使用的是riscv-gnu-toolchain,目前做編譯器開(kāi)發(fā)需要對(duì)該倉(cāng)庫(kù)的使用非常熟悉。

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

將代碼進(jìn)行clone后,更新子模塊。

git submodule init

git submodule update

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

同時(shí)將MXSTATUS的地址添加進(jìn)去。

這樣就能夠,編譯工具鏈,用生成的編譯工具鏈去編譯代碼,就能夠正常的看到反匯編的執(zhí)行效果了。

這樣,無(wú)論是傳遞地址csrw 0x7c0,zero,還是傳遞名稱csrw mxstatus,zero,匯編器都能夠正常的輸出CSR名稱。

通過(guò)對(duì)編譯器的修改,也是非常的簡(jiǎn)單的實(shí)現(xiàn)了這個(gè)功能。

4.編譯開(kāi)發(fā)riscv gcc相關(guān)如果要研究riscv gcc的開(kāi)發(fā)工作,搭建環(huán)境,加快編譯效率很關(guān)鍵。由于編譯工具鏈很大,涉及到的模塊很多,而且編譯的過(guò)程很復(fù)雜,為了節(jié)省編譯的時(shí)間,可以通過(guò)編譯選項(xiàng)來(lái)進(jìn)行約束。

通常情況下,編譯全功能的gcc,可以采用

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

當(dāng)使能了--enable-multilib,就能夠編譯很多版本的lib庫(kù)。

。/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

這樣實(shí)際上也是消耗了很多時(shí)間,為了解決這個(gè)問(wèn)題,可以指定特定的march和mabi進(jìn)行編譯和測(cè)試,待開(kāi)發(fā)完成后,發(fā)布時(shí)在進(jìn)行整體編譯。這樣開(kāi)發(fā)效率會(huì)高出很多。

make clean

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

make -j8

例如上面的命令,只編譯march為rv32gc,abi為ilp32d的gcc模型。省略掉很多庫(kù)的編譯,讓編譯的時(shí)間縮短了不少。

5.小結(jié)為自己的處理器添加特定的CSR支持,一種情況下可以使用CSR的地址進(jìn)行,另外一種就是修改匯編器,前一種方法比較直觀,適合使用riscv通用編譯器的開(kāi)發(fā)方式進(jìn)行開(kāi)發(fā),但是不夠直觀。后一種則需要修改匯編器,并且需要自己編譯工具鏈,比較復(fù)雜,但是使用起來(lái)直觀,簡(jiǎn)單。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • CSR
    CSR
    +關(guān)注

    關(guān)注

    3

    文章

    120

    瀏覽量

    70896
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4422

    瀏覽量

    67867
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1673

    瀏覽量

    51954

原文標(biāo)題:riscv gcc中添加自定義的csr支持

文章出處:【微信號(hào):gh_390c588e521e,微信公眾號(hào):嵌入式小作坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Visionfive的串口調(diào)試與編譯內(nèi)核

    --needed ncurses openssl bc flex bison make gcc riscv64-linux-gnu-gcc配置與編譯 make -j8 ARCH=riscv
    發(fā)表于 04-01 07:35

    尋找對(duì)RISCV眾核并行計(jì)算感興趣的伙伴、朋友

    。 2、智能并行編譯器 基于開(kāi)源的GCC改裝,研發(fā)智能并行編譯器,能將傳統(tǒng)的C/C++等變成“并行編程語(yǔ)言”。不改變語(yǔ)言語(yǔ)法,程序員通過(guò)鏈接腳本指定哪些函數(shù)是并行函數(shù)(線程函數(shù)),編譯
    發(fā)表于 03-28 14:41

    尋找對(duì)RISCV眾核并行計(jì)算感興趣的伙伴

    。 2、智能并行編譯器 基于開(kāi)源的GCC改裝,研發(fā)智能并行編譯器,能將傳統(tǒng)的C/C++等變成“并行編程語(yǔ)言”。不改變語(yǔ)言語(yǔ)法,程序員通過(guò)鏈接腳本指定哪些函數(shù)是并行函數(shù)(線程函數(shù)),編譯
    發(fā)表于 03-28 14:37

    【CIE全國(guó)RISC-V創(chuàng)新應(yīng)用大賽】+MUSE Pi Pro RiscV UEFI固件開(kāi)發(fā)

    apt-get install device-tree-compiler 編譯命令執(zhí)行后,將得到RiscV平臺(tái)相關(guān)的UEFI固件文件。 3. 關(guān)于EDK2及EDK2-Platforms的架構(gòu)說(shuō)明
    發(fā)表于 11-13 00:20

    怎么能讓riscv32-unknown-elf-gcc支持e203?

    https://github.com/ilg-archived/riscv-none-gcc 自己在這個(gè)地方下載的riscv32-unknown-elf-編譯器代碼 ./configure
    發(fā)表于 11-10 07:06

    riscv-gnu-toolchain工具鏈編譯報(bào)錯(cuò)怎么解決?

    使用./configure --prefix=/opt/riscv后,再使用sudo make,出現(xiàn)如下錯(cuò)誤提示: 想請(qǐng)問(wèn)下這個(gè)問(wèn)題應(yīng)該怎么解決呢?
    發(fā)表于 11-07 07:55

    芯來(lái)IDE開(kāi)發(fā)GD32VF103V-EVAL編譯出問(wèn)題的解決辦法

    ” Name中修改成“RISC-V Nuclei GCC (riscv-nuclei-elf-gcc)”;Prefix中修改成“riscv-nuclei-elf-”,然后Apply,Apply and Close。在此
    發(fā)表于 11-06 06:41

    全志D1開(kāi)發(fā)板(哪吒 RISCV64)開(kāi)箱評(píng)測(cè)

    riscv的生態(tài)建設(shè)遠(yuǎn)遠(yuǎn)沒(méi)有arm強(qiáng)大,但是也在開(kāi)源思想的引領(lǐng)下,開(kāi)始逐步走向大眾的視野。 這塊哪吒 RISCV64的板子,從主要的核的特性上來(lái)看,與目前市面上可見(jiàn)的riscv開(kāi)發(fā)板相
    發(fā)表于 10-31 07:50

    riscv實(shí)現(xiàn)自定義指令并用qemu運(yùn)行

    利用qemu模擬硬件平臺(tái),實(shí)現(xiàn)特定指令解析,同時(shí)寫裸機(jī)代碼來(lái)測(cè)試該指令的運(yùn)行情況。當(dāng)然,如果實(shí)現(xiàn)的很好,是需要修改riscvgcc的,讓自己的擴(kuò)展指令加入。這里不做修改,后面會(huì)詳細(xì)描述細(xì)節(jié)。 自定義
    發(fā)表于 10-31 07:37

    用哪吒D1開(kāi)發(fā)板體驗(yàn)riscv向量底層編程

    選項(xiàng)中開(kāi)啟即可。 從傳遞給riscvgcc的選項(xiàng)來(lái)看,帶有v擴(kuò)展即可。 -march是指定了riscv模塊化的指令集選項(xiàng),可以通過(guò)選項(xiàng)指定目標(biāo)RISC-V支持的
    發(fā)表于 10-29 06:21

    在Linux環(huán)境中使用riscv-torture的方法

    步驟: 1、安裝riscv-gnu-toolchain 要使用riscv-torture,您需要先安裝riscv-gnu-toolchain,該工具鏈提供了RISC-V架構(gòu)的GNU編譯
    發(fā)表于 10-24 06:32

    windows下編譯riscv openocd是什么原因?

    在https://github.com/riscv-mcu/riscv-openocd 下載源碼,基于windows的msys2中搭建環(huán)境編譯 執(zhí)行make后提示錯(cuò)誤,是什么原因?有用過(guò)的小伙伴
    發(fā)表于 10-20 07:29

    riscv virt64編譯后 ls無(wú)法運(yùn)行怎么解決?

    用倉(cāng)庫(kù)里的默認(rèn)配置編譯qemu-virt64-riscv 生成后運(yùn)行,顯示 [E/DBG] virtio-blk0 mount failed ls看不到文件夾 msh />ls No such directory
    發(fā)表于 09-22 06:38

    【Milk-V Duo S 開(kāi)發(fā)板免費(fèi)體驗(yàn)】RISC-V核心NCNN基準(zhǔn)測(cè)試

    ://github.com/Tencent/ncnn.git 然后配置編譯環(huán)境,配置好RISC-V的gcc和g++編譯器地址,最好在ncnn 的cmakefile文件中set好。 set
    發(fā)表于 08-24 23:46

    【Milk-V Duo S 開(kāi)發(fā)板免費(fèi)體驗(yàn)】C應(yīng)用程序開(kāi)發(fā)

    S\r\n"); return 0; }Ctrl+x 輸入y回車,保存編譯riscv64-linux-gnu-gcc test.c -static -o test 導(dǎo)入到開(kāi)發(fā)
    發(fā)表于 06-28 23:52
    故城县| 阿尔山市| 黑河市| 黑水县| 德江县| 宜黄县| 祥云县| 双桥区| 肥城市| 湘潭市| 泰州市| 罗田县| 乌海市| 张家界市| 建瓯市| 凤山市| 门头沟区| 陇南市| 渭南市| 扶余县| 开阳县| 寿光市| 磴口县| 井研县| 呼图壁县| 鄂尔多斯市| 灵石县| 通江县| 河北区| 全南县| 临夏县| 大邑县| 商水县| 深圳市| 阜新市| 莫力| 宜兴市| 大荔县| 诏安县| 衢州市| 府谷县|