Transcript Document

可编程片上系统开发平台
何宾
2012.02
本章内容
该章描述在Xilinx嵌入式开发套件(Xilinx
Development Kit,XDK)嵌入式系统工具的结构和设计流
程。XDK用于开发基于MicroBlaze软核和PowerPC硬核处
理器的SOPC系统。该章的主要内容包括:EDK简介、设
计流程概述、平台开发结构的工具。
Xilinx的EDK工具主要包含:Xilinx Platfrom Studio
(XPS)人机界面、嵌入式系统工具套件、嵌入式处理IP
核,例如处理器和外设、 Platform Studio SDK(Software
Development Kit,SDK)。SDK基于Eclipse开放源码框
架,可以选择使用SDK开发自己的嵌入式软件应用程序
(从EDK13.1开始,必须在SDK内开发软件应用程序)。
设计流程及EDK工具
-设计流程
EDK中所提供的工具用来完成嵌入式设计的整个过
程。图5.1给出了基于EDK的基本嵌入式设计流程。
ISE 设计套件
嵌入式和系统版本
SDK软件开发工具
硬件
平台
处理器硬件开发
验证文件生成
设计实现
芯片配置
软件开发
软件调试
软件统计分析
芯片配置
图5.1 EDK嵌入式设计流程
也包括在ISE 设计套件
嵌入式和系统版本中
设计流程及EDK工具
-建立硬件平台
Xilinx的FPGA技术允许设计者在处理器子系统中定制
硬件逻辑。这种定制不可能使用标准的现成的微处理器或
控制器芯片。“硬件平台”是指设计人员根据应用的需要
而
使用Xilinx的技术建立的灵活地、嵌入式处理子系统。
硬件平台是由一个或多个处理器或外设连接到处理器
总线构成的。
EDK通过微处理器硬件规范(Microprocessor Hardware
Specification,MHS)文件记录硬件平台信息。
设计流程及EDK工具
-软件平台建立
软件平台是软件驱动和用于建立应用程序的操作系统
(可选)组成的。所建立的软件映像文件只包含用户所
使用到的一部分Xilinx的库。
EDK通过微处理器软件规范(Microprocessor
Software Spectifcation,MSS)记录软件平台信息。设计
人员可以在软件平台运行多个应用程序。
设计流程及EDK工具
-使用仿真的硬件平台验证
验证硬件平台的正确功能,设计人员可以建立一个仿
真模型,并且在HDL仿真器上运行。当仿真系统时,处理
器运行可执行文件。
设计人员可以选择建立行为、结构或者精确的时序仿
真模型。
设计流程及EDK工具
--使用调试的软件验证
调试嵌入式软件的基本技术是加载设计到所支持的开
发板和使用调试工具去调试处理器。
作为可选择的方式,设计人员可以使用指令集仿真器
或简化系统仿真器模型(“虚拟平台”)运行在主机上来
调
试设计代码。
设计人员可以通过概要分析代码的执行来估计系统性
能。
设计流程及EDK工具
-芯片配置
一旦软件和硬件平台建立完成,设计人员可以为FPGA
建立一个的配置比特文件。
对于原型设计,当连接主机和芯片时,设计者可以在
下载比特流时,将希望运行在嵌入式平台上的软件同时下
载。
对于产品,设计人员将配置比特流和软件保存在和
FPGA连接的非易失性存储器中。
设计流程及EDK工具
-EDK工具
图5.2 EDK工具的结构
设计流程及EDK工具
-EDK工具
设计环境
Xilinx Platform Studio(XPS)
集成设计环境GUI,在这个集成环境中可以创建完
整的嵌入式设计。
Xilinx Software Development
Kit(SDK)
集成设计环境GUI,是对XPS的补充,用来帮助设
计人员开发软件应用功能(从13.1开始,专用
于软件应用的开发)。
EDK命令行或“非Windows”模式
允许设计人员运行嵌入式设计流程或从命令行改变
工具选项。
硬件开发
The Base System Builder(BSB)向
导
通过使用支持的开发板或通用的基本功能,允许设
计人员快速地建立一个嵌入式设计。Xilinx推荐
使用BSB建立最初的项目创建。
The Create and Import IP Wizard
辅助设计人员添加自己的外设到设计中。建立相关
的目录或数据文件,保证外设能被EDK工具识
别。
Configure Coprocessor Wizard
帮助设计人员添加协处理器到CPU。
Platform Generator(Platgen)
以HDL或实现的网表文件在片上构造可编程系统
设计流程及EDK工具
-EDK工具
软件开发
Library Generator(Libgen)
构建一个软件平台,该软件平台由定制的软件库、
驱动程序和OS构成。
GNU Compiler Tools(GCC)
基于库产生器建立的平台,建立软件应用程序。
验证
Xilinx Microprocessor
Debugger(XMD)
打开shell用于软件下载和调试,也提供通道用于
GNU调试器访问设备。
GNU Debugger(GDB)
调试软件的GUI,基于仿真模型或目标设备。
Simulation Model
Generator(Simgen)
产生硬件仿真模型和编译脚本文件用于对完整系
统的仿真。
Simulation Library
Compiler(CompEDKLib)
在开始对设计进行仿真时,为目标仿真器编译
EDK仿真库。
Bus Functional Model
Compiler(BFM)
通过建立一个总线环境的模型去代替真实的嵌入
式系统来帮助简化定制外设的验证。
设计流程及EDK工具
-EDK工具
设备配置
Bitstream Initializer(Bitinit)
更新FPGA的配置比特流,用可执行的软件初始
化片上指令存储器
System ACE File
Generator(GenACE)
基于FPGA的配置比特流和存储在非易失性存储
器的可执行软件,产生一个Xilinx系统ACE配置
文件
Flash Memory Programmer
允许设计人员使用目标处理器去编程板上的通用
Flash(CFI)接口-兼容的并行flash
杂项类
Format Revision(revup)Tool and Revup工具更新设计文件(例如MHS)到当前的
Version Management Wizard
版本。版本管理向导帮助将先前EDK建立的IP和
驱动更新到当前的版本。
LibXil Memory File System
Generator (LibXil MFS)
在主机上建立一个MFS存储器镜像,该镜像并被
下载到嵌入式系统存储器。
Platform Specification Utility
自动产生微处理器外设定义MPD数据文件,该
文件要求创建EDK兼容的制定外设。
设计流程及EDK工具
- Xilinx Platform Studio(XPS)
XPS提供了集成环境为基于MicroBlaze和PowerPC处理
器的嵌入式处理器系统创建软件和硬件规范流程。
XPS也提供编辑器和项目管理接口用来创建和编辑源
代码。
XPS提供工具流程配置选项的定制和提供图形化的系
统编辑器用来连接处理器、外设和总线。
XPS可以在Windows、Solaris和Linux平台下使用。
从XPS中,设计人员可以运行所有的用于处理硬件和
软件的嵌入式系统工具。在XPS环境下可以进行系统的验
证。
设计流程及EDK工具
- Xilinx Platform Studio(XPS)
XPS提供下面的特性:
(1) 能够添加核,编辑核参数和进行总线和信号连接,产生MHS
文件;
(2) 能够产生和修改MSS文件;
(3) 支持表5.1内的所有工具;
(4) 能够产生和观察系统块图和设计报告;
(5) 多用户软件应用支持;
(6) 项目管理;
(7) 过程和工具流程依赖管理;
(8) 输出MHS文件到SDK工具
设计流程及EDK工具
-Xilinx Software Development Kit(SDK)
SDK工具是XPS的补充,SDK为应用软件提供开发环
境。SDK基于Eclipse开放源码标准。SDK主要有以下特
点:
(1) 功能丰富的C/C++编辑器和编译环境;
(2) 导入基于XPS生成的硬件平台定义;
(3) 提供项目管理;
(4)支持基于单个处理器或者多个处理器系统的软件应用程序的
开发;
(5) 支持以团队环境的形式开发软件应用程序;
(6)为第三方的操作系统创建和配置板级支持包BSP;
设计流程及EDK工具
-Xilinx Software Development Kit,SDK
(7)提供现成的简单软件工程来测试硬件和软件功能;
(8)通过GUI接口为软件应用程序、编程FPGA芯片和编
程并行flash存储器产生链接脚本;
(9)应用程序的建立配置和自动的MAKE文件生成;
(10)错误浏览;
(11)为无缝调试和概要分析目标提供了好的集成环境;
设计流程及EDK工具
-The Base System Builder(BSB) Wizard
BSB向导帮助设计人员快速建立一个嵌入式系统工
程。对于更复杂的工程,BSB向导提供基本的系统,通过
这个系统设计人员可以定制完成嵌入式设计。为了高效率
的建立工程,Xilinx推荐使用BSB向导。
设计流程及EDK工具
-The Base System Builder(BSB) Wizard
基于设计人员选择的板子,设计人员通过BSB选择并
配置基本的元素,比如:处理器类型、调试接口、缓存配
置、存储器类型和大小、外设等。
对于BSB不支持的目标系统,设计人员可以选择定制
板选项。使用这个选项时,必须指定未来板子的硬件,并
且要给出用户约束文件UCF。
如果选择的是支持的目标板,BSB向导自动的加入
UCF文件。当退出BSB时,BSB所建立的MHS和MSS文
件自动加入到XPS工程中,设计人员能在XPS中进行更进
一步的设计。
设计流程及EDK工具
- Platform Generator,Platgen
平台产生器Platgen将对嵌入式系统的高级描述编译成能
在目标FPGA芯片上实现的HDL网表。
嵌入式系统硬件平台典型的由一个或多个处理器和不同
的外设和存储器模块组成,这些模块通过处理器总线连
接。每个外设的IP核有很多的参数,通过调整这些参数来
定制行为。这些参数也用来为这些存储器和外设进行地址
映射。由于EDK提供可选择的特性,FPGA只需要实现应用
程序所要求的功能子集。
硬件平台保存了MHS文件。MHS文件是表示所设计的
嵌入式系统的硬件元件的最主要文件。MHS文件以ASCII码
形式存在。
设计流程及EDK工具
- Platform Generator(Platgen)
Platgen读取MHS文件作为基本的设计输入。Platform
也从EDK库和用户IP库中读取不同的处理器核硬件描述文
件(MPD,PAO)。
Platgen为嵌入式系统产生顶层HDL设计文件,该文件
包含所有参数化了的IP核。
在这个过程中,将MHS中所有高层总线连接变成连接
处理器、外设和片上存储器的真实信号。它也调用XST编
译器综合每个例化的IP核(Platgen产生的系统级网表也用
来作为FPGA实现过程的一部分)。
此外,Platgen也产生BMM(BRAM Memory Map)文
件,该文件包含所用到的片上BRAM的地址。
设计流程及EDK工具
- 建立和导入IP向导
该向导帮助设计人员建立自己的外设并且将它们导入
相应的XPS工程中。
在创建模式下,创建和输入外设向导建立很多文件,
这些文件的一些是模板文件帮助设计人员实现外设,而不
需要详细的知道总线协议,命名规则和特殊接口文件的格
式。通过参考模板中的例子和使用不同的辅助设计支持文
件,设计人员可以很快的进行逻辑定制。
在导入模式下,该工具帮助设计人员建立接口文件和
目录结构。对于这种操作模式,必须遵守EDK的命名规
则。一旦导入完成,用户的定制外设在EDK外设库中可以
使用。
设计流程及EDK工具
--建立和导入IP向导
当创建或输入一个外设时,自动生成MPD
(Microprocessor Peripheral Defination)文件和PAO
(Peripheral Analyze Order)文件。MPD文件定义了外设
的接口,PAO文件通知其它工具(Platgen,Simgen),对
外设需要编译哪个HDL文件和以什么样的顺序编译。
设计流程及EDK工具
-配置协处理器向导
如果设计中包含MicroBlaze和PowerPC处理器时,可
以使用该向导。该向导添加和连接协处理器到CPU。协处
理器是一个硬件模块用来实现用户在FPGA内定义的功能
和通过FSL接口与处理器连接。FSL通道是一个专用的32
位,点对点的通信接口。
设计流程及EDK工具
-库产生器(Libgen)
Libgen为嵌入式处理器系统配置库,设备驱动,文件系
统和中断句柄,以及创建板级支持包BSP。嵌入式软件平台
为每个处理器定义了系统内外设的驱动(板级支持包),
可选择的库,标准的输入/输出设备,中断句柄例程和其它
相关的软件特征。SDK工程进一步定义了运行在每个处理
器上的软件,这些软件基于BSP运行。
设计流程及EDK工具
-库产生器(Libgen)
来自于EDK安装的库和驱动,以及设计人员提供的定
制库和驱动,SDK将用户程序,包括库和驱动程序编译
成处理器硬件平台上可执行可链接的文件(Executable
Linked Format,ELF)。
Libgen读取选择的EDK库和不同的处理器核软件描述
文件(Microprocessor Driver Defination, MDD)和驱动代
码。
设计流程及EDK工具
- GNU编译工具(GCC)
XPS调用GNU编译工具用于编译和链接应用程序。
1)对于MicroBlaze处理器的应用,XPS运行mb-gcc编
译器;
2)对于PowerPC处理器的应用,XPS运行powerpc-eabigcc编译器。
编译器能读取C代码,头文件和汇编代码。链接器将
编译的程序和选择的库连接在一起产生ELF可执行文件。
连接器也读取连接脚本(默认产生或用户产生)。
设计流程及EDK工具
-Xilinx Microprocessor Debugger(XMD)
设计人员可以使用指令集仿真器或者虚拟平台调试软
件程序。XMD读ELF文件。对于调试物理的FPGA,XMD
和FPGA通讯使用和FPGA下载相同的电缆。
设计流程及EDK工具
-GNU调试器(GDB)
GNU调试器是个强大和灵活的工具,它为在不同的开
发周期验证MicroBlaze和PowerPC系统提供了统一的调试
和验证手段。GDB使用了XMD作为最基本的引擎和处理
器目标通讯。
设计流程及EDK工具
- Simulation Model Generator(Simgen)
仿真模型产生器Simgen为硬件产生和配置不同的模
型。为产生行为模型,Simgen使用MHS文件作为基本的
输入。为产生结构或时序模型,Simgen使用综合后或布局
布线后的设计数据库作为基本的输入。
Simgen为每个处理器也读取嵌入式应用ELF文件去初
始化片上存储器;这样处理器在仿真阶段就可以执行这些
软件代码。
设计流程及EDK工具
- Simulation Library Compiler(CompEDKLib)
CompEDKLib使用不同仿真工具厂商提供的仿真器编译
EDK基于HDL的仿真库。这个工具可以运行在GUI和批处
理模式下。
在GUI模式下,允许设计人员使用CompXLib编译Xilinx
的库和EDK中可以使用的库。
设计流程及EDK工具
- Virtual Platform Generator(VPgen)
虚拟平台是硬件系统的周期级的仿真模型。可以在主
机上用虚拟平台来调试和评估软件应用代码,而不需要得
到运行在原型板上的硬件。
设计流程及EDK工具
-Bus Functional Model Compiler(BFM)
总线功能仿真简化了依附在总线上的硬件元件的验证。
设计流程及EDK工具
-Bitstream Initializer(Bitinit)
比特流初始化工具使用软件信息来初始化与处理器
连接的片上BRAM存储器。
这个工具读取ISE工具产生的硬件比特流文件
(system.bit),产生一个新的输出比特流文件
(download.bit),这个比特流文件包含ELF文件。
这个工具使用BMM文件,该文件由Platgen产生,通
过使用每个BRAM块的物理的布局信息由ISE工具更新。
在内部,比特流初始化工具Bitinit使用在ISE中提供的
Data2MEM工具来更新比特流文件。
设计流程及EDK工具
-System ACE File Generator(Gen ACE)
从FPGA比特流中产生 Xilinx System ACE配置文件和
ELF/数据文件。
产生的ACE文件用于配置FPGA,初始化BRAM,使
用有效的程序或数据初始化外部存储器和启动处理器。
EDK提供了工具命令语言(Tool Command
Language,Tcl)脚本,genace.tcl。该脚本使用XMD命令
产生ACE文件。
使用MDM系统可以为PowerPC或MicroBlaze产生ACE
文件。
设计流程及EDK工具
-Flash Memory Programmer
编程解决方案被设计成通用的,面向不同的Flash硬件
和布局。
设计流程及EDK工具
-Format Revision(revup)Tool and Version
Management Wizard
格式版本工具revup更新已经存在EDK工程到当前的版
本。revup工具只执行格式的变化,对设计不进行更新。
在应用revup前,备份MHS,MSS,XMP等文件。
当使用新版本的EDK工具打开老版本的工程时,就会
显示版本管理向导。
当执行revup后,调用版本管理向导。向导提供有关设
计中使用的Xilinx处理器IP核的变化信息。如果新版本的
IP核可以使用,向导将升级到新的版本。
设计流程及EDK工具LibXil Memory File System Generator
(LibXil MFS)
以文件句柄的形式提供管理程序存储器的能力。设
计人员可以建立目录,并在目录中存放不同文件。文件
系统能通过使用高级C语言进行函数调用来访问。
设计流程及EDK工具
-Platform Specification Utility
平台规范工具能够自动产生建立IP核的MPD文件。通
过建立和导入外设向导的帮助,能够使用这个工具提供的
功能。
平台产生器
硬件的产生是由平台产生器(Platform Generator,
Platgen)生成。
Platgen以硬件网表的形式(HDL和实现网表文件)建
立片上可编程系统。
Platgen使用MHS文件作为输入并建立硬件平台。除了
以NGC、EDIF等网表文件格式外,Platgen为下面的工具
和顶层的HDL封装提供支持文件,可以使设计者添加其它
元件并且自动的产生硬件平台。
平台产生器
当运行Platgen时,FPGA的实现工具运行完成硬件的
实现。
典型的,XPS为实现工具调用项目管理器(Project
Navigator)前端,用于控制实现过程。
ISE流程结后,产生用于配置FPGA的比特流文件。这
个比特流文件包括为FPGA片上BRAM的初始化信息。
如果设计的代码或数据必须在启动时放在这些存储器
时,Data2MEM工具使用包含在可执行文件内的代码/数据
信息来更新比特流文件,这个可执行文件在软件应用程序
建立和验证流程的结束时产生。
平台产生器
--加载路径
图5.3给出了外设IP路径的结构。Platgen使用查
找优先级机制来确定外设的位置:
lp<library_path>
-
<library_name>
boards
drivers
pcores
图5.3 外设路径结构
sw_services
平台产生器
--加载路径
(1)在工程目录下,寻找pcore目录
(2)通过-lp选项寻找指定的<library_path>/<library
name>/pcores位置
(3)查找XILINX_EDK/hw/<library name>/pcores
从pcores目录中,外设的名字就是根目录的名字。从根
目录中,基本的目录结构为:data、hdl和netlist。
平台产生器
-输出文件
Platgen产生下面的文件和目录:hdl、implementation和
synthesis。在工程目录下,这是最基本的目录结构。
1、HDL目录
HDL目录包含下面的文件:
1)system.[vhd|v]:这是嵌入式处理器系统得HDL文件,该文件
在MHS中定义。该文件包含了IOB原语(当指定-toplevel yes
选项)。
2)system_stub.[vhd|v]:这是例化系统和IOB原语的顶层HDL文
件模版。使用这个文件作为设计者自己的顶层HDL设计文件
的开始点(当指定-toplevel no选项)。否则,system.[vhd|v]
为顶层。
平台产生器
-输出文件
3)<inst>_wapper.[vhd|v]:在MHS中定义的单独的IP元件
的HDL封装文件。
2、Implementation目录
该目录包含peripheral_wrapper.ngc实现网表文件。
3、Synthesis目录
该目录包含system.[prj|scr]综合工程文件;
平台产生器-存储器的产生
--BMM策略
Platgen在<Project_Name>/implementation目录下,产生
<system>.bmm和<system>_stub. Bmm。
(1)当EDK是顶层系统时,实现工具使用<system>.bmm;
(2)当EDK是顶层系统的子模块时,实现工具使用
<system>_stub.bmm;
平台产生器-存储器的产生
--BMM流程
EDK工具的实现工具流程采用了Data2MEM,下面给
出了其流程:
1)ngdbuild –bm <system>.bmm <system>.ngc
2)map
3)par
4)bitgen –bd <system>.elf
Bitgen输出<system>_bd.bmm,包含了BRAM的物理位
置。<system>_bd.bmm和<system>.bit文件输入到
Data2MEM。Data2MEM将数据片断转换为正确的初始化
记录,这些记录用于Virtex系列的BRAM。
仿真模型产生器
仿真模型产生器(Simulation Model Generator,
Simgen)为一个给定的硬件生成和配置不同的VHDL和
Verilog仿真模型。
MHS文件作为Simgen的输入,MHS文件描述了硬
件元件的例化和连接。Simgen也为指定厂商的综合工具生
成脚本。脚本编译产生的仿真模型。
仿真库
仿真网表使用低层次的Xilinx FPGA可使用的硬件原
语。Xilinx为这些原语提供了仿真模型。下面介绍了Xilinx
的仿真流程中所使用的库。HDL代码必须参考相对应的编
译库。
HDL仿真库必须将逻辑库与物理编译的库相对应。
Xilinx的库可以使用CompXLib工具进行编译。
仿真库
--UNISIM库
UNISIM库是功能模型库,用于行为和结构仿真。该
库包含所有的Xilinx统一的库元件,这些库元件可以被大
部分的综合工具识别。UNISIM库也包含了那些通用的例
化元件,比如I/O和存储器单元。
设计人员在设计中例化UNISIM库,并且在行为仿真
时进行仿真。Simgen产生的结构仿真模型例化UNISIM库
元件。
在UNISIM库中的所有元件都是0延迟的。所有的同步
元件有一个单位的延迟避免竞争条件,对于同步元件的
clock-to-out延迟是100ps。
仿真库
--SIMPRIM库
SIMPRIM库用于时序仿真。它包含所有的Xilinx实现
工具中使用的Xilinx的原语库元件。Simgen产生的时序仿
真模型例化SIMPRIM库元件。
仿真库
--XilinxCoreLib库
Xilinx的核产生器是一个图形化的IP设计工具用来产
生高层次模块,比如FIR滤波器,FIFOs,CAMs和其它高
级IP。设计人员可以定制和预优化模块来利用Xilinx
FPGA芯片的固有的结构特点,比如,块乘法器,SRL,
快速进位逻辑和片上的单端口或双端口RAM。
核产生器HDL库模型用于行为仿真。设计人员选择合
适的HDL模型添加到HDL设计中。模型不使用用于全局信
号的库元件。
仿真库
-- EDK库
EDK库用于行为仿真。该库保存了所有的EDK IP元
件,这些元件预编译用于ModelSim SE、PE或NcSim。库
免除了需要为每一个工程重新编译EDK元件,减少了编译
的时间。EDK IP元件库只提供VHDL语言,并且可能加密。
未加密的EDK IP元件能使用Xilinx的CompEDKLib工
具编译。对于加密的EDK IP元件提供了预编译库。
仿真模型产生器
--仿真模型
功能仿真设计输入设计综合设计网表设计实现设计实
现的网表时序仿真行为仿真结构仿真图4.4 FPGA设计仿
真阶段
该部分介绍行为仿真模型、结构仿真模型和时序仿真
模型。图5.4给出了FPGA的设计仿真阶段。在设计过程的
每个点,Simgen建立一个合适的仿真模型模型。
仿真模型产生器
--仿真模型
设计输入
行为仿真
设计综合
功能仿真
设计网表
设计实现
结构仿真
图5.4 FPGA设计仿真阶段
设计实现的网表
时序仿真
仿真模型产生器
--行为模型
图5.5给出了行为仿真模型。Simgen要求MHS文件作为
输入。Simgen建立一系列的仿真模型。可选的,Simgen为
指定厂商的仿真器产生编译脚本。如果指定,Simgen能用
数据产生HDL文件去初始化与存在设计中的BRAM相关
联。这个数据从存在在可执行和连接格式(ELF)文件中
得到。
仿真模型产生器
--行为模型
MHS
Simgen
HDL
ELF
Script
图5.5行为仿真模型产生
仿真模型产生器
--结构模型
图5.6所示,Simgen要求MHS文件和相关的综合网表
文件作为输入。从这些网表文件中建立一系列的HDL文
件结构建模设计功能。Simgen可以为指定厂商的仿真器
产生一个编译脚本。如果指定,Simgen能用数据产生
HDL文件去初始化与存在设计中的BRAM相关联。这个
数据从存在在可执行和连接格式(ELF)文件中得到。
仿真模型产生器
--结构模型
NGC
MHS
MHS
Simgen
HDL
ELF
Script
图5.6 结构仿真模型产生
仿真模型产生器
--时序模型
图5.7所示,Simgen要求MHS文件和相关的实现网表
文件作为输入。从这些网表文件中建立一个的HDL文件对
设计建模和包含合适的时序信息的SDF文件。Simgen可以
为指定厂商的仿真器产生一个编译脚本。如果指定,
Simgen能用数据产生HDL文件去初始化与存在设计中的
BRAM相关联。这个数据从存在在可执行和连接格式
(ELF)文件中得到。
仿真模型产生器
--时序模型
NGD
MHS
MHS
Simgen
HDL
ELF
Script
图5.7 结构仿真模型产生
仿真模型产生器--输出文件
Simgen在输出目录的仿真目录下产生所有的仿真文件
和每个仿真模型的子目录。
Output_directory/simulation/sim_model
当Simgen成功执行后,仿真目录下包含下面的文件:
(1)peripheral_wapper.[vhd|v]:每个元件的模块化仿真文件。对
时序仿真不适用;
(2)system_name.[vhd|v]:设计的顶层HDL
(3)system_name.sdf:标准延迟格式sdf,包含合适的快和网络
延迟,这些信息来自布局布线过程,只用于时序仿真;
(4)system_name.[do|sh]:用于编译HDL文件和编译仿真模型
的脚本文件。
仿真模型产生器--输出文件
(5) test_harness_setup.[do|sh]:建立仿真器的助手脚本,并且
指定了在波形窗口或者列表窗口显示的信号。
(6)test_harness_wave.[do|sv]:koam;建立仿真波形显示助手
脚本;
(7)test_harness_list.do:建立仿真列表显示助手脚本;
(8)instance_wave.[do|sv]:为指定实例建立仿真波形显示的助
手脚本;
(9)instance_list.do:为指定实例建立列表显示的助手脚本;
仿真模型产生器
--存储器初始化
如果设计中包含存储器时,使用数据初始化相
应的仿真模型。使用-pe选项,可以指定与给定处
理器实例的ELF文件。通过选择合适的GNU编译
器,产生被编译的可执行文件。
库产生器
库产生器(Library Generator,Libgen)通常是第一
个工具用于配置库和设备驱动。Libgen使用设计人员建
立的MSS文件。MSS文件定义了与外设,标准I/O设备,
中断句柄例程和其它软件特性相关的驱动。Libgen使用
这些信息配置库和驱动。运行 libgen [options] filename命
令来运行库产生器。
库产生器—加载路径
-lp<library_path>
<library_name>
boards
drivers
pcores
bsp
图4.8 外设,驱动,库,OS的目录结构
sw_services
库产生器—加载路径
<Library Name>
drivers
<my driver>
src
.c files
.h files
Tcl
bsp
pcores
<my library>
<my os>
<my driver>
src
data
MDD
sw_services
.c files
.h files
data
MLD
Tcl
src
.c files
.h files
src
data
MLD
图5.9 驱动 OS和库的目录结构
Tcl
.c files
.h files
data
MDD
Tcl
库产生器—输出文件
Libgen在设计工程目录下产生目录和输出文件。对于
MSS文件的每个处理器实例,Libgen产生和处理器实例名
字相对应的目录。在每一个处理器实例目录下,Libgen产
生下面的目录和文件:include目录、lib目录、libsrc目
录、code目录。
库产生器—输出文件
1、include目录
Include目录包含驱动程序必须的C头文件。Libgen在这
个目录下创建xparameter.h文件。该文件定义了系统中外
设的基地址,#define是驱动,OS,库和用户程序以及函
数原型所需要的。微处理器驱动定义文件
(Microprocessor Driver Definition,MDD)为每一个驱动指
定了定义,这些定义用于需要驱动的外设。
2、lib目录
lib目录包含libc.a,libm.a和libxil.a库。Libxil库包含特
定处理器能够访问的驱动函数。
库产生器—输出文件
3、libsrc目录
Libsrc目录包含中间文件和MAKE文件,这些文件是
用来编译OS,库和驱动。该目录包含外设指定的驱动文
件,用于OS的BSP文件和库文件。这些文件从EDK和设计
的驱动,OS和库目录中复制。
4、code目录
该目录包含EDK可执行文件。Libgen在该目录中创建
xmdstub.elf文件(该文件用于MicroBlaze的板上调试)。
库产生器
—生成库和驱动
-基本观点
MHS和MSS文件定义了系统。对于系统中的每个处理
器,Libgen找到可寻址的外设清单。对于每一个处理器,
建立一个唯一的驱动和库的清单。Libgen为每个处理器完
成下面的过程:
库产生器—生成库和驱动
-基本观点
(1)建立在输出文件部分所定义的目录结构
(2)为驱动,OS和库拷贝必要的源文件到处理器实例指定的区
域:OUTPUT_DIR/ processor_instance_name/libsrc.
(3)为处理器可见的每一个驱动、OS和库调用设计规则检查
DRC程序(作为可选项在MDD/MLD文件中定义)。
(4)为处理器可见的每一个驱动、OS和库调用generate Tcl程
序。为每一个在include目录下的驱动,OS和库产生必要的
配置文件。
(5)为处理器可见的每一个驱动、OS和库调用post_generate
Tcl程序(如果在和MDD和MLD相关的Tcl文件中定义)
库产生器—生成库和驱动
-基本观点
(6)为处理器指定的OS,驱动和库运行make。在UNIX平
台下,使用gmake工具。在Windows环境下,make用于编
译。
(7)为处理器指定的OS,驱动和库调用execs_generate Tcl
程序(如果在和MDD和MLD相关的Tcl文件中定义)。
库产生器—生成库和驱动
MDD/MLD和Tcl
一个驱动或库需要两个数据文件关联:
1)数据定义文件(MDD或MLD文件):这个文件定义了用
于驱动、OS和库的可配置参数;
2)数据产生文件(Tcl):这个文件使用了在MSS文件中配置
的参数(这些参数用于驱动、OS或库)来产生数据。产
生的数据包括但不局限于产生头文件,C文件,运行
DRC,这些文件用于驱动、OS或库和产生可执行文件。
库产生器—生成库和驱动
MDD/MLD和Tcl
Tcl文件包括Libgen在执行不同级别时所调用的程序。
在Tcl中不同的程序包括:
1)DRC 在MDD/MLD中给出了DRC的名字
2)generate Libgen定义的程序,当文件被拷贝后被调用
3)post_generate Libgen定义的程序,当generate被调用后调用该
程序
4)execs_generate Libgen定义的程序,当BSP,库和驱动产生后
调用该程序;
库产生器—生成库和驱动
驱动
大多数外设都需要软件驱动。MSS文件包含一个驱动
块用于每一个外设实例。块包含对驱动的名字
(DRIVER_NAME参数)和版本(DRIVER_VER)参考。
这些参数没有默认值。驱动LEVEL与所要求的驱动功能
有关。驱动目录中为不同级的驱动包含源文件和头文
件,以及用于驱动的MAKE文件。
库产生器—生成库和驱动
驱动
驱动有一个MDD文件和/或Tcl文件关联。
MDD文件为驱动指定了所有可配置的参数。这是数
据定义文件。每一个MDD文件有一个相关的Tcl文件。
Tcl文件产生数据,其中包括头文件的产生、C文件的
产生,用于运行驱动的DRC,产生可执行文件。
库产生器—生成库和驱动
驱动
设计者可以编写自己的驱动。这些驱动必须在一个指
定的目录下
(YOUR_PROJECT /driver或library_name/drivers)。
DRIVER_NAME属性允许设计人员为驱动指定任何名
字(该名字也是驱动目录的名字)。源文件和MAKE文件
必须在\DRIVER_NAME\src目录下。MAKE应该有对象
(include和libs)。每个驱动应该包含MDD文件和Tcl文件
(在data子目录中)。参考已经存在的EDK驱动来了解驱
动的结构。
库产生器—生成库和驱动
库
MSS文件为每一个库包含一个库块。库块包含对库名
字(LIBRARY_NAME参数)和版本(LIBRARY_VER)参
考。这些参数没有默认值。库目录中包含用于库的C源文
件、头文件和MAKE文件。
MLD文件为每一个库指定了可配置的选项。每个
MLD文件都有Tcl文件与之关联。
库产生器—生成库和驱动
库
设计人员可以编写自己的库。这些必须在一个指定的
目录中(YOUR_PROJECT/sw _services或
library_name/sw_services)。LIBRARY_NAME属性允许
设计人员为驱动指定任何名字(该名字也是库目录的名
字)。源文件和MAKE文件必须在\LIBRARY_NAME\src
目录下。MAKE应该有对象(include和libs)。每个库应
该包含MLD文件和Tcl文件(在data子目录中)。参考已
经存在的EDK库来了解库的结构。
库产生器—生成库和驱动
OS Block
MSS文件包含为每个处理器实例包含一个OS块。OS
块包含对OS名字(OS_NAME参数)和版本(OS_VER)参
考。这些参数没有默认值。bsp目录中包含用于OS的C源
文件、头文件和MAKE文件。
MLD文件为每一个OS指定了可配置的选项。每个
MLD文件都有Tcl文件与之关联。
库产生器—生成库和驱动
OS Block
设计人员可以编写自己的OS。这些必须在一个指定的
目录中(YOUR_PROJECT/bsp或library_name/bsp)。
OS_NAME属性允许设计人员为OS指定任何名字(该名字
也是OS目录的名字)。源文件和MAKE文件必须在
\OS_NAME\src目录下。MAKE应该有对象(include和
libs)。每OS库应该包含MLD文件和Tcl文件(在data子目
录中)。参考已经存在的EDK的操作系统OS来了解OS的
结构。
平台规范工具
平台说明工具(Platform Specification Utility,
PsfUtility)工具能自动生成微处理器外设定义
(Microprocessor Peripheral Defination,MPD)文
件。MPD文件用于建立EDK相容的IP核。这个工具的
特性能通过XPS的创建和导入外设向导(Create and
Import Peripheral Wizard)提供。
平台规范工具
设计者使用psfUtility从IP核的VHDL规范来建
立MPD
规范。建立核和通过EDK提供的步骤为:
1)用VHDL或Verilog语言编码,对所有的总线信号
(时钟信号、复位信号和中断信号)使用严格的命名规范。
2)建立一个XST工程文件或者PAO文件,列出实现IP
的所有的HDL源文件。
3)通过提供XST工程文件或PAO文件使用PsfUtility工具。
FLASH存储器编程
-flash编程
典型的,设计者可以对flash进行下面进行编程:
– 可执行/可引导的应用程序的映像文件
– FPGA的硬件比特流文件
– 文件系统的映像,数据文件,例如简单数据和算法的表格
FLASH存储器编程
-flash编程
第一种情况最普遍,当处理器离开复位状态时,
开始执行保存在处理器复位位置指定的BRAM内的代
码。
典型的,BRAM非常小以至于不能提供整个设计
的软件应用程序的映像。
因此,设计人员可以将软件应用程序的映像保存
在flash中。设计一个可以装在BRAM内的小的引导启动
代码,离开复位后,从flash中读取软件应用程序的映
像文件,然后将其复制复制到外部的存储器中,然后
将控制传送到设计的软件应用程序中。
FLASH存储器编程
-flash编程
设计人员通过工程所建立的软件应用程序是可执行
的ELF格式。通常并不存储和引导ELF映像文件本身,
这是因为启动引导一个ELF映像文件会增加启动引导的
复杂度。取而代之的是,ELF的映像文件被转化成一个
通用的引导启动映像格式,例如:SREC(Motorola-S记
录格式)或IHEX,这样启动引导就变得简单,代码长度
也减少了。
FLASH存储器编程
-支持Flash硬件
FLASH存储器编程对话框允许设计人员对板上的
外部CFI(Common Flash Interface,CFI)接口兼容的并行
存储器进行编程,方法是通过外部存储器(Externel
Memory Controller, EMC)IP核连接。编程方案被设计
成是通用的,并且面向不同Flash硬件和布局。
FLASH存储器编程
-支持Flash硬件
通过与处理器连接的调试器来实现编程。XPS
或者SDK在目标处理器上下载和执行小的系统内
Flash编程存根(stub)。主机Tcl脚本使用命令驱动
系统内Flash编程存根(stub)来完成对Flash的编
程。对话框不处理或理解被编程的映像文件,只是
将其编程到flash存储器上。设计的软件应用和硬件
设置必须推断出编程所期望的文件内容。表4.5给出
了所支持的Flash的配置。表5.6给出了CFI定义的命
令集。
FLASH存储器编程
-支持Flash硬件
ⅹ8的可用设备产生8比特数据总线
ⅹ16/ⅹ8的可用设备工作在8位模式下,产生8比特数据总线
ⅹ32/ⅹ8的可用设备工作在8位模式下,产生8比特数据总线
ⅹ16/ⅹ8的可用设备工作在16位模式下,产生16比特数据总线
Pairedⅹ8的可用设备产生16比特数据总线
Quadⅹ8的可用设备产生32比特数据总线
Pairⅹ16的可用设备产生32比特数据总线
ⅹ32/ⅹ8的可用设备工作在32位模式下,产生32比特数据总线
ⅹ32的可用设备产生32比特数据总线
FLASH存储器编程
-支持Flash硬件
CIF厂商ID
OEM提供商
接口名字
1
Intel/Sharp
Intel/Sharp扩展命令集
2
AMD/Fujitsu
AMD/Fujitsu标准命令集
3
Intel
Intel标准命令集
4
AMD/Fujitsu
AMD/Fujitsu扩展命令集
FLASH存储器编程
-支持Flash硬件
默认情况下,flashwriter程序只支持那些CFI设备,
即其扇区映射匹配存放在CFI表中的内容。一些flash厂
商知道在CFI中存放扇区映射,但是根据flash启动结构
有所不同。
当对flash进行编程时,假定满足下面条件:
(1)flash硬件假定在复位状态;
(2)所有的flash扇区都假定在非保护状态;
(3)flash编程存根不会解锁或者初始化flash。如果flash不
在准备状态或者非锁定状态时,将产生错误报告。
FLASH存储器编程
-编程的先决条件
在使用编程Flash存储器对话框时,必须满足下面先决
条件:
1)在合适的EDK工程中,打开对话框;对话框从当前打开的
EDK工程中推断和使用数据;
2)设计的硬件必须在flash和至少一个处理器之间通过
PLB/AXI EMC外设正确的连接;
3)设计人员必须确认通过JTAG和主机连接,使用工程
的比特流文件初始化FPGA,这是因为对话框通过下载和
执行flashwritter程序来工作。
FLASH存储器编程
-编程的先决条件
4)必须使用XMD调试选项对话框来指定当前设计的调试器的
信息。如果使用MicroBlaze处理器来编程flash存储器,处理
器必须将MDM和flash连接。如果XMD STUB软件插入的监
视器用于与处理器的调试连接,则不能执行flash编程操作。
5)在之前必须执行产生库和BSP的步骤,这是因为flashwritter使
用处理器的库。
6)Flashwritter必须有至少8KB的空间。Flashwritter本身会占用一
大部分的储存器。剩余的一大块区域用于缓冲来自主机的比
特流。因此,当分配给flashwritter的空间多余8KB时,将大大
提高flashwritter的速度,这对于大的映像文件的编程是非常重
要的。
FLASH存储器编程
-编程对话框
单击TOOLS->Program Flash Memory来打开编程Flash
存储器对话框。在对话框下给出下面的信息。
1、需要编程的文件
通过浏览文件和选择文件,或者给出文件的路径,来
选择需要编程到flash设备上的文件。
FLASH存储器编程
-编程对话框
2、自动转换文件
选择自动转换文件检验栏(check box),当文件要
编程到flash中时,必须转化和以映像文件的格式保存在
flash中。选择映像文件的格式,比如,SREC。只有当
编程的文件是ELF格式的时候,才可以使用自动转换文
件选项。
当创建启动装入(bootloader)代码时或者将ELF格
式的启动装入代码转换成普通的启动装入映像格式
(SREC)时,这个选项非常有用。
FLASH存储器编程
-编程对话框
3、处理器实例
选择通过EMC控制器和flash设备连接的处理器。这个
处理器将被用来执行flashwriter程序。
4、Flash存储器属性
1)实例名字
选择存储器控制器的实例名,该控制器用来和目标版上的flash
设备接口。
2)编程的偏移地址
选择编程flash的偏移地址,在该偏移地址下开始编程映像文
件。如果设计人员想在flash不同的区域编程不同的文件映像,
每次可以改变这个参数来选择在flash内不同的位置来编程文
件。
FLASH存储器编程
-编程对话框
5、便笺式(Scratch Pad)存储器属性
选择便笺式存储器控制器的实例名,该控制器用来和
目标版上的空闲的便笺式存储器连接,而该存储器用来存
储flashwritter。该存储器必须满足前面的大小要求。不要
和flash选择相同的存储器控制器。
6、创建Flash启动代码
选择Create Flash Bootloader检查栏来自动的为该配置
创建启动装入应用程序。
在SW Application Project域内,指定启动装入应用程
序的名字。使用自动产生的值来初始化启动装入应用程序
的名字,如果需要的话,设计人员可以改变这个值。
FLASH存储器编程
-编程对话框
7、编程存储器
单击Program Flash按钮开始flashwriter。对话框在XPS
控制台释放XMD。算法的剩余部分从控制台执行。
FLASH存储器编程
-定制Flash编程
上面所介绍的编程flash的配置可能不适合设计者的要
求,比如,硬件和前面的CFI命令集不兼容或者存储器大
小的限制。该部分简单的介绍flash编程的算法,设计人员
可以为特殊的配置进行定制。
当单击Program Flash按钮时,产生下面的事件序列:
1、flash_params.tcl文件被写入到etc/文件夹下。这包含用来描
述flash编程会话的参数,并且被Tcl文件使用。
FLASH存储器编程
-定制Flash编程
2、XPS使用在XMD上执行的Tcl脚本来发布XMD,比如:
xmd –tcl flashwriter.tcl
这个flashwriter主脚本来自安装程序。当运行Program
Flash按钮
时,如果运行自己的驱动脚本,需要在设计工程的根目录下存放
自
己的fashwriter.tcl脚本。XMD首先在该目录下查找该脚本,然后
才会
在其它目录下查找该脚本;
FLASH存储器编程
-定制Flash编程
3、flashwriter Tcl脚本从etc/flashwriter文件夹下拷贝flashwriter
应用程序源代码。在本地编译应用程序,在所选的便笺式存储器
的地址范围外执行程序。如果希望编译自己设计的flashwriter源代
码,需要修改在本地工程文件夹下的fashwriter.tcl脚本,使其编译自
己的flashwriter源代码。
FLASH存储器编程
-定制Flash编程
4、脚本下载flashwriter到处理器。通过存储器内的邮箱,脚本和
flashwriter程序通信。换句话说,根据在flashwriter地址空间的变量
写参数到存储器位置,并且执行flashwriter。
5、脚本在每个操作结束时,等待flashwriter调用一个回调函数,
通过在函数上设置断点,在回调函数时停止执行程序。一旦
flashwriter停止执行时,主机上的Tcl将处理结果,并且继续执行更
多要求的命令;
FLASH存储器编程
-定制Flash编程
6、当编程时,flashwriter只擦写那些需要保存映射文件的存储器
区域;
7、如果试图进行一次编程,Tcl下载整个映像文件到存储器中,
并且让flashwriter完成编程操作。如果在流模式下编程,它反复的操
作(stream)映像文件的每一块,并且让flashwriter以大块方式对
flash编程。它在flashwriter内的存储器缓冲区保存这些大块。
8、一旦编程完成,flashwriter Tcl发生退出命令到flashwriter,并
且终止XMD会话。
FLASH存储器编程
-定制Flash编程
下面给出用于定制流程的步骤示例:
1.从<edk_install>/data/xmd/flashwriter.tcl目录复制
flashwriter.tcl到EDK的工程文件下;
2.在EDK工程下建立sw_services目录(如果不存在)
3.复制<edk_install>/data/xmd/flashwriter目录到sw_services目
录;
4.编辑flashwriter.tcl文件的行
set flashwriter_src[file join $xilinx_edk “data” “xmd”
“flashwriter” “src”]
将其改为
set flashwriter_src[file join “.” “sw_services” “flashwriter”
“src”]
FLASH存储器编程
-定制Flash编程
5.每次使用Program Flash Memory对话框时,设计人员
复制到sw_services目录下的脚本和源代码就被使用一
次。
6.如果设计人员希望GUI不覆盖etc/flash_params.tcl文
件,设计人员可以在命令行运行命令:
xmd –tcl flashwriter.tcl
来使用设计者在etc/flash_params.tcl文件中填充的值;表
5.7给出了etc/flash_params.tcl文件中各种参数的列表。
FLASH存储器编程
-定制Flash编程
变量
功能
FLASH_FILE
该字符串包含了编程文件的全路径
FLASH_BASEADDR
Flash bank的基地址
FLASH_PROG_OFFS
ET
Flash bank的偏移地址,在该地址下进行编程
SCRATCH_BASEADD
R
在编程时,所使用的便笺存储器的基地址
SCRATCH_LEN
便笺存储器的字节大小
XMD_CONNECT
用于XMD和处理器连接的命令
PROC_INSTANCE
用于编程时的处理器实例名字
TARGET_TYPE
用于编程的处理器实例的类型:MicroBlaze或PowerPC405
FLASH_BOOT_CONF
IG
参考“处理Flash有冲突扇区”部分
EXTRA_COMPILER_
FLAGS
对于MicroBlaze处理器,指定任何一个编译器标志,用于打开所支持的硬件
特性。例如,如果使能硬件乘法器,则添加 –mno-xl-soft-mul。对于
PowerPC则不需要设置这个变量
FLASH存储器编程
-可操作的特点和方法
1.处理Xilinx平台Flash模式
Xilinx平台Flash初始化在同步模式。在执行设备操
作前,必须将其设置为异步模式。当使用Xilinx软件开
发工具时,能选中对话框将Xilinx平台Flash作为目标设
备。这个设置使得程序的内部解决方法在对其编程以
前,就将其设置为异步模式。
FLASH存储器编程
-可操作的特点和方法
2.处理Flash设备,0xF0作为读复位命令
CFI规范定义将0xFF/0xF0,作为读复位。Flash编程
软件使用0xFF作为默认的读复位命令。某些Flash要求
使用0xF0作为读复位命令,然而,Flash编程软件不能
自动确定这种情况。结果,可能导致一些问题。如果
出现这个问题,则修改文件cfi.c中的:
#define FRR_CMD 0xFF
为:
#define FRR_CMD 0xF0
FLASH存储器编程
-可操作的特点和方法
3、处理有冲突扇区的布局
正如前面所提到的那样,flash的厂商知道在CFI表中
保存不同的扇区映射,但是存在不同引导拓扑结构所产生
的不同的扇区映射方法。由于CFI的引导拓扑结构没有标
准化,因此flashwriter无法确定设计所使用的特定flash的
布局。
FLASH存储器编程
-可操作的特点和方法
如果使用的flash硬件的扇区布局不同于存放在表内
的扇区映射,设计人员必须订制flash编程流程。设计人
员必须确定所使用的flash是顶部启动还是底部启动设
备。在顶部启动的flash设备,最小的扇区是flash的最后
一个扇区;在底部启动的flash设备,最小的扇区是flash
的第一个扇区。
FLASH存储器编程
-可操作的特点和方法
一旦确定了flash的类型,必须象前面介绍的那样拷贝
文件来创建定制的编程流程:
(1)如果使用底部启动的flash,在你的etc/flash_params.tcl
文件中添加下面一行:
set FLASH_BOOT_CONFIG BOTTOM_BOOT_FLASH
(2)如果使用顶部启动的flash,在你的etc/flash_params.tcl
文件中添加下面一行:
set FLASH_BOOT_CONFIG TOP_BOOT_FLASH
然后下一步从命令行运行下面的命令:
xmd –tcl flashwriter.tcl
内部的,这些变量引起flashwriter将根据引导拓扑结构
重新安排扇区映射。
FLASH存储器编程
-可操作的特点和方法
4、AMD/Fujitsu命令集的数据查询算法
在擦除和编程操作的过程中,支持AMD/Fujitsu命令集
的flash使用DQ7数据查询算法。一些flash使用配置寄存器
来控制DQ7位的数据查询,要求在擦除操作时,DQ7输出
0,而操作结束时输出1。相似的,在编程的时候,DQ7输
出反转(invert)数据,在编程结束时,DQ7输出真实的
数据。当使用Program Flash Memory对话框时,如果使用
的flash硬件有不同的配置,编程会失败(使设计人员赶到
奇怪)。
参考使用的flash的数据手册,如何去复位配置,使DQ7
在前面的描述方式内。一些flash设备提供这种配置属性:
AT49BV322A(T),AT49BV162A(T)和AT49BV163A
(T)。
GNU编译器工具
EDK工具包括GNU编译器(GCC)工具,用于
PowerPC和MicroBlaze处理器。
GCC工具支持C语言和C++语言。MicroBlaze的GNU工
具包括mb-gcc和mb-g++编译器,mb-as汇编器和mb-ld加载
器/连接器,PowerPC的GNU工具包括powerpc-eabi-gcc和
powerpc-eabi-g++编译器,powerpc-eabi-as汇编器和
powerpc-eabi-ld连接器。
工具链也包括C,Math,GCC和C++标准库。
GCC工具基于开放源码GCC3.4构建。
GNU编译器工具
-编译器框架
编译器也使用普通的二进制工具binutils,比如一个汇
编器,连接器和对象转储。MicroBlaze编译器工具使用基
于GNU2.10.1的二进制工具binutils,PowerPC编译器工具
使用基于GNU2.15的二进制工具binutils。
GNU编译器工具
-编译器框架
输入c/c++文件
cpp0
cc1
cc1plus
mb-as
库
mb_ld
输出ELF文件
图5.10 GNU工具流程
GNU编译器工具
-编译器框架
GNU编译器调用下面的可执行文件:
1)预编译器(cpp0)-这是编译器的首次调用。cpp0
所有的宏,这些宏在源文件和头文件中定义
2)机器和语言指定编译器-这个编译器是基于前面预
处理过输出的代码。语言指定的编译器包括下面:
– C编译器(cc1)-编译器负责大多数的输入C代码的优
化,并且产生汇编代码;
– C++编译器(cc1plus)-编译器负责大多数的输入C++
代码的优化,并且产生汇编代码;
GNU编译器工具
-编译器框架
3)汇编器(mb-as为MicroBlaze,powerpc-eabi-as为
PowerPC)-汇编代码是汇编语言的助记符。汇编器将这
些助记符转换为机器语言。汇编器也解析由编译器产生的
标识。汇编器建立一个能传送给连接器的目标文件
4)连接器(mb-ld为MicroBlaze,powerpc-eabi-ld为
PowerPC)-连接器连接所有由汇编器产生的目标文件。如
果在命令行提供库,通过连接,连接器解析来自汇编器的
一些函数代码中未定义的参考类型。
GNU编译器编译器使用
compiler_Name options files
compiler_Name为编译器的名字,powerpc-eabi
gcc(PowerPC)或mb-gcc(MicroBlaze)用于编译C语言文
件;powerpc-eabi-g++(PowerPC)或mb-g++(MicroBlaze)用
于编译C语言文件;
编译器允许下面的文件类型作为输入:C源文件、
C++源文件、汇编文件、目标文件和连接脚本文件。
GNU编译器编译器使用
编译器输出下面的文件:
1)ELF文件(默认输出 Solar系统为a.out,Windows系
统为a.exe);
2)汇编文件(当选择–save-temps或者-S选项);
3)目标文件(当选择–save-temps或者-c选项);
4)预处理输出.i或.ii文件(当选择–save-temps选项)。
表4.8给出了文件类型和扩展名。
表4.9给出了powerpc-eabi-gcc和mb-gcc编译器所需要的
库。
GNU编译器编译器使用
扩展
文件扩展名
.c
C文件
.C
C++文件
.cxx
C++文件
.cpp
C++文件
.c++
C++文件
.cc
C++文件
.S
汇编文件,但是可能有预处理器指令
.s
汇编文件,但是没有预处理器指令
GNU编译器编译器使用
库
描述
libxil.a
包含为EDK工具开发的驱动、软件服务(XilNet&XilMFS)和初始化文
件
libc.a
标准C库,包含函数,例如strcmp和strlen
libgcc.a
GCC低层次库,包含仿真库例程,用于浮点和64位的算术
libm.a
数学库,包含函数,例如:cos、sin
libsupc++.a
C++支持库,用于异常处理的例程,RTTI和其它
libstdc.a
C++标准平台库。包含标准语言类,例如那些用于I/O流,I/O文件,串操
作和其它
GNU编译器编译器使用(语言术语)
GCC编译器识别C和C++语言,并且产生相应的代
码。通过GCC规约,可以对一个源文件相同的使用gcc或
者g++编译器。设计者使用的编译器和文件的扩展名决定
了输入和输出文件所使用的语言。
当使用gcc编译器,编程语言通过文件的扩展名确
定。如果扩展名是C++源文件,语言就设为C++。这就是
说,如果对包含在CC文件中的C代码进行编译,即使使用
了gcc编译器,它也会自动地拆解函数名(mangle function
name)。
GNU编译器编译器使用(语言术语)
gcc和g++编译器最基本的不同在于,g++自动地将语言
设置为C++(而无需关注文件的扩展名),如果连接的话,自
动加入C++支持库。这意味着,即使使用g++在.c文件中编
译C代码,那么也将拆解名字(mangle name)。
名字拆解对C++是一个独特的概念,其它语言支持符号
的过载。一个函数过载(function overload),表示相同的
函数(不同的传递参数)能执行不同的功能,并且能有不
同的返回值。为了支持函数过载,C++编译器对函数类型
进行编码来调用函数名,避免使用相同的名字对函数进行
多次定义。
GNU编译器编译器使用(语言术语)
如果采用混合编译模式(一些源文件包含C代码,而另
一些源文件包含C++代码,即使用gcc编译一些文件,而使
用g++编译另一些文件),要注意名字拆解。为了避免C
符号的名字拆解,在符号声明时,使用下面的构造:
#ifdef _cplusplus
Extern “C”{
£end if
int foo();
int morefoo();
#ifdef _cplusplus
}
£end if
GNU编译器编译器使用(语言术语)
使这些声明在头文件和其它源文件中可以使用。这就
使得当编译这些符号的定义或参考时,编译编译器使用C
语言。
当用其中一种参数进行编译时,使用-x<lang>选项可
以强制使用的语言类型。
当使用gcc编译器时,libstdc++.a和libsupc++.a不被
自动连接。当编译C++程序时,使用编译器的g++参数使
得所支持的库被自动地连接。对gcc命令添加-lstdc++和lsupc++,也是可以的选择。
GNU编译器编译器使用(编译器选项 )
选项
功能
-E
只预处理,不编译,汇编和连接。在标准输出设备上显示预处理过的输
出
-S
只编译,不汇编和连接。产生.s文件
-c
只编译和汇编,不连接。产生.o文件
-g
添加调试信息,该信息由GNU调试器mb-gdb或powerpc-eabi-gdb使用
(当输入为C/C++源文件时可用)
-gstabs
对编译的汇编文件添加调试信息,将该选项直接传递到GNU汇编器中,
或者是通过-Wa选项到编译器
-Wa,option
传递逗号分割的选项到汇编器
-Wp,option
传递逗号分割的选项到预处理器
-Wl,option
传递逗号分割的选择到链接器
-B directory
添加目录到C运行时间库查找路径
-L directory
添加目录到库查找路径
-I directory
添加库到头文件查找路径
GNU编译器编译器使用(编译器选项 )
-l library
为为定义的符号查找库,编译器对用户提供的库名字自动添加lib前缀。编译器
对所提供的选项的顺序比较敏感,选项应该在源文件后给出。如果设计者创建
了一个自己的库叫libprojext.a,可以使用下面的命令将库中的函数包含近来:
Compiler Source_Files –L${LIBDIR} –l projext
-v
详细显示被编译器调用的程序
-o filename
设置输出的文件名
-save-temps
--help
-On
保存在每一步通过时产生的中间文件
1C语言的预处理输出文件:input_file_name.i或C++语言的预处理输出文件:
i nput_file_name.ii
2以汇编格式存在的cc1的编译输出:input_file_name.s
3以ELF格式存在的汇编器的输出:input_file_name.s
显示选项的列表
指定优化级别,n=0,1,2,3,S;
0-无优化;
1-中级优化;
2-充分优化;
3-充分优化,试图内联小的子程序;
S-优化代码长度;
当优化级>0时,引起代码的重新编排,当调试代码时,不要使用优化级别
GNU编译器编译器使用(编译器选项 )
编译器mb-gcc和powerpc-eabi-gcc,为库和头文件查找
某个路径。
GNU编译器编译器使用(连接器选项)
1)-defsym_STACK_SIZE=value
使用连接器选项可以修改堆栈存储空间大小,
STACK-SIZE变量是分配给堆栈的总的空间。默认值为
100个字,400个字节。如果需要更大的空间可以修改这个
参数。
在一些情况下,程序可能需要更大的堆栈。如果程序
要求堆栈的大小比可用堆栈多的话,程序试图写道其它的
不正确的程序空间内,这样将导致不正确的代码执行。
GNU编译器编译器使用(连接器选项)
2)-defsym_HEAP_SIZE=value
通过_HEAP_SIZE变量,可以控制为堆分配的存储空
间。默认值为0。动态的存储器分配例程使用堆。如果程
序通过这种方式使用堆,则必须为_HEAP_SIZE提供合适
的值。
GNU编译器编译器使用(存储器设计)
1)保留存储器
保留存储器由硬件和软件程序环境定义的特权使用。
典型的,包含中断向量位置和操作系统级的例程。表4.11
给出了处理器硬件所定义的为MicroBlaze和PowerPC处理
器定义的保留存储器的位置。
GNU编译器编译器使用(存储器设计)
处理器类型
保留存储器
保留目的
默认的TEXT开始
地址
MicroBlaze
0x0-0x4F
复位,中断,异常和
其它保留的向量位
置
0x50
PowerPC
0xFFFFFFFC0xFFFFFFFF
复位向量位置
0xFFFF0000
GNU编译器编译器使用(存储器设计)
2)I/O存储器
I/O存储器,是指程序通过处理器总线与存储器映射
的外设进行通信的地址。这些定义的地址作为硬件平台
规范的一部分。
GNU编译器编译器使用(存储器设计)
3)用户和程序存储器
用户和程序存储器是指,那些编译后需要运行可执行
文件的存储区域。根据规则,这部分区域用来存储指令,
只读数据,读-写数据,程序堆栈和程序堆。这些部分可
以存放在系统中的任何可寻址的存储器中。默认情况下,
编译器产生代码和数据地址从表4.11所列的地方开始,并
且占用连续的存储空间。这是程序最常的设计方式。通过
定义下面的符号来改变程序的开始地址:
 _TEXT_START_ADDR(为MicroBlaze)
 _START_ADDR(为PowerPC)。
