6.3.2 调试/运行程序
进行完调试和运行环境的设置之后,调试和运行程序只要点击Run菜单,然后选择Run As/Debug As,再选择相应的运行/调试环境,如Nios II Haredware。控制台会显示调试和运行程序的信息。 6.3.3 下载程序到Flash
用户可以将软件文件、FPGA配置文件和数据文件存储到flash存储器中。对flash存储器编程能够使硬件在启动的时从flash装载软件和 FPGA的配置。用户可以使用Nios II IDE flash programmer编程连接到FPGA的flash存储器。 用户好似用flash programmer配置来管理flash存储器的编程。flash
programmer 配置是影响特定的目标硬件的flash编程进程的一组设置。用户可以创建多个flash programmer配置,每一个具有自己的编程参数。如果用户在多个目标板上开发项目时很有帮助。用户也可以建立一个flash programmer配置来编程文件的组合,允许用户一次操作编程两或三个文件。 1. 打开flash programmer,创建flash programmer配置
在Tools菜单中,点击Flash Programmer....,出现Flash Programmer 对话窗口。
在配置列表中右键单击Flash Programmer,然后在弹出菜单中单击New,一个新的flash programmer 配置出现。
在Name框中为该配置输入一个唯一的、有意义的名字。
2. 指定要编程到flash存储器的文件
在配置列表中,单击一个flash programmer 配置。 点击Main页。
如果要将可执行文件编程到flash存储器,采用如下的步骤: 选中Program software project into flash memory。
在Project 框中指定工程。flash programmer会自动找到用户工程的Nios II ELF Executable和目标硬件。
如果用户不是将可执行文件编程到flash存储器,采取如下的步骤: 选中Program software into flash memory.
删除Project框中的内容。
不选择Program software into flash memory。SOPC Builder System 框可用. 在SOPC Builder System框中指定目标硬件文件。
如果要将FPGA配置编程到flash存储器,采取如下的步骤:
选中Program FPGA configuration data into hardware-image region of flash memory.
在FPGA configuration (.sof)框中指定数据文件. 在Hardware Image 列表中选择FPGA 配置位置。 在Memory列表中,选择flash存储器设备。
在Offset框中,键入flash存储器设备中的配置文件起始位置的偏移量。 如果用户要将数据文件编程到flash存储器,采用如下的步骤: 选中Program a file into flash memory。 在File框指定要编程到flash的文件。 在Memory列表中,选择flash存储器设备。
在Offset框中,输入数据文件的在flash存储器设备中起始位置的偏移量。
指定编程的线缆和目标flash存储器设备
在配置列表中,单击一个flash programmer配置。 单击Target Connection页。
在JTAG cable列表中,选择连接到目标板的JTAG cable。如果用户只有一条电缆,automatic 的设置会自动地确定用户的下载线。如果用户的下载线没有出现在列表中,确认是否正确地安装和连接,然后点击Refresh 将其添加到列表中。 在JTAG device列表中,选择要编程的Nios II 系统。如果用户只有更一个连接到JTAG Cable的Nios II 系统,automatic 的设置自动确定用户的系统。如果用户的Nios II系统没有显示在列表中,确认硬件是否正确地安装和连接, 然后点击Refresh将其添加到列表中。 编程目标板上的flash存储器
在配置列表中,点击一个flash programmer配置。Main和Target Connection页上的设置必须是合法的。 点击右下角的Program Flash开始对flash编程。flash的编程过程需要几分钟,具体的时间取决于下载的数据的大小。 如果用户的工程不是最新的, 在将工程编程到flash存储器之前, Nios II IDE 会自动地编译用户的工程。用户也可以关闭自动编译,在Window 菜单,点击Preferences, 然后展开Run/Debug,点击 Launching,然后去掉Build (if required) before launching的选项。
如果需要的话,flash programmer自动地在编程数据之前添加上boot-loader代码。
第4节 硬件抽象层库(HAL)
6.4.1 HAL 简介
HAL是轻量级(lightweight)的运行环境,提供了简单的设备驱动程序接口,应用程序 使用设备驱动程序接口同底层硬件之间进行通信。HAL应用程序接口(application program interface——API) 同ANSI C 标准库结合在一起。HAL API使得用户可以使用熟悉的C语言的库函数来访问硬件设备或文件,如printf()、fopen()、fwrite()等函数。
HAL作为Nios II处理器系统的设备驱动程序软件包, 为系统中的外设提供了相匹配的接口。SOPC Builder和Nios II 软件开发工具之间的紧密集成,使得特定硬件系统的HAL可以自动产生。当SOPC Builder产生了硬件系统,Nios II IDE或者Nios II 软件生成工具可以生成和硬件配置相匹配的定制的HAL系统库或者板支持包 (BSP)。如果在底层硬件上做了改动,则HAL设备驱动配置会自动地更新,避免了底层硬件的改动产生Bug的可能。
HAL设备驱动抽象使得应用程序和驱动程序之间很明显地区分开来。 驱动抽象促进了应用程序代码的可重用性,应用程序和底层硬件的通信依靠统一的接口函数,底层硬件的改动对应用程序的代码没有影响。而且,HAL标准使得和 已有外设相匹配的新外设的驱动程序编写起来更加简单。
在用户使用Nios II IDE创建新工程的时候,也同时创建了HAL系统库。用户不必创建或 拷贝HAL文件, 也不必编辑任何HAL的源代码。 Nios II IDE会为用户产生和管理HAL系统库。 HAL是基于一个特定的SOPC Builder系统。 SOPC Builder系统即是Nios II 处理器核和外设与 存储器集成在一起的系统(由 SOPC Builder)。在新建工程的时候,用户必须选择相应的硬件系统,见图6-5。
6.4.2 HAL 体系结构
HAL提供下面的服务:
? ? ? ? ?
同newlib ANSI C 标准库集成——提供用户熟悉的C标准库函数。 驱动程序——提供对系统中每个设备的访问。
HAL API——为HAL的服务提供了一个统一的、 标准的接口, 如设备访问、 中断处理等。
系统初始化——在main()执行之前,执行处理器和运行环境的初始化的任务。
设备初始化——在main()执行之前,例化和初始化系统中的每个设备。
图 6-22 显示了基于 HAL 系统的分层结构,从硬件层到用户程序,可以看到 HAL 将硬件层和应用程序层联系起来。
应用程序和驱动程序
嵌入式系统的软件开发分为两部分:应用程序开发和设备驱动程序的开发。应用程序开 发占有更大的比重,包括系统的main() 函数和其它的子程序。应用程序同系统硬件资源的 通信是通过C标准库函数或者HAL API。驱动程序是提供给应用程序开发人员开发应用程序之用的,驱动程序通过底层的硬件访问宏直接和硬件通信。 通用设备模型
HAL为嵌入式系统中的外设种类提供了通用设备模型。 如timers、 Ethernet MAC/PHY 芯 片、 字符型I/O外设。通用设备模型是HAL强大功能的核心。通用设备模型使得用户可以使 用统一的API来编写程序,不用考虑底层的硬件。 通用设备模型的种类:HAL 为下面种类的设备提供模型:
字符型设备 (Character-mode device) ——串行发送和/或接收字符的硬件外设, 如UART。
? 定时器设备(Timer devices)——能够对时钟脉冲计数,并且能够产生周期性的中断请 求的外设。
? 文件子系统(File subsystems)——提供访问存储在物理设备中的文件的一种机制。取 决于内部的实现,文件子系统驱动程序可以直接访问底层的设备,或者使用一个单独的 设备驱动程序。例如,用户可以使用Flash存储设备的HAL API来编写一个Flash的文件子系统来访问Flash。
? ?
以太网设备(Ethernet devices)——对网络协议栈(如Altera的Nios II版本的TCP/IP协议栈)提供以太网连接的访问。
DMA设备(DMA devices)——执行数据源、宿之间大批量数据传输的外