NIOS软件框架

tech2023-10-15  108

1.Eclipse软件工程结构

主要介绍上面两个:

应用程序开发,开发者创建的软件工程BSP system.h,连接QSYS硬件和软件的桥梁,包括所有QSYS系统中的IP信息,包括基地址、中断号等。HAL结构,硬件抽象层系统库是在应用程序和系统硬件之间的一个系统库,HAL应用程序接口(API)与ANSI C标准库综合在一起,可以使用类似C语言的库函数的方式访问硬件设备或文件。我们可以用这个系统库函数来和底层的硬件进行交互而无需关注底层细节。HAL可看做是一个支持应用程序开发的软件平台,提供了大量API函数接口,屏蔽硬件访问细节(不像HDL语言一样必须去描述复杂时序)虽然占用一些额外资源,但大大提升开发速度和可移植性。比如想要获取时间信息,需要在QSYS中调用Timer,在软件工程中获取时间戳信息时,只需要#include <sys/alt_timestamp.h>就可以调用API函数alt_timestamp_start()来开启时间戳服务,调用t1 = alt_timestamp()获取时间信息。BSP包括五部分: 集成C标准函数库,在Include文件中提供访问QSYS系统中各个设备的驱动程序, 在drivers文件夹中,包含以下6类设备: 字符型设备,接收和发送字符串的外围硬件设备,如JTAG、UART文件子系统,提供访问存储在物理设备中的文件操作,如用户可以利用有关flash的HAL API来编写Flash文件子系统驱动来访问FlashDMA设备,包括DMA控制器核。执行大量数据在数据源和目的地之间传输的外围设备。数据源和目的地可以是存储设备,也可以是其他设备(以太网、usb)定时器设备,对时钟脉冲计数并产生周期行中断请求的外围设备Flash设备,包括通用Flash接口芯片和主动串行配置器件EPCS控制器以太网设备,对Altera提供的轻量级IP协议提供访问的以太网连接(包括LAN9111以太网MAC/PHY控制器,并且需要uC/OS-II的支持) HAL通用的API函数(库),在HAL文件夹中系统初始化函数(alt_sys_init.c),为main函数建立运行环境,包括BootLoader、程序重定位设备初始化函数 ,在main()函数之前,分配设备空间并初始化所有外围设备

2.HAL异常处理

NIOS中的异常不采用中断向量表,所有异常都驻留在一个单一存储空间的代码来处理,该空间为exception address。该空间内,系统会自动插入判断中断源和优先级的代码,用户只需要编写中断服务子程序即可。

2.1 中断异常处理过程

保护现场;查找中断源;调用相应中断服务子程序(用户编写);恢复现场;中断返回。 把status寄存器内容复制到estatus寄存器中,保持当前处理器状态清除status寄存器的PIE位为0,禁止所有硬件中断异常返回地址写入ea寄存器(r29)跳转到异常处理地址。若是内部中断,则跳向异常地址;若是外部中断则跳向设备指定的中断地址 使用HAL API 函数编写中断服务程序分两步: 注册中断。推荐使用新版本中断函数即带ic的版本,虽然大部分IP支持两种中断函数,但是当用外部中断时必须使用新版本中断函数。alt_ic_isr_register(UART0_IRQ_INTERRUPT_CONTROLLER_ID(控制器ID),UART0_IRQ(中断优先级),uart0_cmd_isr(中断处理函数),(void *) &uart_context(可选指针指向特定组件的数据结构,可声明一个 char * p 但是不用它),0(保留项,为0))【后两个也可以直接写NULL】编写中断服务函数 void uart0_cmd_isr(void* isr_context) //isr_context可为空。

2.2 中断注意事项:

中断服务程序主要处理一些高优先级,实时性强的操作,所以不可以在中断服务程序里面进行等待或者其他阻塞性质的操作。保持中断服务程序精简,保证快速可靠把无关紧要的事务放在中断服务程序之外处理避免调用C库函数,运行效率较低(如printf()),可能会引起阻塞且运行时间不可预知,对实时响应不利避免浮点运算中断调试时在中断服务程序中设置断点,中断来临后单步调试时会忽略其他中断避免使用printf函数,而是用sprintf()函数代替,将关键数据写到内存,然后触发外部分析程序。

