声明:本文为原创作品,版权归本博文作者所有,如需转载,请注明出处http://www.cnblogs.com/kingst/
这一节,我将给大家讲解NIOS II软件开发部分,这一部分是以第一节硬件开发部分为基础的,如果大家是从这一节开始看的,那我们就先回顾一下上一节我们所讲的内容。
回顾
上一节,我们详细讲解了NIOS II硬件开发部分的全过程,其中包括了工程的建立,NIOS II软核的构建,以及锁相环PLL倍频和如何下载等等。其中NIOS II软核的构建是重点内容,我们在软核中构建了CPU,SDRAM,AVALON三态桥,FLASH,SYSTEM ID,JTAG UART 6个模块,时钟我们设计为100MHz,FLASH为8位模式。这一节我们就在其基础上详细讲解软件开发的全过程。
摘要
首先,我先给大家简单介绍一下这一节的重要内容,这一节将详细讲述NIOS II的软件开发的整个流程,并简单介绍NIOS II 9.0 IDE的一些简单的使用方法,会让那些从来没有用过NIOS II IDE软件的人可以很轻松的上手使用。
NIOS II IDE简介
NIOS II IDE是一个基于Eclipse IDE构架的集成开发环境,它包括了很多的功能,学过JAVA的人对其应该非常的熟悉,它的功能是非常之强大,下面我们就简单介绍一下NIOS II IDE的功能和特点:
- GNU开发工具。熟悉Linux操作系统的人对它一定不陌生,它是一种开源的编译环境,包括标准的GCC编译器,连接器,汇编器以及makefile工具等。说到这大家可能头都大了,这些都是啥东西啊,如果你是一个Linux的忠实粉丝,这些你必须非常的清楚,但在NIOS II开发过程中你只要知道这些就OK了,没必要刨根问底的弄清楚它们,不过我在这里强烈推荐大家学习学习linux方面的东西,你一旦接触上了它,你就会发现它的魅力是太大了,里面的好东西让你一辈子都受益,呵呵,话说多了,我们继续我们的NIOS II。
- 基于GDB的调试工具,包括仿真和硬件调试。这个东西也是在Linux平台下流行的调试工具,所以说Linux很强大吧。 集成了一个硬件抽象层HAL(Hardware Abstraction Layer);
- 支持MicroChip/OS II 和 LwTCP/IP协议栈。
- 支持Flash下载(Flash Programmer 和 Quartus II Programmer)。
理论的就说这么多了,下面我们来点实际的。
建立软件工程
首先,将NIOS II 9.0 IDE软件打开,打开后NIOS II IDE的界面赫然显现在我们面前,界面很简单,跟其他的IDE没什么太大的区别,我们需要做的就是首先建立一个软件工程,操作方式如下图所示,File->New->Project
点击后,会出现工程向导界面,如下图所示,选中红圈处的内容,Nios II C/C++ Application,
点击Next,会出现下图所示内容,红圈1处是工程名,我将其修改为hello_world,红圈2处是目标硬件文件,点击Browse,找到我们上一节生成的NIOS软核的位置,这个文件是以.ptf为后缀的,如果大家跟我的地址一样的话,地址应该是在E:\nios\KERNEL.ptf。在红圈3处选中Hello World,这个地方是工程模版。再说说红圈4,这个地方是改变工程所放位置的,如果不修改,软件工程的位置就在Quartus工程目录下的software下面。
点击Next,这里不用修改,点击Finish,完成工程向导。
完成了上面的工程向导后,我们正式进入NIOS II IDE的界面了,如下图所示,我主要介绍三个部分,其他部分用处不大。我按功能将这三部分命名为代码区,工程目录区,和观察区(这几个名字很山寨吧,哥追求的就是通俗易懂,呵呵)
不用我多说,代码区就是显示代码的,工程目录区呢,显示所有与工程有关系的文件,跟我们有关系有.c和.h文件,还有一个非常非常之重要的system.h文件。观察区中有两个栏我们是会经常用到的,一个是Console,一个是Problems。第一个是编译信息显示区,一个是错误警告显示区。有了JTAG UART后,第一个Console(控制台)栏多了一个用途,就是作为标准输出(stdout)的终端,这里不多了,一会我们就会用到。
我们接下来的工作就是需要对工程配置一下,大家跟我来吧。在工程目录区中的hello_world项单击鼠标右键后,点击红圈处的位置system library Properties
点击后,可看到下图所示界面,
按顺序来,红圈1处是标准输入(stdin)、标准输出(stdout)、标准错误(stderr)的设置区,我们在软核中构建了JTAG UART,在此出现效果了吧,如果我们没有构建JTAG UART,那么,这个地方就不会出现jtag_uart选项了。在所红圈2处,这个地方也不需要修改,不过有一个地方需要注意,就是Support C++,这个库相对Small C library要大,如果大家手中的板子没有FLASH,SDRAM这样大容量存储设备的话,选择Small C library,用FPGA内部的SRAM,也可以跑些小程序。再说红圈3处,这个是一些有关内存的选项,我们构建了SDRAM模块,这个地方也用到了,默认就可以,不用修改。该说红圈4了,点击红圈4后,出现下面界面,这个是对编译器就行配置的界面,大家可以自己观察一下,大部分都不需要修改,我们来看一下比较重要的地方,点击红圈处。
点击后,我们看看是什么样子,这里有两个关键点,一个是红圈1处,这个地方时配置编译器的优化级别,红圈2的地方是调试级别。编译器的优化级别会让你的生成的代码更小,当要求也很高,你的代码如果不严谨,有可能优化以后不好用了,大家要注意。调试级别是你在编译过程中显示编译内容多少,级别越高显示内容的越多,建议将调试级别调到最高。
将上面设置好以后,点击Apply,然后点击OK,回到主页面。
接下来我们就要开始编译了,第一次的编译时间比较长,因为编译过程中会生成一个我们之前所说的一个非常非常重要的文件system.h,这个文件是根据我们构建的NIOS II软核产生的,也就是说,system.h的内容与软核的模块一一对应。一旦软核发生变化,就需要重新编译,重新产生system.h文件。现在就开始编译,如下图所示,在工程目录栏中单击右键后,点击红圈处Build Project,或者直接按快捷键Ctrl + b。
开始编译后,会出现下面的界面,进度条走的很慢吧,如果不想看它,点击Run in Background,编译就在后台进行了。在编译构成中,大家可以观察观察栏中Console栏的内容,其中出现的内容就是编译器正在编译的东西,大家不妨好好看看编译过程都编译和生成了哪些东西。
编译好以后,大家可以看到下面界面,红圈处说明了,编译完成。
大家可以对比一下,编译前和编译后工程目录栏有哪些变化。
看来编译的成果还是很显著的,其他的我们没必要知道,关键的一个大家要知道,就是我们反复提到的system.h文件。下面我们就把它揪出来,它隐藏的还是很深的。
看到了吧,它在hello_world_syslib/Debug/system_description/system.h,现在我们就看看里面有什么东西这么重要。
双击以后,在代码区大家就可以看到了,都是一些宏定义,我们找一个典型的作为例子,我给大家讲解一下,看下面的截图
在这些信息中,对我们有用的是JTAG_UART_BASE,还有JTAG_UART_IRQ,JTAG_UART_BASE是JTAG_UART的基地址,JTAG_UART_IRQ是中断号,其他的是一些配置信息,我们先不关注。同理,SDRAM、FLASH等都有相应的基地址,我们以后就要用到这些地址对NIOS软核进行寄存器操作,达到我们要实现的跟单片机一样的寄存器操作方式,在此我们就不详细讲述了,后面我们会单独讲解这一节。看了这个例子以后,大家在看看其他的,都大同小异,没有中断的就不会出现*_IRQ这一项,不信大家自己看。NIOS强大之处就在于此,根据大家的需求进行对软核的构建,然后产生相应的寄存器,整个构建都由设计者来掌控,缺什么建什么,不行的话还可以自己写底层的模块,你说强不强大。
system.h文件我们以后还会提到,暂时先讲到这,接下来我们要看看我们编译好的程序是不是跟我们想想的一样。对于NIOS IDE提供了几种方法来验证,一种是直接硬件在线仿真,一种是软件仿真。我们先说第一种硬件在线仿真,很显然这种方式需要硬件配合,一块开发板,一个仿真器(仿真器就是大家用的USB-BLASTER或者BYTE-BLASTER)。将仿真器与开发板的JTAG口相连(假设你的仿真器驱动已经装好了,如果有不知道怎么装仿真器驱动的请跟我联系)。安装好以后,我们进行下面的操作,点击红圈处Nios II Hardware。
点击后,可以看观察栏的控制台(Console),如果一切正常,我们将看到下面的结果出现。
看到了么?如果没看到,再好好检查一下,你的操作是否跟我说的一样,如果自己无法解决,请联系我,我将手把手帮你解决。
说完第一种硬件在线仿真以后,我们再说说软件仿真。软件仿真不需要硬件,电脑单独运行即可,按下图所示操作,点击红圈处,Nios II Insruction Set Simulator。
点击后,还是看观察栏的控制台(Console),结果一样吧。我不建议大家用软件仿真,因为软件仿真在不涉及到硬件的情况下还好,如果有相关硬件操作了,效果就没有了。
到此为止,我们的NIOS II软件开发部分就结束了,如果想熟练掌握NIOS II IDE,还要大家自己亲手去试试,光靠我的讲解是不行的,大家没事的时候可以研究一下它的每一个选项,都有什么功能,这样才能加深你对它的熟悉程度,更好的去掌握它,用好它。在此再多说一句,我不建议大家经常更新软件,对于Quartus和NIOS软件的升级,无非就是解决一些BUG,多支持一些器件,编译的速度快了一点。在你还没有遇到非常严重的BUG之前,最好不要去更新它。更新以后带来的后果就是需要重新熟悉它的特性。NIOS II IDE 9.1和9.0之间变化就很大,使用起来就不是那么顺手。建议大家不要轻易去更改。
好了,这一节的内容就到此结束吧,下一节我将给大家讲解“如何让NIOS II的开发像单片机一样简单,看透NIOS II系统的寄存器操作方式”。这一节内容是我教程中的核心部分,希望大家耐心等待,拜拜了!