使用gnu 编译picoRV32 c/asm 代码

本文介绍了如何在Eclipse环境下为RISC-V CPU picoRV32创建C项目,并重点讲解了ASM部分,包括start.s启动代码、trap处理、自定义指令的使用。此外,还探讨了bin文件的链接与ld脚本的重要性,以及picoRV32为何需要自定义ISA,特别是在处理中断和trap时的角色。文中还提及了在FreeRTOS上的应用和未来可能遇到的问题。
摘要由CSDN通过智能技术生成

小提示:

1,大家本身了解eclipse使用,也已经安装了gnu+eclipse环境,参考: http://blog.csdn.net/kuankuan02/article/details/79233442

2,同时下载了 picoRV32的 open source code:

https://github.com/cliffordwolf/picorv32

3,你要有硬件环境可以跑bin,我是有数字工程师提供了FPGA平台。

正文:

1,eclipse新建一个工程,选择RISC-V c project创建。

2,然后加入你所下载的picoRV32_master/fireware里的c code,我下面简单介绍下ASM部分

start.s是启动代码以及trap处理代码,reset_vec 是开始,摆在0地址;后面.balign 16 对齐,因为picoRV32 trap地址在0x10,所以后面是trap处理代码。记住picoRV32 ASM 不要使用CSRs读写指令,CPU不认的。它的trap上下文切换所要用的stack是irq_regs定义的数据块,因为我的bin都是下载到flash中,所以给它加个.bss section属性,把它移到ram去。正好再提一下,系统stack是在ld脚本里申请的section,这个code是把系统stack和trap stack分开了,很多情况下都是用的同一个。它的技巧是自定义指令getq和setq来交换自定义寄存器q0~q3,每次trap都重新获取trap stack 指针,这是个很笨的上下文保存方法,大家只拿来先跑起来bin就好。启动代码还要注意的是.bss 必须清0,以及.data 必须搬入ram中,sp 赋值以后就可以开始进入c code了,输出个hello world。我的系统是uart输出,所以uart初始化也加到start.s中。

irq_regs:
	// registers are saved to this memory region during interrupt handling
	// the program counter is saved as register 0
	.fill 32,4

	// stack for the interrupt handler
	.fill 256,4
irq_stack:
3, picoRV32额外实现了一些指令,getqsetqretirq等等,具体内容可以到
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值