GNU编译器编译器使用(存储器设计)
在一些特殊情况下,需要将ELF文件分别分配在不同
的存储器空间,可以使用连接器命令语言(连接器脚
本)。
下面给出了可能需要改变可执行文件的存储器映射:
1)将大的代码段分配在多个小的存储器内
2)将经常执行的部分重映射到快速的存储器内
3)将只读部分映射到非易失性flash存储器内
GNU编译器编译器使用(目标文件)
通过从目标文件(.o)使用连接器将输入部分连接到
一起,这样就建立了可执行文件。
编译器在默认状态下,在定义的区域部分建立代码。
每部分给予相关的意义和目的分配给一个名字。图4.12给
出了目标文件或可执行文件各部分的布局。
GNU编译器编译器使用(目标文件)
.text
代码部分
.rodata 只读数据部分
.sdata2 小的只读数据部分
.data
读-写数据部分
.sdata
小的读-写数据部分
.sbss
小的未初始化数据部分
.bss
未初始化数据部分
图5.11 目标文件或可执行文件分布
GNU编译器编译器使用(目标文件)
1..text 这部分为目标文件包含可执行程序的指令。这
部分有x (可执行),r(只读)和i(初始化)标志。这
部分被分配到一个初始化的只读存储器ROM内,该ROM
是可以通过处理器的指令总线寻址。
2..rodata 这部分包含只读数据。这部分有r(只读)
和i(初始化)标志。这部分被分配到一个初始化的只读
存储器ROM内,该ROM是可以通过处理器的指令总线寻
址。
GNU编译器编译器使用(目标文件)
3..sdata2 这部分和.rodata部分相似。这部分包含的小
的只读数据小于8个字节。这部分由只读小数据锚(就是
一个已经被标记过的地方,在这个地方能被找到)访问。
这样确保对该区域使用单指令访问。通过使用-G选项来改
变该区域的大小。这部分有r(只读)和i(初始化)标志。
4..data 该部分包含读-写数据。这部分有w(读-写)
和i(初始化)标志。这部分必须被映射到RAM中,而不
能映射到ROM。
GNU编译器编译器使用(目标文件)
5..sdata 该部分包含了小的读-写数据,其大小小于指
定的尺寸。默认为8字节。选择 –G选项可以修改数据大小
而进入这个区域。这部分由读-写小数据引擎访问。这样
确保对该区域使用单指令访问。这部分有w(读-写)和i
(初始化)标志。该部分必须映射到初始化RAM。
6..sbss 该部分包含小的未初始化的数据,其大小小于
指定的尺寸。默认为8字节。选择 –G选项可以修改数据大
小而进入这个区域。这部分有w(读-写)标志。该部分必
须映射到RAM。
GNU编译器编译器使用(目标文件)
7..bss该部分包含未初始化的数据,程序堆栈和堆也
被分配到这个区域。这部分有w(读-写)标志。该部分必
须映射到RAM。
8、.init 该部分包含语言初始化代码。这部分和.text有
相同的标志,该部分必须映射到ROM
9..finit 该部分包含语言清除代码。这部分和.text有相
同的标志,该部分必须映射到ROM
GNU编译器编译器使用(目标文件)
10..ctors 该部分包含一列函数,该函数在程序启动时
被调用。该部分和.data有相同的标志,该部分必须映射到
RAM
11..dtors 该部分包含一列函数,该函数在程序结束时
被调用。该部分和.data有相同的标志,该部分必须映射到
RAM
12..got2/.got 该部分包含到程序数据的指针。该部分
和.data有相同的标志,该部分必须映射到RAM
13..eh_frame 该部分包含帧展开信息,这些信息用来
处理异常。该部分和.rodata有相同的标志,该部分必须映
射到ROM
GNU编译器编译器使用(连接脚本 )
连接工具使用连接脚本指定的命令来确定在存储器不
同块的程序。它描述了所有输入目标文件到可执行文件的
输出部分的映射。输出部分被映射到系统的存储器。
如果不需要改变默认的连续分配程序内容到存储器的
设置,那么不需要连接脚本。连接器提供了默认的连接脚
本,知道如何连续的分配程序。设计者可以通过定义连接
符号:_TEXT_START_ADDR(为MicroBlaze)和
_START_ADDR(为PowerPC)来选择只修改程序的开始
地址。比如:
GNU编译器编译器使用(连接脚本 )
mb-gcc <input file and flags> -Wl, -defsym –Wl,
_TEXT_START_ADDR=0x100
powerpc-eabi-gcc <input file and flags> -Wl, –defsym –
Wl,_TEXT_START_ADDR=0x2000
mb-ld <.o file> -defsym _TEXT_START_ADDR=0x100
GNU编译器编译器使用(连接脚本 )
• 选择默认脚本将使用来自下面目录:
$XILINX_EDK/gnu/<processor_name>
/<platform>
/<processor_name>/lib/ldscri的连接器:
•
•
•
•
•
•
•
elf32<procname.x> 当没有使用下面的情况时,默认使用
elf32<procname.xn> 当使用-n选项调用连接器
elf32<procname.xbn> 当使用-N选项调用连接器
elf32<procname.xbn> 当使用-N选项调用连接器
elf32<procname.xr> 当使用-r选项调用连接器
elf32<procname.xu> 当使用-Ur选项调用连接器
elf32<procname.xbn> 当使用-n选项调用连接器
GNU编译器编译器使用(连接脚本 )
在gcc命令行使用连接脚本。为编译器使用命令行
选项-Wl,-T,-Wl,<script>,正如下面所描述的那样:
compiler –Wl,-T –Wl, linker_script <Other Options
and Input Files>
GNU编译器编译器使用(连接脚本 )
如果执行连接器,用下面的命令包含脚本:
linker –T linker_script <Other Options and Input
Files>
通过这个命令告诉GCC使用设计者自己的脚本,而不
使用内建的默认的连接脚本。从XPS可以产生程序的连
接脚本。在XPS中,选择Tools->Generate Linker Script。
这样就打开连接脚本产生器工具。存储器映射也由该工
具完成。堆栈和堆的尺寸在存储器映射时,设置完成。
一旦产生了连接器脚本,当应用程序在XPS中编译时,
自动作为GCC的一个输入。连接脚本定义了布局和输出
可执行文件的每一部分的开始地址。
GNU编译器MicroBlaze编译器及选项
MicroBlaze的GNU编译器有自己独特的选项和特点。
当使用MicroBlaze编译器时,预处理器自动提供
_MICROBLAZE_定义。可以在任何有条件代码的地方
使用这个定义。表4.12给出了MicroBlaze指定的选项。
GNU编译器MicroBlaze编译器及选项
选项
-xl-modeexecutable
-xl-mode-xmdstub
-xl-modebootstrap
解释说明
使用该选项为MicroBlaze去编译常规嵌入式应用程序,这是编译的默认设置
使用该选项编译应用程序,该程序在软件插入行为(即XMDSTUB)下进行调
试。当使用XMDSTUB下载到MicroBlaze时,使用该选项。在这样的程序
下,地址0x0-0x800的地方被XMDSTUB使用。使用这个选项的作用:
1设计的程序由0x800开始。
2ctr1.o用作初始化文件。当程序执行完后,该文件将控制返回给XMDSTUB
注意:当硬件调试打开或者非调试时,不要使用这种模式。
使用该选项编译应用程序,该程序能使用引导启动程序来引导启动。使用该
选项编译的应用程序缺少复位向量。典型的引导启动驻留在非易失性存储器
映射到处理器的复位向量。
如果普通的可执行程序使用这个引导启动代码加载,应用程序的复位向量
将覆盖引导启动代码的复位向量。在此情景中,在处理器复位时,启动引导代
码不会首先执行重载该应用程序和做其它初始化工作。
为了避免这种情况,设计人员使用这个编译器标志来编译启动引导应用程序。
在处理器复位时,控制就能到达启动引导代码而不是应用程序。这种模式
使用crt2.o作为启动文件
GNU编译器MicroBlaze编译器及选项
-xl-modenovectors
使用该选项编译应用程序,该程序不需要使用任何的MicroBlaze的向量。
这种模式使用crt3.o作为启动文件。
-mxl-gp-opt
使用小数据区域锚,为性能和尺寸进行优化
如果程序包含地址的高16位非0,则加载/存储操作需要2个指令,
MicroBlaze ABI提供了两个全局小数据区域(最大64KB),在这个区域的
数据可以使用小数据区域锚和16位立即数访问,只需要一个指令用于加载/
存取操
作。
-mxl-soft-mul
为所有的乘法操作使用软件例程(_mulsi3)。对没有硬件乘法器的设备使
用这个选项。这对mb-gcc编译器是默认选项
-mxl-xl-soft-mul
使用硬件乘法器。编译器产生mul指令
-mxl-soft-div
为所有的除法操作使用软件例程(_divsi3,_udivsi3)。对没有硬件除法
器
的设备使用这个选项。这对mb-gcc编译器是默认选项
-mxl-xl-soft-div
-mxl-stack-check
使用硬件除法器。编译器产生div指令
产生在运行时的代码用于检查堆栈溢出。当溢出产生时,程序跳到子例
程_stack_overflow_exit。该子程序将变量_stack_overflow_error设置为1
GNU编译器MicroBlaze编译器及选项
-mxl-barrel-shift
使用硬件的桶形移位寄存器。编译器产生硬件桶形移位指令
-mxl-patterncompare
产生代码时,使用模式比较(pattern compare)指令。当MicroBlaze硬件有
模式比较选项使能时,使用该选项。使用模式比较,可以加速程序中的布尔操
作。模式比较操作,也允许对字长的数据进行操作,例如strcpy,strlen,strcmp
等。
-mhard-float
产生硬件浮点指令。当MicroBlaze硬件的FPU使能时,使用该选项。该选项
使能在编译器中使用fadd,frsub,fmul,fdiv指令。也使用fcmp.p指令,p为谓
词条件,例如le,ge,lt,gt,eq,ne。当使能FPU时,这些指令由MicroBlaze
译码和执行。
-mno-clearbss
这个选项用来编译程序,该程序用来仿真。根据C语言标准,未初始化全局变
量被分配在.bss区域和当程序开始执行时,保证其为0。典型的是通过在程序开
始执行时,C启动代码运行一个循环来填充.bss区域。此外,优化编译器能为C
代码内全局变量分配0到.bss区域。
在仿真环境中,这两种语言特征被多余的开销(不需要使用)。一些仿真器自
动的将整个存储器清0。甚至在普通环境下,写C代码而不依靠全局变量为0来
开始程序。这样,可以使C启动文件不需要用0初始化.bss区域。
-msmall-divides
当没有硬件除法器时,为小的除法产生优化代码。对于有符号的整数除法,
当分子和分母在0-15之间时,该选项提供快速的查找表除法。当硬件除法器
使能时,该选项不起作用。在内部使编译器不分配被初始化为0的全局变量到
.bss而将其分配在.data区域。
GNU编译器MicroBlaze汇编器
用于Xilinx的MicroBlaze软核处理器的mb-as汇编
器支持标准的GNU编译器的可选项。也支持同样的标
准GNU汇编器支持的汇编指令集。mb-as支持所有的
MicroBlaze机器指令集提供的操作码(除了imm指
令)。当使用大的立即数时,mb-as汇编器产生imm指
令。汇编语言编程器并不要求用imm指令书写代码。
GNU编译器MicroBlaze汇编器
mb-as汇编器要求MicroBlaze内使用立即数的指令必须
指定为一个常数或标识。如果指令要求PC相关的操作
数,mb-as汇编器计算它,如果需要的话,包含一个imm
指令。比如,如果相等,分支立即指令要求PC相关的操
作数。汇编编程器应该这样使用该指令:
beqi r3,mytargetlabel
其中mytargetlabel是目标指令的标号。mb-as汇编器计算
指令立即数的值作为mytargetlabel。如果立即数的值大于
16位,mb-汇编器自动插入一个imm指令。如果
mytargerlabel的值在编译时不知道,mb-as汇编器总是插入
一个imm指令。使用连接器的relax选项来去除任何不需要
的imm指令。
GNU编译器MicroBlaze汇编器
在支持MicroBlaze标准指令集时,mb-as汇编器
还支持一些伪代码来减轻汇编编程的任务。表4.13
给出了所支持的伪代码。
GNU编译器MicroBlaze汇编器
伪操作码
解释说明
nop
不做任何操作,用指令or R0,R0,R0代替
La Rd,Ra,Imm
被指令addik Rd,Ra,imm;=Rd=Ra+Imm代替
not Rd,Ra
被指令xori Rd,Ra,-1代替
Neg Rd,Ra
被指令rsub Rd,Ra,R0代替
sub Rd,Ra,Rb
被指令rsub Rd,Rb,Ra代替
GNU编译器MicroBlaze连接器
1、-defsym_TEXT_START_ADDR=value
默认情况下,输出代码的代码部分从地址0x28的地方
开始执行(0x800在XMDStub模式)。能使用该选项来改变
执行地址。如果给mb-gcc提供这个的话,输出代码的代码
部分可以从给定的value开始执行。如果使用默认的开始地
址,则不需要使用这个选项
这是一个连接器的选项,当设计者独立调用连接器时
应该使用这个选项。如果连接器作为mb-gcc的一部分调
用,设计者必须使用下面的选项:
-Wl,-defsym –Wl,_TEXT_START_ADDR=value
GNU编译器MicroBlaze连接器
2、-relax
这是连接器的一个选项,用来去除所有不需要的由
汇编器产生的imm指令。汇编器为每一条在汇编时不能
计算立即数的指令生成一条imm指令。这些指令的大部
分并不需要imm指令。当设计者独立调用连接器时应该
使用这个选项。如果连接器作为mb-gcc的一部分调用,
自动提供给连接器。
GNU编译器MicroBlaze连接器
3、-N
将代码和数据区域设置成可读的和可写的。并
不采用页面对齐数据段。该选项只针对MicroBlaze
处理器。顶层的GCC编译器自动包含这个选项,同
时调用连接器,但如果设计者不使用GCC调用连接
器,则应该使用该选项。
启动文件
当生成一个可执行文件时,编译器在最后的连接命令
中包含一个预编译的启动和结束文件。启动文件在开始执
行代码前,设置语言和平台环境。启动文件执行下面的行
为:
(1)设置所需要的复位,中断和异常向量
(2)设置堆栈指针,小数据锚和其它寄存器
(3)将BSS存储器清0
(4)调用语言初始化函数,比如C++构造器
(5)初始化硬件子系统,比如,如果程序被统计分析(Profile),
则初始化统计分析定时器
(6)为主程序设置参数,并调用它
启动文件
类似的,结束文件包含在应用程序执行完后必须执
行的程序。下面是结束文件执行的行为:
(1)调用语言清除程序,比如C++析构函数
(2)退出硬件子系统。比如,如果程序被统计分析,清除统
计分析子系统
初始化文件
这些初始化文件在各种应用模式中使用,这些信息为
高级用户提供改变或理解对于应用程序的启动代码。比如
MicroBlaze,这里存在两个重要的C运行初始化阶段。第
一个阶段用来设置向量,然后调用第二阶段初始化。它也
基于不同的应用模式来提供退出存根。
这些初始化文件在各种应用模式中使用,这些信息为
高级用户提供改变或理解对于应用程序的启动代码。比如
MicroBlaze,这里存在两个重要的C运行初始化阶段。第
一个阶段用来设置向量,然后调用第二阶段初始化。它也
基于不同的应用模式来提供退出存根。
初始化文件
第一级初始化文件
1)crt0.o
这个初始化文件用于那些运行在独立模式下的程序,
这些程序不使用启动引导或调试存根(debug stub),比
如:xmdstub。CRT文件填充(populate)复位,中断,异
常和硬件异常向量,并且调用第二级启动例程_crtinit。从
_crtinit返回,在退出标号执行无限循环来结束程序。
初始化文件
第一级初始化文件
2)crt1.o
当应用程序在软件插入行为下进行调试时,使用该初
始化文件。它填充所有的向量(除了断点和复位向量),
并且将控制传递到第二级_crtinit启动例程。从_crtinit返回
将控制返回XMDStub,用于通知调试器程序已经完成。
初始化文件
第一级初始化文件
3)crt2.0
当可执行程序用启动引导代码加载时,使用该初始化
文件。它填充所有的向量(除了复位向量),并将控制传
递到第2级_crtinit启动例程,从_crtinit返回,通过在退出
标记处执行无限循环。由于没有填充复位向量,在处理器
复位时,控制被传送到启动引导代码,用于重新加载和重
新开始程序。
初始化文件
第一级初始化文件
4)crt3.0
当可执行程序没有使用任何向量,并希望减少程序代
码时,使用该初始化文件。它只填充复位向量,并将控制
传递到第2级_crtint启动例程,并且从_crtinit返回,,通过
在退出标记处执行无限循环。由于没有填充其它向量,
GNU连接机制并不添加任何中断和异常处理相关的例程,
这样可以节约代码空间。
初始化文件
第二级初始化文件
1)crtinit.o
这是默认的第二级C启动文件。该启动文件执行
下面的步骤:
1.将.bss清除为0
2.调用_program_init
3.调用“构造器”函数(_init)
4.为main函数设置传递参数,并调用该函数
5.调用“析构器”函数(_fini)
6.调用_program_clean并且返回
初始化文件
第二级初始化文件
2)pgcrtinit.o
该文件在程序统计分析时使用。这个开始文件完
成下面的步骤:
1.将.bss区域清除为0
2.调用_program_init
3.调用_profile_init来初始化统计分析库
4.调用“构造器”函数(_init)
5.为main函数设置传递参数,并调用该函数
6.调用“析构器”函数(_fini)
7.调用_program_clean,清除统计分析库
8.调用_program_clean,并且返回
初始化文件
第二级初始化文件
3)sim-crtinit.o
当编译器使用_mno-clearbss选项时,使用该启动文
件。这个开始文件完成下面的步骤:
1.调用_program_init
2.调用“构造器”函数(_init)
3.为main函数设置传递参数,并调用该函数
4.调用“析构器”函数(_fini)
5.调用_program_clean并且返回
初始化文件
第二级初始化文件
4)sim-pgcrtinit.o
在分析统计时,当编译器使用-mno-clearbss选项,使用
该启动文件。这个开始文件完成下面的步骤:
1.调用_program_init
2.调用_profile_init来初始化统计分析库(profiling library)
3.调用“构造器”函数(_init)
4.为main函数设置传递参数,并调用该函数
5.调用“析构器”函数(_fini)
6.调用_program_clean,清除统计分析库
7.调用_program_clean,并且返回
初始化文件
第二级初始化文件
5)其它文件
编译器也使用某种标准开始和结束文件为C++语言提供
支持。包括crti.o,crtbegin.o,crtend.o和crtn.o。这些文件
是标准的编译器文件,这些文件为.init,.finit,ctors
和.dtors区域提供内容。
修改启动文件
初始化文件分配给预编译器和源代码中。预编译器
目标文件在编译器库目录下可以找到。用于
MicroBlazeGNU编译器的初始化文件的源可以在
<XILINX_EDK>/sw/lib/microblaze/
Src目录下找到,其中<XILINX_EDK>为EDK的安装位置。
修改启动文件
为了实现定制的启动文件要求,设计者可以从源文件
区域得到这些文件,并且通过包含这些文件把它作为应用
程序的一部分。可以选择的方法是,设计者可以汇编文件
为.o文件,并且将其放在公共区域。在调用mb-gcc时使用B directory-name命令行选项,可以指向新创建的目标文
件,而不是标准文件。在最后编译行使用-nostartfiles,防
止使用默认的启动文件。
为C程序减少启动代码尺寸
如果对C程序代码的大小有严格的要求,需要去除所有
额外的源代码的开销。这部分描述了如何减少调用C++构
造器或析构器代码的额外开销。通过这种修改,可以减少
大约220字节的代码空间。
1.遵守前面部分所描述的为建立来自安装区域的定
制拷贝启动文件的规定。
2.修改 pg-crtinit.s,并且删除下面的行:
brlid r15,__init /调用语言初始化函数
nop
brlid r15,__fini /调用语言清除函数
nop
为C程序减少启动代码尺寸
3.编译这些文件到.o文件中,并将其放在所选择的目
录中,或者在应用程序中包含这些文件。
4.编译器添加-nostartfile选项。如果需要在特定的文
件夹下汇编文件,则添加 –B <directory>选项
5.编译应用程序
如果应用程序在不同的模式下运行,则选择合适的
CRT文件。
GNU调试器
GNU调试器(GNU Debugger,GDB)是一个强大而灵
活的工具,为在开发的不同阶段用来验证MicroBlaze和
PowerPC系统提供了统一的接口。它使用XMD(Xilinx
MicroBlaze Debugger)作为基本引擎与处理器目标通讯。
MicroBlaze GDB的使用:
mb-gdb options executable –file
GNU调试器GDB调试流程
1.从XPS启动XMD
2.连接到处理器目标,位置在 Simulator/ Hardware/ Virtual
Platform。通过它为目标打开GDB服务器
3.从XPS启动GDB
4.在XMD上连接到远程GDB服务器上
5.下载程序和调试应用程序
GNU调试器MicroBlaze的GDB目标
MicroBlaze的GNU调试器和XMD工具支持三个可能
的远程目标。
通过XMD实现远程调试。通过仿真器目标,硬件目
标和虚拟平台目标,主机上开始XMD服务器程序,这对
mb-gbb是透明的。周期精确的指令集仿真器(ISS)和硬
件接口提供强大的调试工具用于验证一个完整的
MicroBlaze系统。通过在TCP/IP套接字上使用远程协议,
将调试器mb-gdb连接到XMD。
GNU调试器MicroBlaze的GDB目标
1)仿真器目标
XMD仿真器是MicroBlaze系统一个周期精确的ISS,
指示被仿真的MicroBlaze系统到GDB的状态。
2)硬件目标
使用硬件目标,XMD通过串行电缆或JTAG电缆与运
行在目标板上的opb_mdm调试核或xmdstub程序通信,指
示运行的MicroBlaze系统到GDB的状态。
3)虚拟平台目标
虚拟平台是一个周期精确的MicroBlaze的固定参考设
计。支持LMB和外部存储器,UARTlite和GPIO接口。
GNU调试器在MicroBlaze目标上为调试进行编译
为了调试程序,当编译程序时,必须产生调试信息。调
试信息保存在目标文件中;它描述了每个变量或函数的数
据类型,以及在源文件行数目和可执行文件的地址的一致
性。当指定了合适的修饰符时,用于Xilinx的MicroBlaze
软件的mb-gcc编译器包含这个信息。在mb-gcc的-g选项允
许执行源代码级的调试。调试器mb-gcc给可执行文件添加
合适的调试信息,用于帮助调试代码。mb-gcc调试器提供
了在源代码,汇编,以及源程序和汇编混合的调试功能。
Xilinx微处理器调试器
Xilinx微处理器调试器(Xilinx Microprocessor
Debugger,XMD)是一个工具,用来方便调试程序和验
证使用MicroBlaze或PowerPC处理器的系统。可以使用
XMD调试运行在硬件板、周期精确的指令集仿真器ISS
或者周期精确地虚拟平台系统上的程序。
XMD提供工具命令语言(Tool Command Language ,
Tcl)接口。这个接口能用于命令行控制和目标调试,以
及运行复杂的测试脚本来测试一个完整的系统。
Xilinx微处理器调试器
XMD支持GNU调试器(GDB)远程TCP协议来控制
对目标的调试。一些图形化的调试器使用这个接口用来调
试,其中包括PowerPC和MicroBlaze GDB,SDK和EDK’s
的软件IDE。在这些情况下,调试器连接到运行在同一台
计算机上的XMD或者连接到网络上的远程计算机。
XMD读取XMP,MHS和MSS系统文件,用于理解所
调试的硬件系统。这些信息用于执行存储器范围测试,用
于在较快的下载速度下确定MicroBlaze到MDM的连接性
和执行其它动作行为。图4.12给出了XMD的目标结构
Xilinx微处理器调试器
手工调试器/Tcl脚本
GDB和SDK
GDB远程协议接口
XMD Tcl 接口
外部调试器
XMD 套接字接口
Xilinx Microprocessor Debug(XMD)
MicroBlaze ISS
板上PowerPC/
MicroBlaze处理器
使用串口的
MicroBlaze
XMDSTUB
图5. 12 XMD目标
PowerPC ISS
MicroBlaze UP
Xilinx微处理器调试器
-XMD使用
在启动时,XMD执行下面的步骤:
1、如果指定一个XMD的Tcl脚本,XMD执行脚本,然后退出
2、如果没有指定一个XMD的Tcl脚本,XMD开始交互模式。在
这种情况下,XMD执行下面的操作:
Xilinx微处理器调试器
-XMD使用
1)建立源${HOME}/.xmdrc文件。可以使用这个配置文件和
XMD命令来形成定制的Tcl命令。
2)如果有-ipcport选项,则打开XMD套接字服务器。
3)如果有-xmp选项,则加载系统XMP文件。
4)如果有-opt选项,则使用连接选项文件去连接到处理器目标。
5)如果没有-nx选项,当前目录中有xmd.ini文件,则提供它。
6)显示XMD%提示。从XMD Tcl提示中,可以使用XMD命令来
调试。
表5.11给出了XMD用户命令。
Xilinx微处理器调试器
-连接命令选项
命令[选项]
示例用法
描述
xload [xmp xmpfile][mhs
mhsfile][mss mssfile]
xload xmp system.xmp
xload mhs system.mhs
xload mss system.mss
加载XMP,MHS,MSS系统文
件
connect Target connect Type
Options
connect mb mdm
connect ppc hw
连接到目标。
有效的目标文件:mb,ppc,
mdm
vpconnect mb
vpconnect mb
连接到MicroBlaze虚拟平台
targets [target id]
targets
targets 0
所有现在目标的列表或者现在
目标的变化
Disconnect<target id>
disconnect 0
断开与当前处理器目标的连接,
关闭当前DGB服务器,并且
恢复到以前的处理器目标
Xilinx微处理器调试器
-连接命令选项
Debugconfig [step_mode<step type>][memory_datawidth_matc
hing
[disable|enable]][vpoptions<virtual
platform options>][reset_on_run<options>]
Debugconfig –
step_modeenable_interrupt
Debugconfig –
memory_datawidth_matching
enable
为目标配置调试会话
dow [data]<filename>[addr]
dow executable.elf
dow executable.elf 0x400
dow –data system.dat 0x400
下载ELF文件格式或数据文件
到当前目标的存储器
run
run
从程序的开始地址运行程序
con[address]
con
con 0x400
从当前PC或者地址继续运行
stp[number of instructions]
stp
stp 10
单步执行1条或多条指令
Xilinx微处理器调试器
-连接命令选项
cstp[number of cycles]
cstp
cstp 10
单步执行一个或多个周期
rst [-processor]
rst
复位系统
stop
stop
停止目标
rrd [reg num]
rrd
rrd r1(or ) rrd R1
rrd 1
读所有的寄存器或读reg num
寄存器
srrd [reg name]
srrd
srrd pc
读特殊目的寄存器或读reg
num 寄存器
rwr[reg num|reg name]
word
rwr pc 0x400
寄存器写
mrd
[<address>[<num>[w|h|b]]
][<variable>]
mrd 0x400
mrd 0x400 10
mrd 0x400 10 h
从address开始,读num存储器
位置;如果指定了变量名字,
根据下载的ELF文件的全局变
量读取存储器
Xilinx微处理器调试器
-连接命令选项
mrd_var <variable>[Elf
filename]
mrd gloable_var1
executable.elf
读存储器,根据下载的ELF文
件中的全局变量
mwr
<address><{value}>[<num
>[w|h|b]]
mwr 0x400 0x12345678
mwr 0x400 0x1234 h
mwr 0x400 {0x12345678
0x87654321} 2
写到num存储器开始地址。
bps<address|function>[sw|
hw]
bps 0x400
bps main hw
在address或function开始的地
方设置断点。最后下载的ELF
文件用来function查找
watch[r|w]<address>[data]
watch r 0x400 0x1234
watch r 0x40x 0x12x4
watch r 0b01000000xxxx
0b00010010xxxx0100
watch r 0x40x
在address设置读、写监视点。
如果值与data相比较,停在处
理器上。
bpr
<address|function|bpid|all
>
bpr 0x400
bpr main
bpr all
去除断点/监视点
Xilinx微处理器调试器
-连接命令选项
bpl
bpl
列出断点/监视点
tracestart [pc trace
filename] [function_name<func trace
filename>]
tracestart pctrace.txt
tracestart pctrace.txt –
function_name fntrace.txt
tracestart
开始搜集指令和函数跟踪信息
到文件
tracestop[done]
tracestop
tracestop done
停止搜集跟踪信息,选择done
指示跟踪停止
stats [filename]
stats trace.txt
stats
为ISS目标显示执行统计。文
件是来自跟踪搜集的跟踪输出
profile [-o GMON output
file]
Profile –o gproff.out
写分析统计(profile)输出文
件,该文件能被mb-gprof识别
来产生profile(分析统计)信
息
state [target id]
state
显示所有目标的当前状态或者
target id目标
Xilinx微处理器调试器
-连接命令选项
dis [address] [num_words]
dis 0x400 10
反汇编指令(支持MicroBlaze目
标)
terminal [-jtag_uart_server
[port no]]
terminal
terminal –jtag_uart_server
4321
基于JTAG的超级终端与mdm
UART通信。在mdm内使能
UART接口。
如果指定了-jtag_uart_server选
项,在port_no打开TCP服务器
。使用任何一个超级终端工具
和opb_mdm的UART接口通信
。
read_uart[start|stop][TCL
Channel ID]
read_uart start
read_uart stop
read_uart start
$channel_id
从mdm UART接口。通过指定
一个Tcl通道ID,O/P能被重新
指向文件。
Verbose[level]
Verbose
切换冗余模式 ON/OFF。在冗
余模式,XMD打印调试信息
help[options]
help
help init
help connect
help connect mb
列出所有的命令
Xilinx微处理器调试器
--连接命令选项
XMD能在不同的目标(处理器或者外设)上调试程
序。
为了和目标通信,XMD与目标连接。在连接后,给
每个目标分配一个唯一的目标ID。
当与处理器目标连接时,启动gdb服务器,能与
GDB服务器或SDK通信。
使用下面的命令进行连接:
connect [mb|ppc|mdm]<Connection_Type> [Options]
连接命令选项
- MicroBlaze处理器目标
XMD通过JTAG,并且使用opb_mdm微处理器调试模
块外设来连接一个或多个MicroBlaze处理器。XMD可以通
过JTAG或串口与ROM监视器通信,比如XMDStub。可以
使用MicroBlaze ISS调试程序。
MicroBlaze MDM硬件目标
使用命令connect mb mdm连接到MDM目标,启动远
程GDB服务器。MDM支持非插入式的使用硬件断点和硬
件单步的调试(不需要ROM监视器)。图4.13给出了
MicroBlaze的MDM目标。
当命令没有使用选项时,XMD自动监测JTAG和包含
MicroBlaze-MDM系统的FPGA芯片。如果不能自动连接则
使用下面的命令:
Connect mb hw[-cable <Jtag Cable options>] {[configdevice<JTAG chain options>]}[-debugdevice
<MicroBlaze options>] [-pfsl <MicroBlaze FSL options>]
MicroBlaze MDM硬件目标
XMD
PLB总线
JTAG
UART
MDM
MicroBlaze
调试信号
MicroBlaze
MicroBlaze
MicroBlaze
MicroBlaze
图5.13 MicroBlaze 的MDM目标
MicroBlaze MDM目标要求
1)使用MicroBlaze的硬件调试特性,比如硬件断点和
硬件调试控制函数(比如停止和单步),MicroBlaze的硬
件调试端口必须和MDM和opb_mdm连接。
2)使用MDM目标的UART功能,必须在系统的
opb_mdm例化时设置C_USE_UART参数。将程序的
STDOUT打印到XMD控制台上,设置C_UART_WIDTH=8
MicroBlaze存根硬件目标
使用XMDStub(运行在目标的ROM监督程序)连接到
MicroBlaze目标,并且为目标启动GDB服务器。XMD通过
JTAG或串口与XMDStub连接。默认设置使用JTAG接口。
1)MicroBlaze存根 JTAG目标连接命令
Connect mb stub –comm jtag [-cable <JTAG Cable
options>] {[-configdevice <JTAG chain options>]} [debugdevice <MicroBlaze options>]
2)MicroBlaze存根串口目标连接命令
Connect mb stub –comm serial <Serial Communcation
options>
•
MicroBlaze存根硬件目标
PLB总线
XMD
XMD
PLB总线
RS-232
JTAG
Uartlite
UART MDM
本地存储器
本地存储器
MicroBlaze
xmdstub
MicroBlaze
图5.15 MicroBlaze的 MDM目标
xmdstub
存根目标要求
4、使用XMD在硬件板上调试程序,必须满足下面
的条件:
1)XMD使用JTAG或串口与板上的XMDStub通信。所以,在
MicroBlaze目标系统的MSS文件中指定opb_mdm或者UART
作为XMDSTUB_PERIPHERAL。
平台产生器能建立一个系统,该系统包括opb_mdm或者
UART(当MHS文件指定),XMDStub模式下的所支持的JTAG
电缆为:Xilinx的并行电缆和平台USB电缆
存根目标要求
2)板上的XMDStub使用opb_mdm或者UART与主计算机通
讯。因此MicroBlaze系统中必须使用opb_mdm或者URAT。
Libgen工具能配置XMDStub在系统中使用
XMDSTUB
_PERIPHERAL。Libgen为 XMDSTUB_PERIPHERAL产生一个
配置的XMDStub,并且将其加入到code/xmdstub.elf作为
MSS文
件里XMDStub指定的属性。
存根目标要求
3)当系统启动时,XMDStub可执行文件必须包含在MicroBlaze
本地存储器中。
Data2MEM能使用XMDStub填充MciroBlaze存储器。Libgen
可以产生Data2MEM脚本文件用来去填充包含MicroBlaze系统比
特流的BRAM内容。它使用在DEFAULT_INIT所指定的可执行文
件。
4)对于那些必须下载程序到板上进行调试的情况,程序地址必
须大于0x800,并且程序使用crt1.o内的启动代码。
当使用-xl-mode-xmdstub选项时,mb-gcc编译器程序能满足以上
两种情况。
MicroBlaze仿真器目标
使用mb-gdb和XMD在精确周期仿真器上调试程序,使
用下面的命令:
Connect mb sim [-memsize <size>]
其中,memsize是指在仿真器内所分配的地址总线的宽
度。程序可访问的范围是0-(2SIZE-1)。
在ISS上调试程序,必须编译程序用于调试,并且使
用ctr0.o内的启动代码来连接它们。使用-g选项时,编译器
用调试的信息编译程序。默认,mb-gcc使用ctr0.o连接所
有的程序。明确的选项是-xl-mode-executable。存储器的
大小不能超过64KB,并且从地址0启动。程序必须保存在
存储器的首个64KB的地方。这种仿真下,不支持OPB外
设的仿真。
MicroBlaze仿真器目标
6、MDM外设目标
可以连接到opb_mdm外设,使用UART接口去调试系
统和搜集系统信息。使用下面的命令进行连接:
connect mdm <-uart>
MDM目标的要求
为了在XMD目标中使用UART功能,当初始化系统中
的opb_mdm时必须设置C_USE_UART参数。为了打印程
序STDOUT的输出到XMD控制台上,将C_UART_WIDTH
设置为8。
通过使用xuart w<byte>命令,也能够从主机到
MicroBlaze运行程序提供UART输入。使用terminal命令打
开超级终端接口从UART进行读/写操作。read_uart命令提
供了写到STDIO或者文件的接口。
系统ACE文件产生器
系统ACE文件产生器(Systerm ACE File Generator,
GenACE)
ACE文件用来配置FPGA,初始化BRAM,用有效的
程序或数据初始化外部存储器,启动处理器。EDK提供
Tcl脚本genace.tcl,使用XMD命令产生ACE文件。
产生ACE文件要求下面的工具:genace.tcl,xmd,
ISE的iMPACT工具。GenACE具有下面的特点:
–
–
–
–
–
支持带有MDM目标的PowerPC和MicroBlaze
从硬件比特流和软件ELF/数据文件产生ACE文件
初始化PowerPC和MicroBlaze系统的外部存储器
支持多处理器系统
支持单个/多个FPGA芯片系统
GenACE模型
ACE文件产生支持系统ACE CF配置芯片的配置方案。
系统ACE使用JTAG指令和边界扫描链配置芯片。系统
ACE CF是一个两片解决方案,要求系统ACE CF控制器,
CF卡或者1英寸的微驱动硬盘驱动技术作为存储介质。系
统ACE文件从串行向量格式(Serial Vector Format,
SVF)文件产生。SVF文件是一个文本文件包含编程指令
和配置数据,用于执行JTAG操作。
GenACE模型
XMD和iMPACT为软件和硬件系统文件分别产生SVF
文件。SVF文件包括指令和数据用来执行这些操作:
(1)使用iMPACT配置FPGA;
(2)连接到处理器目标;
(3)下载程序,从XMD运行程序。
SVF文件然后转化到ACE文件,然后写到存储介质
中。这些操作通过系统ACE控制器执行来实现所确定的
操作。
GenACE模型
下面是使用iMPACT和XMD对一个简单硬件和软件配
置的操作序列,然后转换成ACE文件。
1)使用iMPACT下载比特流,比特流down.bit,包含系统配置和启
动代码;
2)使芯片脱离复位状态,引起DONE信号变高。开始启动处理器
系统;
3)使用XMD连接到处理器;
4)下载多个数据文件到BRAM或外部存储器;
5)下载多个可执行文件到BRAM或外部存储器。PC指向最后一个
下载的ELF文件的开始的位置;
6)从PC指令地址连续执行;