天天看点

OpenRisc-67-OR的汇编引言1,基本思想2,实验步骤3,小结

之前我们写过or的裸机程序,写过基于or的linux设备驱动程序,也反汇编过or的机器码。

本小节,我们将通过一个简单的实验,对or的汇编(指令集)做一个简单的梳理和测试。

要想了解or的指令集,其实只要查查openrisc architecture manual就可以了,但是不是最好的熟悉方式,也没有必要将其所有指令集记下来。我认为,通过一个实际的工程或者例子,从中了解or的指令集是比较好的一种方式。

那么,通过什么例子呢?

一般risc的指令集包括,运算指令,分支指令,和访存指令,三类。所以我们这个实验最好能用到这三类指令,碰巧,我最近在测试ddr控制器,所以我们下面将通过一个读写内存的例子来熟悉or的指令集。

在开始编码之前,我们首先需要考虑如下几个问题:

a,如何对汇编源程序(.s文件)进行编译,生成机器码。

b,如何加载机器码使or的指令总线能读到。

c,如何查看机器码的执行过程和结果。

根据前面,我们积累下来的经验,可知,利用bootrom进行rtl仿真,可以很好的解决上面三个问题。并且都是自动化的。

在了解并解决了上面几个问题之后,剩下的就是具体的操作了。

a,修改soc-design/orpsocv2/sw/bootrom目录下的board.h

b,修改soc-design/orpsocv2/sw/bootrom目录下的bootrom.s

这个文件,是需要我们自己手动编写or的汇编了。

需要注意的有几点。

首先,如何让仿真自动退出:使用“l.nop 1”这条指令,具体原因可参考or1200_monitor.v文件中的相关内容。

其次,如何判断读写内存的成功与失败,分别使用“l.nop 4”和“l.nop 3”。

最后,这些汇编,都很容易理解,唯一需要注意的是or支持延迟槽。

下面是具体代码清单:

c,创建c语言裸机测试目录和程序

由于我们想利用orpsoc现成的测试环境,所以我们还需要编写一个假的,只是为了满足原有的测试环境的目录和文件。

在soc-design/orpsocv2/board/xilinx/ml501/sw/tests目录下创建目录和文件:

编辑mem.c:

由于我们只运行bootrom.s中的指令,所以mem.c里面写什么语句不重要。

d,测试与验证

完成编码之后,我们就可以运行我们刚才写的汇编程序了,方法我们之前已经介绍过多次了,这里重复如下:

在 soc-design/orpsocv2/board/xilinx/ml501/sim/run目录下执行如下:

很快,我们就可以仿真结束,然后,我们就可以查看仿真日志文件和仿真波形。

从中可以看出,对内存的读写都是正确的。

or1200_monitor输出的日志文件:mem-general.log

OpenRisc-67-OR的汇编引言1,基本思想2,实验步骤3,小结

vcd波形文件:

OpenRisc-67-OR的汇编引言1,基本思想2,实验步骤3,小结

对于cpu来说,对所有外设(uart,i2c,vga......)的控制都可以通过load/store来完成,和读写内存的实质是完全相同的,所以,通过上面的汇编,我们只要改变一下读写地址修改成对应外设的地址,我们就可以实现对该设备的控制了。

当然,编写出优秀的汇编程序也不是一件太容易的事情,这就需要详细阅读or的架构手册,掌握gpr和spr的使用方法。甚至,我们还要查看or32-elf-asm来了解更准确的or的指令集。

继续阅读