第二章软件设计流程和方法LOGONiosIIEDS(EmbeddedDesignSuite——嵌入式开发包)提供了一个统一的开发平台,适用于所有NiosII处理器系统。仅仅通过一台PC机、一片Altera的FPGA以及一根JTAG下载电缆,软件开发人员就能够往NiosII处理器系统写入程序以及和NiosII处理器系统进行通讯。NiosII处理器的JTAG调试模块提供了使用JTAG下载线和NiosII处理器通信唯一的、统一的方法。无论是单处理器系统中的处理器,还是复杂多处理器系统中的处理器,对其的访问都是相同的。用户不必去自己建立访问嵌入式处理器的接口。LOGONiosIIEDS提供了两种不同的设计流程,包括很多生成NiosII程序的软件工具,包括需要版权的和开源软件工具如,GNUC/C++工具集。NiosIIEDS为基于NiosII的系统自动生成板支持包(boardsupportpackage——BSP)。Altera的BSP包括Altera硬件抽象层(hardwareabstractionlayer——HAL),可选的RTOS,设备驱动。BSP提供了C/C++运行环境,使用户避免直接和硬件打交道。NiosIIEDS的第一种开发流程是用户在集成开发环境NiosIIIDE中完成所有的工作,第二种开发流程是在命令行和脚本环境中使用NiosII软件生成工具,然后将工程导入到IDE中进行调试。本书介绍使用NiosIIIDE进行软件设计的流程,NiosIIIDE基于开放式的、可扩展EclipseIDEproject工程以及EclipseC/C++开发工具(CDT)工程。LOGO2.1NiosIIIDE简介NiosII集成开发环境(IDE)是NiosII系列嵌入式处理器的基本软件开发工具。所有软件开发任务都可以NiosIIIDE下完成,包括编辑、编译和调试程序。NiosIIIDE为软件开发提供四个主要的功能:工程管理器编辑器和编译器调试器闪存编程器LOGO2.1.1工程管理器TheNiosIIIDE提供多个工程管理任务,加快嵌入式应用程序的开发进度。新工程向导——NiosIIIDE推出了一个新工程向导,用于自动建立C/C++应用程序工程和系统库工程。采用新工程向导,能够轻松地在NiosIIIDE中创建新工程,如下图所示。LOGONiosIIIDE新工程向导LOGO软件工程模板——除了工程创建向导,NiosIIIDE还以工程模板的形式提供了软件代码实例,帮助软件工程师尽可能快速地推出可运行的系统。每个模板包括一系列软件文件和工程设置。通过覆盖工程目录下的代码或者导入工程文件的方式,开发人员能够将他们自己的源代码添加到工程中。在上图中的下半部分分别是可选用的模板和模板的介绍。LOGO软件组件——NiosIIIDE使开发人员通过使用软件组件能够快速地定制系统。软件组件(或者称为“系统软件”)为开发人员提供了一个简单的方式来轻松地为特定目标硬件配置他们的系统。在上图中点击Next,会出现下图所示的系统库的创建/选择窗口,新建工程用到的组件会包含在系统库中。组件包括:NiosII运行库(或者称为硬件抽象层(HAL))轻量级IPTCP/IP库MicroC/OS-II实时操作系统(RTOS)Altera压缩文件系统LOGO系统库工程LOGO2.1.2编辑器和编译器Altera'sNiosIIIDE提供了一个全功能的源代码编辑器和C/C++编译器。包括下面的几部分:文本编辑器——NiosIIIDE文本编辑器是一个成熟的全功能源文件编辑器。这些功能包括:语法高亮显示C/C++,代码辅助/代码协助完成,全面的搜索工具,文件管理,广泛的在线帮助主题和教程,引入辅助,快速定位,自动纠错,内置调试功能。LOGOLOGOC/C++编译器——NiosIIIDE为GCC编译器提供了一个图形化用户界面,NiosIIIDE编译环境使设计Altera的NiosII处理器软件更容易,它提供了一个易用的按钮式流程,同时允许开发人员手工设置高级编译选项。NiosIIIDE编译环境自动地生成一个基于用户特定系统配置(SOPCBuilder生成的PTF文件)的makefile。NiosIIIDE中编译/链接设置的任何改变都会自动映射到这个自动生成的makefile中。这些设置可包括生成存储器初始化文件(MIF)的选项、闪存内容、仿真器初始化文件(DAT/HEX)以及profile总结文件的相关选项。LOGO2.1.3调试器NiosIIIDE包含一个强大的、基于GNU调试器的软件调试器-GDB。该调试器提供了许多基本调试功能,以及一些在低成本处理器开发套件中不会经常用到的高级调试功能。基本调试功能——NiosIIIDE调试器包含如下的基本调试功能:运行控制调用堆栈查看软件断点反汇编代码查看调试信息查看指令集仿真器LOGO高级调试——除了上述基本调试功能之外,NiosIIIDE调试器还支持以下高级调试功能:硬件断点调试ROM或闪存中的代码数据触发指令跟踪NiosIIIDE调试器通过JTAG调试模块和目标硬件相连。另外,支持片外跟踪功能便于和第三方跟踪探测工具结合使用,如FS2公司提供的用于NiosII处理器的in-target系统分析仪(ISA-NIOS)。调试信息查看——调试信息查看使用户可以访问本地变量、寄存器、存储器、断点以及表达式赋值函数。连接目标——NiosIIIDE调试器能够连接多种目标。表6-1列出了NiosIIIDE中可用的目标连接。LOGO目标说明硬件(通过JTAG)连接至Altera的FPGA开发板,如NiosII开发套件或其他Altera及其合作伙伴提供的套件中的开发板。指令集仿真器NiosII指令集架构的软件例化;用于硬件平台(如FPGA电路板)未搭建好时的系统开发。硬件逻辑仿真器连接至ModelSimHDL仿真器;用于验证用户创建的外设。NiosIIIDE调试器目标LOGO2.1.4闪存编程器许多使用NiosII处理器的设计都在单板上采用了闪存,可以用来存储FPGA配置数据和/或NiosII编程数据。NiosIIIDE提供了一个方便的闪存编程方法。任何连接到FPGA的兼容通用闪存接口(CFI)的闪存器件都可以通过NiosIIIDE闪存编程器来烧写。除CFI闪存之外,NiosIIIDE闪存编程器能够对连接到FPGA的任何Altera串行配置器件进行编程。LOGO闪存编程器管理多种数据,下表显示了编程到闪存的通用内容类型。内容类型说明系统固定软件烧写到闪存中的软件,用于NiosII处理器复位时从闪存中导入启动程序。FPGA配置如果使用一个配置控制器(例如用在Nios开发板中的配置控制器),FPGA能够在上电复位时从闪存获取配置数据。任意二进制数据开发人员想存储到闪存内的任何二进制数据,例如图形、音频等。LOGONiosIIIDE闪存编程器具有易用的接口,NiosIIIDE闪存编程器已做了预先配置,能够用于NiosII开发套件中的所有单板,而且能够轻易地引入到用户硬件中。除了IDE中的这些工具之外,NiosIIEDS还包括如下的部分:GNU工具系列——NiosII编译器工具是基于标准的GNUgcc编译器、汇编器、连接器和make工具。指令集仿真器——NiosII指令仿真器(ISS)使得用户在目标硬件准备好之前就能开发程序。NiosIIIDE使得用户可以基于ISS运行开发的程序,就如同在真正的目标硬件上运行一样简单。设计实例——Nios_IIED提供了软件实例和硬件设计来展示NiosII处理器和开发环境所具有的卓越的性能。LOGO2.2软件开发流程2.2.1NiosII程序的构成每个NiosII程序包括一个应用工程,可选的库工程和一个板支持包工程。用户将NiosII程序编译成一个能在NiosII处理上运行的可执行和连接的格式(ExecutableAndLinkedFormatFile——.elf)的文件。LOGO应用工程NiosIIC/C++应用工程包括组成一个可执行的.elf文件的源代码的集合。一个典型的应用的特征是一个源文件包含main()——主函数。应用工程包括libraries和BSP中被调用的函数的源代码。库工程库工程是一个库文件(.a)中的源代码的集合。库文件中通常包含可重用的,通用的函数,这些函数可被多个应用工程所共享。比如,数学函数库。库工程没有main()函数。LOGOBSP工程NiosIIBSP工程是包含特定系统支持代码的特殊的库。BSP为SOPCBuilder系统的处理器提供定制的软件运行环境。NiosIIEDS提供相应的工具可以修改设置以控制BSP的行为。NiosIIIDE和NiosIIIDE开发流程文档中使用systemlibrary来指代BSP。BSP包括如下的组成部分:硬件抽象层(HAL)NewlibC标准库设备驱动可选的软件包可选的实时操作系统(RTOS)LOGO硬件抽象层(HAL)HAL提供一个非线程的,类UNIX的C/C++运行环境。HAL可以提供通用的I/O设备,允许用户newlibC标准库的函数编程来访问硬件,如printf()。使用HAL可以最小化(或消除)通过直接访问硬件的寄存器来控制外设和与外设通信。NewlibC标准库Newlib是为了嵌入式系统的应用,而对C的标准库进行精简的开源实现。包括一些常用的函数的集合,如printf()、malloc()和open()等。设备驱动每个设备驱动管理一个硬件设备。HAL为SOPCBuilder系统中的每一个需要驱动程序的设备实例化一个驱动程序。在NiosII软件开发环境中,设备驱动具有如下的属性:一个设备驱动是和一个特定的SOPCBuilder设备相关联的。驱动程序可能有一些设置可以影响驱动程序的编译,这些设置包含在BSP的设置中。LOGO可选的选件包软件包是用户可以选择加入到BSP工程中,提供附加的功能的源代码。比如NiosII版本的NichStack®TCP/IP协议栈。NiosIIIDE和NiosIIIDE设计流程文档使用软件组件来指代软件包。在NiosII软件开发环境中,软件包具有如下的典型特性:A软件包和特定的硬件没有关联软件包有一些设置会影响它的编译,这些设置.包含在BSP的设置中。在NiosII软件开发环境中,软件包和库工程是不同的,软件包是BSP工程的一部分,不是一个单独的库工程。可选的实时操作系统(RTOS)NiosIIEDS包含第三方的C/OS-II实时操作系统,用户可以选择加入到BSP中。C/OS-II基于HAL,实现了一个简单的、welldocumented调度程序。用户可以修改设置,这些设置也是包含在BSP设置中。其它的操作系统可从第三方的软件厂商获得。.LOGO2.2.2NiosIIIDE软件开发步骤采用NiosIIIDE开发流程,用户使用NiosIIIDE图形用户界面来创建、修改、编译、运行和调试NiosII程序。IDE创建和管理用户的makefile。如果用户对编译进程和工程设置干预比较少,而且不需要定制的脚本,采用这种流程比较好。NiosIIIDE是基于流行的EclipseIDE框架以及EclipseC/C++开发工具(CDT)插件。NiosIIIDE在后台运行其它的工具,对用户屏蔽了底层工具的细节,提供了一个统一的开发环境。借助工程的创建和配置向导,NiosIIIDE使用起来很容易,尤其是对NiosII的初学者帮助很大。Altera公司提供了Windows和Linux操作系统的NiosIIIDE。下面以电子钟的软件开发为例来介绍软件开发的过程。LOGO1.新建IDE管理的工程NiosIIIDE提供了新工程的向导,指导用户创建IDE管理的工程。启动NiosIIIDE,出现NiosIIC/C++的窗口。首先创建NiosIIC/C++应用程序,在File菜单中选择newNios