如何建⽴⾃⼰的RISC-V编译环境--C_Code?
如何建⽴⾃⼰的RISC-V编译环境–C_Code?
简单又含深意的网名1.RISC-V编译环境框架
这是我RISC-V编译环境的架构:
build case common toolchain
⼀级⽬录⼆级⽬录说明
build-xx.hex、xx.bin、xx.dump & xx.elf⽣成的⽬录。
-Makefile编译脚本。
-test⽣成⽂件,根据test.c⽣成的xx.hex、xx.bin、xx.dump & xx.elf project-各个⽬录的源代码。
-test放test项⽬的全部H⽂件&C⽂件。
common-各个项⽬公⽤的⽂件。
-
encoding.h/riscv-tests/env⽬录中的H⽂件。
-program.ld类似/riscv-tests/benchmarks/common/test.ld的⽂件,⽤于链接物理地址、汇编和C语⾔代码。
-program.S最底层的汇编。
toolchain-⼯具链。我在/riscv-tools/riscv-gnu-toolchain/的⼯具链上提取了对我有⽤的部分。2.各⽬录内容介绍
2.1 toolchain:⼯具链⽬录我不打算介绍,如果有不明⽩的,可以看我的这个博客:
rocket-chip⼯具链的编译与使⽤(blog.csdn/a_weiming/article/details/84801051)
2.2 project:这个⽬录就是放你的项⽬代码的。每个项⽬建⽴⼀个⽬录。在这个例⼦中,我放的是test⽬录,test的源代码如下(修改于/riscv-tests/benchmarks/vvadd):
#define U32 *(volatile unsigned int *)
#define DATA_SIZE 100
int input1_data[DATA_SIZE] =
{
41, 833, 564, 187, 749, 350, 132, 949, 584, 805, 621, 6, 931, 890, 392, 694, 961, 110, 116, 296,
426, 314, 659, 774, 319, 678, 875, 376, 474, 938, 539, 569, 203, 280, 759, 606, 511, 657, 195, 81,
267, 229, 337, 944, 902, 241, 913, 826, 933, 985, 195, 960, 566, 350, 649, 657, 181, 111, 859, 65,
288, 349, 141, 905, 886, 264, 576, 979, 761, 241, 478, 499, 403, 222, 444, 721, 676, 317, 224, 937,
288, 119, 615, 606, 389, 351, 455, 278, 367, 358, 584, 62, 985, 403, 346, 517, 559, 908, 775, 255
};
int input2_data[DATA_SIZE] =
{
454, 335, 1, 989, 365, 572, 64, 153, 216, 140, 210, 572, 339, 593, 898, 228, 12, 883, 750, 646,
哥斯达黎加足球队实力
500, 436, 701, 812, 981, 150, 696, 564, 272, 258, 647, 509, 88, 703, 669, 375, 551, 936, 592, 569,
952, 800, 584, 643, 368, 489, 328, 313, 592, 388, 543, 649, 979, 997, 814, 79, 208, 998, 629, 847,
704, 997, 253, 715, 430, 415, 538, 700, 4, 494, 100, 864, 693, 416, 296, 285, 620, 78, 351, 540,
646, 169, 527, 289, 796, 801, 720, 758, 745, 92, 989, 271, 853, 788, 531, 222, 461, 241, 358, 332
};
//--------------------------------------------------------------------------
// handle_trap function
void handle_trap()
{
while(1);
}
/
/--------------------------------------------------------------------------
// test function
void test( int n, int a[], int b[])
{
int i;
for ( i = 0; i < n; i++ )
U32(0x20800000+4*i) = a[i] + b[i];
}
//--------------------------------------------------------------------------
// Main
void main()
{
test( DATA_SIZE, input1_data, input2_data);
}
2.3 common:这个⽬录⽐较重要,⽽且改动的地⽅⽐较多。
2.3.1 encoding.h:这个⽬录不解释,就是RISC-V各重要CSR寄存器的定义。
2.3.2 program.ld:这个⽂件是修改于/riscv-tests/benchmarks/common/test.ld。
修改点:
1)修改了代码的启始地址。
/* text: test code section */
win7投屏. = 0x80000000;
2)去除了这个⼀⼤段的空⽩空间。
/
*. = ALIGN(0x1000);*/
2.3.3 program.S:这个⽂件改动⽐较⼤(修改于/riscv-tests/benchmarks/common/crt.S),这个⽂件改动需要注意以下⼏点:
1)扩展名必须为⼤写的S,⼤写的S可以使gcc⾃动识别汇编程序中的C预处理命令,像#include、#define、#ifdef、 #endif等,也就是说,使⽤gcc进⾏编译,你可以在汇编程序中使⽤C的预处理命令。
2)因为我⽣成的rocket-chip是不使⽤浮点的,不使⽤虚拟内存,不使⽤ROCC的,所以很多内容我直接删改了,⽽且栈和异常⼊⼝都是根据我⽣成的rocket-chip来设定的,⼤家可以根据⾃⼰的情况进⾏修改。
代码:
#include "encoding.h"
#define LREG lw
#define SREG sw
#define REGBYTES 4
施的拼音.section ".text.init"
.globl _start
_start:
>我是注释,下⾯的操作是清除32个通⽤寄存器。
li x1, 0
li x2, 0
上海第二工业大学专科li x3, 0
li x4, 0
li x5, 0
li x6, 0
li x7, 0
li x8, 0
li x9, 0
li x10,0
li x11,0
li x12,0
li x13,0
li x14,0
li x15,0
li x16,0
li x17,0
li x18,0
li x19,0
li x20,0
li x21,0
li x22,0
li x23,0
li x24,0
li x25,0
li x26,0
li x27,0
li x28,0
li x29,0
li x30,0
li x31,0
>我是注释,下⾯的操作是配置异常⼊⼝,异常⼊⼝为trap_entry这个标志。
# initialize trap vector
la t0, trap_entry
csrw mtvec, t0
# initialize global pointer
.option push
.option norelax
la gp, __global_pointer$
.
option pop
>我是注释,下⾯的操作是配置栈的地址。
li sp, 0x80F00000
>我是注释,下⾯的操作跳到我test项⽬中的main函数中。
j main
>我是注释,下⾯的是trap_entry这个函数的内容,申请栈空间,压栈,保存
>mcasue&mepc,跳到handle_trap函数中(上⾯的test.c有这个函数),处理完后 >还原MSTATUS_MPP的模式,出栈,跳出trap_entry函数。
.align 2
trap_entry:
addi sp, sp, -272
SREG x1, 1*REGBYTES(sp)
SREG x2, 2*REGBYTES(sp)
郑州周边好玩的地方适合一日游SREG x3, 3*REGBYTES(sp)
SREG x4, 4*REGBYTES(sp)
SREG x5, 5*REGBYTES(sp)
SREG x6, 6*REGBYTES(sp)
SREG x7, 7*REGBYTES(sp)
SREG x8, 8*REGBYTES(sp)
SREG x9, 9*REGBYTES(sp)
SREG x10, 10*REGBYTES(sp)
SREG x11, 11*REGBYTES(sp)
SREG x12, 12*REGBYTES(sp)
SREG x13, 13*REGBYTES(sp)
SREG x14, 14*REGBYTES(sp)
SREG x15, 15*REGBYTES(sp)
SREG x16, 16*REGBYTES(sp)
SREG x17, 17*REGBYTES(sp)
SREG x18, 18*REGBYTES(sp)
SREG x19, 19*REGBYTES(sp)
SREG x20, 20*REGBYTES(sp)
SREG x21, 21*REGBYTES(sp)
SREG x22, 22*REGBYTES(sp)
SREG x23, 23*REGBYTES(sp)
SREG x24, 24*REGBYTES(sp)
SREG x25, 25*REGBYTES(sp)
SREG x26, 26*REGBYTES(sp)
SREG x27, 27*REGBYTES(sp)
SREG x28, 28*REGBYTES(sp)
SREG x29, 29*REGBYTES(sp)
SREG x30, 30*REGBYTES(sp)
SREG x31, 31*REGBYTES(sp)
csrr a0, mcause
csrr a1, mepc
SREG a1, 32*REGBYTES(sp)
mv a2, sp
jal handle_trap
LREG a1, 32*REGBYTES(sp)
csrw mepc, a1
# Remain in M-mode after eret
li t0, MSTATUS_MPP
csrs mstatus, t0
LREG x1, 1*REGBYTES(sp)
LREG x2, 2*REGBYTES(sp)
LREG x3, 3*REGBYTES(sp)
LREG x4, 4*REGBYTES(sp)
LREG x5, 5*REGBYTES(sp)
LREG x6, 6*REGBYTES(sp)
LREG x7, 7*REGBYTES(sp)
LREG x8, 8*REGBYTES(sp)
LREG x9, 9*REGBYTES(sp)
LREG x10, 10*REGBYTES(sp)
LREG x11, 11*REGBYTES(sp)
LREG x12, 12*REGBYTES(sp)
LREG x13, 13*REGBYTES(sp)
LREG x14, 14*REGBYTES(sp)
LREG x14, 14*REGBYTES(sp)
LREG x15, 15*REGBYTES(sp)
LREG x16, 16*REGBYTES(sp)
LREG x17, 17*REGBYTES(sp)
LREG x18, 18*REGBYTES(sp)
LREG x19, 19*REGBYTES(sp)
LREG x20, 20*REGBYTES(sp)
LREG x21, 21*REGBYTES(sp)
LREG x22, 22*REGBYTES(sp)
LREG x23, 23*REGBYTES(sp)
LREG x24, 24*REGBYTES(sp)
LREG x25, 25*REGBYTES(sp)
LREG x26, 26*REGBYTES(sp)
LREG x27, 27*REGBYTES(sp)
LREG x28, 28*REGBYTES(sp)
LREG x29, 29*REGBYTES(sp)
LREG x30, 30*REGBYTES(sp)
LREG x31, 31*REGBYTES(sp)
addi sp, sp, 272
mret
.section ".tdata.begin"
.globl _tdata_begin
_tdata_begin:
.
section ".d"
.globl _tdata_end
_tdata_end:
.section ".d"
.globl _tbss_end
_tbss_end:
2.4 bulid:这个⽬录最主要的是Makefile脚本,⽤于调⽤⼯具链编译project。我只贴部分代码,是⽣成elf的代码,⽣成bin、hex和dump 的⽅法⼤家参考/riscv-tests/benchmarks/Makefile。
部分代码:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
教师如何利用网络提高自身的教育能力
« 上一篇
2021年名师工作室个人工作总结(精选10篇)
下一篇 »
热门文章
-
史记素材作文(实用)
2025-02-17 -
汉代文学和经学的关系
2025-02-17 -
汉代散文知识点总结
2025-02-17 -
中国历史的六条脉络
2025-02-17 -
简述汉代丝绸之路开辟的历史意义
2025-02-17 -
汉代城址与墓区的择地规律
2025-02-17 -
少年读史记 汉帝国风云录概括300字
2025-02-17 -
汉代文学在中国文学史中的地位与影响
2025-02-17 -
汉试制度与科举制度的关系
2025-02-17 -
汉代生产方式
2025-02-17 -
汉代的思想大一知识点
2025-02-17 -
汉代的科技成就与文化启示
2025-02-17 -
马王堆汉墓的文化内涵与社会背景从文物解读历史
2025-02-17 -
汉代社会的缩影
2025-02-17 -
汉代经由古丝路上的文化交流与影响
2025-02-17 -
汉书的内容
2025-02-17 -
2022国开中国近代史纲要大作业
2025-02-17 -
汉代经学知识点总结图解
2025-02-17 -
秦汉时期的历史观与历史记载方式
2025-02-17 -
汉代的文化成就
2025-02-17
最新文章
-
中药泡脚的历史典故
2025-02-18 -
关于司马迁的历史评价
2025-02-18 -
“亲亲相隐”现象及容隐制度在中国历史中的演进
2025-02-18 -
人教版 七年级中国历史新增文物
2025-02-18 -
国子监历史及简介
2025-02-18 -
列举汉代碑刻隶书10种
2025-02-18
发表评论