3.NIOS上电自启动

3.1 BootLoader

程序在RAM中运行,若想让他断电后不消失必然需要将它存储在非易失存储器中,而上电自启动的过程需要BootLoader作为一个搬运工,将存储在非易失存储器中的代码转移到RAM。主要包括两步: 1.FPGA器件本身的配置过程。使用FPGA器件外部配置控制器或者Qsys自带的配置控制器IP(EPCS/EPCQ)控制配置FPGA的内部逻辑。若内部逻辑使用了NIOS则配置完成后的FPGA中也会有NIOS。2.NIOS本身的引导过程。FPGA配置完毕后,NIOS就被逻辑中的复位电路复位,然后从头开始执行代码。 下图是BSP editor中的链接脚本linker script页面(灰色部分在QSYS的处理器配置页面指定): .bss(未初始化变量数据段):未初始化变量,如全局变量定以后,但未初始化的都在这里.entry(复位地址):软件代码的存储区,程序从此处开始启动.exceptions(异常处理地址):系统异常处理代码的存放区域.heap(堆):动态分配内存的存储区,从小地址向大地址方向增长.rodata(只读数据段):存放程序中静态全局变量,所有有初值的全局变量放在这里.rwdata(可读写数据段):用于存放程序中可读写变量和指针变量.stack(栈):函数调用变量与临时数据存储器区域(如返回地址、现场信息),从大向小地址方向增长.text(正文段,只读):代码执行区,也就是NIOS程序最终运行的地方;一个程序只有一个副本;只读,防止意外修改自身指令上图中所有配置会反应在BSP文件夹中的linker.x文件中 上电后程序运行前所有的数据都是放在Flash中的,若系统Reset地址和其他段地址设置(Exception地址、.text地址)的不同,那么系统从Reset地址启动时会从Flash中把相关数据自动下载到相应地址或初始化相应地址。 若Exception address和Reset address不同,那么程序从Reset address中启动后将把放在后者中的系统异常处理代码拷贝到前者test address类似,将会把后者中的只读程序段拷贝到test address中 在NIOS的Flash Programmer中,我们需要添加QSYS系统的.sopcinfo文件,软件elf文件,硬件sof文件。Flash Programmer会根据前两个中指定的复位地址以及各个段的运行地址来判断到底是否需要添加BootLoader(由EPCS/EPCQ Controller提供),若所有的段都运行在flash存储器中,那就不用添加。但这是不可能的,会导致程序运行的效率差。若存在,BootLoader就是系统加电后运行的第一段代码,实现代码的搬运。BootLoader的任务: 1.完成复位子程序的功能。在从复位地址开始的32字节(指令缓存行的尺寸)空间内完成复位的软件响应。2.加载应用项目程序映像中的代码和数据段。从装载地址Reset address加载程序运行地址.text。3.跳转到应用程序入口。通常是__start。 当BootLoader跳转到应用程序入口后,会用到NIOS软件框架准备的启动代码,即Crt0.S(先)和alt_main.c(后)两个HAL源文件。包括各种初始化任务,在alt_main.c的末尾最终跳转到我们编写的main.c。

3.2 程序上电后的执行过程

1.由BootLoader将Flash中的.entry内容拷贝到.text中2.跳转到ctr0.S _start标号处3.初始化数据缓存4.初始化全局变量指针5.清零.bss6.调用alt_load函数。调用alt_load_section函数加载.rwdata,.exception,.rodata节点,调用alt_deche_flush_all函数和alt_icache_flush_all函数同步缓存。(当使用了BootLoader后不用调用alt_load,它们完成一样的功能)7.调用alt_main()函数。调用alt_irq_init函数初始化中断,调用alt_sys_init函数初始化添加的IP。其它初始化。8.调用main()函数9.调用close函数10.调用exit函数
最新回复(0)