引言
在经过上一篇“快速开始”(http://blog.csdn.net/rill_zhen/article/details/18714643)时,我们已经确认O_board可以运行linux,那么怎么运行裸机程序呢?
本小节,我们将通过在O_board上运行一个简单的裸机程序(从串口打印‘hello Oboard!’),来进一步加深对O_board的了解和掌握。
1,基本思想
“麻雀虽小五脏俱全”,虽然是一个最简单的程序,却涉及到了包括orpsoc的RTL工程的综合,jtag下载,or32-elf-gdb的调试等很多方面。其大体思想如下:
首先,我们需要用quartusII对orpsoc的RTL工程进行综合,得到svf文件。
其次,使用Urjtag将scf文件load到O_board的FPGA芯片内部。
第三,运行or_debug_proxy程序,建立RSP server。
第四,运行or32-elf-gdb在与RSP server建立连接之后,下载裸机程序。
第五,打开picocom,查看串口输出。
2,针对O_board的orpsoc的RTL综合
O_board目前使用的quartusII的工程,我已准备好,可直接下载使用,请参考:
http://download.csdn.net/detail/rill_zhen/6897475
3,编写并编译裸机程序
1>编写C语言代码
hello_Oboard.c:
#include <stdio.h> int main() { printf("hello Oboard!\n"); return 0; }
2>编译生成hello_Oboard
or32-elf-gcc -mboard=ordb2a hello_Oboard.c -o hello_Oboard
4,配置orpsoc_top.svf到O_board
这一步大家都很熟悉了,就是将orpsoc_top.svf文件复制到~/fpga_dev_board/ordb2a-ep4ce22/目录下之后,用Urjtag将svf文件load到FPGA内部。当然,首先要用USB线将O_board左上角的那个USB口与PC的USB2.0口相连。
jtag ./program_fpga.jtag如下图所示:
5,检测jtag并建立RSP server
在将orpsoc_top.svf文件配置到O_board之后,FPGA芯片现在就是ORPSoC了,我们这时就可以用or_debug_proxy检测板子上的jtag了,如果jtag没问题的话,就需要建立用来和gdb通信的RSP server了,这些工作可以通过下面的命令实现:
其中‘55555’是RSP server的端口号。
/opt/or_debug_proxy/bin/or_debug_proxy -r 55555
6,软件的下载
在建立完RSP server之后,我们就可以用or32-elf-gdb 来讲我们前面编译的程序下载到O_board的内存里并运行它了。
or32-elf-gdb target remote:55555 file ~/O_board/hello_Oboard load spr npc 0x100
7,打开串口工具
在将软件load到内存之后,在运行程序之前,我们需要先运行串口工具,可用的串口工具有很多(minicom,picocom,hyperterminal),这里使用picocom。
picocom --b 115200 --p n --d 8 --f xon /dev/ttyUSB2
打开串口之后,这是在or32-elf-gdb窗口执行‘c’命令运行程序,我们就可以看到O_board从串口打印的“hello Oboard!”,如下图所示:
8,小结
本小节,我们在O_board上运行了一个最简单的裸机程序,其实,本小节我们编写的裸机程序(hello_Oboard.c)并不是整个工程的全部,这里面我们调用了C语言的库函数‘printf’,所以还有很多C库的问题已经被编译器处理了,此外还有串口控制器的初始化工作也隐藏起来了。
不依靠任何库函数的裸机程序,我们之前曾经介绍过了,这里不再赘述,如有疑问,请参考:
http://download.csdn.net/detail/rill_zhen/6647119
里面有完整的展示例子。
Enjoy!