导航:首页 > 源码编译 > xilinx交叉编译环境源码

xilinx交叉编译环境源码

发布时间:2024-09-10 00:57:39

Ⅰ 嵌入式bootloader和内核在flash上分布问题

这篇文章指引了我,希望它也能指引你

近些年来,嵌入式系统的发展在国内可谓如火如荼,很多公司都急需嵌入式系统方面的开发人员。然而,在高校中,嵌入式系统的教学却较为滞后,很多高年级的本科生和刚入学的研究生都苦于不知从何学起。在本文中,笔者将根据自己的嵌入式系统开发和教学经验,简要介绍嵌入式系统的学习方法,力求能帮助初学者找到一条入门之路。
什么是嵌入式系统?
学习嵌入式系统,首先应该明确什么是嵌入式系统,否则费力去学,却不知所学为何物,岂不惘然?嵌入式系统的定义很多,这也是困扰嵌入式系统学习的一个因素。笔者根据自己开发和教学过程中的理解,以及对各种嵌入式系统的应用进行总结,提出了嵌入式系统的简单定义:嵌入式系统是嵌入式计算机系统的简称,这个定义突出嵌入式计算机系统和普通计算机系统的共性。下表列出了嵌入式系统的一些典型的
应用:
智能机器人(S D R 4,火星登陆车)
娱乐和消费电子(Gameboy Advance,Sony PSP)
网络通信产品(Smartphone)
军用设备(军用PDA )
汽车(车载导航,自动驾驶,娱乐系统)
智能仪器(虚拟仪器)
安全防护(防火,防盗)
环境保护(探空气球)
银行和商业消费(ATM)
以火星登陆车为例来分析一下嵌入式系统的定义。火星登陆车虽然听起来感觉在技术上有些高不可测,但是本质就是嵌入式计算机系统的应用,其核心就是一个计算机系统,而这个计算机系统的组成同传统的计算机系统在本质上没有什么差别。两者的显着不同之处就在于,用于火星登陆车的计算机系统被安装到了火星登陆车上。当然,一个计算机系统能够被安装在火星登陆车上,是需要进行很多特殊设计的。但是从本质上讲,嵌入式系统的核心概念还在计算机系统。嵌入式系统学习的重点也在计算机系统上。一方面,学习者需要牢固掌握计
算机系统本身的概念,更重要的是学习嵌入系统的开发过程同传统计算机系统开发过程的差别。这里需要指出的是,很多学习者本来就没有从事过完整计算机系统的开发,高校的教学是以程序设计为中心的,计算机系统的构成,操作系统的原理,编程语言等课程都是为了能够让学生更好的使用计算机系统进行程序设计,在现有的计算平台上来设计实现各种应用,学生一般没有机会学习一个完整的计算机系统是如何构建,并亲身参与到构建的每一个过程。而对于嵌入式系统而言,从事平台开发的人就是要亲自去开发出一个完整的计算机系统,这个过程包括
l 需求分析
2 硬件设计
3 驱动程序
4 Bootloader & BSP (板级支持包)
5 操作系统的移植
6 应用程序的开发
7 性能检查
嵌入式系统教学的目的就是教会学生如何根据需求去建立满足某种特殊行业需求的嵌入式计算机系统。让学生学会如何构件硬件平台,进行硬件设计,选择能够满足应用要求的最佳的嵌入式操作系统,并完成Bootloader,BSP 和驱动程序的编写,移植,调试等过程。为了满足行业需求,最终要在所建立的系统上编写调试相应的应用程序,并进行性能的测试和检查。
你是谁,你需要学习哪些东西?
如果你的工作只是需要在PC 机上编写一个图片浏览程序,那么你就没有必要去了解当系统收到一个ARP 请求包后应该如何回应。同样的道理,嵌入式系统的学习也是有很多方面的。就嵌入式系统的设计和实现而言,基本上需要四种不同的工作:系统设计工作,硬件设计工作,驱动程序和操作系统移植工作和应用程序设计开发工作。
系统设计工作
在系统的设计阶段,系统分析师将根据需求确定系统的硬件的基本构成,根据系统的需求选择使用那种处理器,使用哪种操作系统,使用那些软件开发工具。系统分析师往往是较为完整的参与过嵌入式系统设计的全过程,对于系统应用的行业较为了解,对于嵌入式系统
本身的开发流程十分清楚的人。
硬件设计工作
系统硬件设计人员需要根据系统分析师的设计结果,进行硬件原理图的设计。通常需要硬件设计人员熟悉嵌入式系统的硬件构成。硬件设计人员需要了解常用的嵌入式系统处理器,存储器(Flash,SDRAM),以太网MAC芯片,音频/ 视频编解码芯片,电源管理芯片,总线接口电路 (USB, PCI),液晶显示模块,可编程逻辑器件(FPGA/CPLD),无线网络通信模块(Bluetooth, WLAN,GPRS)等硬件电路构成元素的基本工作原理,连接使用方法,使用注意事项,基本调试方法等内容。在网络上能找到很多公司的评估板的原理图,对于这些原理图要仔细研究,摸清处理器同存储器,网卡,液晶模块等器件的连接方法和原因。通过对这些电路的研究,能够较快地了解整个嵌入式系统的构成,这些电路同实际产品中的电路虽有一定差别的,特别是对于手持设备,但这些差别不影响初学者学习嵌入式系统的硬件设计基本构成。
以上这些知识,往往需要较长时间的学习和积累,需要亲自参与实践的机会。对于刚刚接触嵌入式系统硬件开发的学生来讲,一般不可能全部了解这些知识,但也不会是通通一无所知。笔者结合自己开发和教学的经验认为:首先应该选定一款主流且较为简单的嵌入式系
统处理器,比如基于ARM7TDMI 内核的AT91M40800,S3C44B0 等嵌入式系统处理器,学习32 位RISC 处理器的编程模型,指令集。高校教学中,单片计算机课程一般以8051系列单片为核心讲解,由于现代32位处理器的结构和开发方式同8 位单片机有着较大的差别,学习者还是需要花一点力气来研究以下32 位处理器的。以ARM处理器为例,学习者就需要理解处理器的多种工作模式,备份寄存器,RISC 指令集的特点,MMU 和虚拟地址,中断处理过程等内容。在学习指令集的过程中,最好能够每学习几条指令,就使用这几条指令在模拟器上实验以下,观察处理器执行的结果。这个过程一方面是学习者对于指令本身的学习能够取得一个比较好的效果,另外也是对开发工具本身的一种学习。接着,就可以开始学习片上资源的使用和配置方法。这时就需要一个方便使用的开发板,学习者能够通过JTAG 仿真器将开发板同调试PC 机相连,进行程序的下载,调试。特别是要仔细研究系统的初始化过程和中断处理的过程。在开发过程中如果遇到问题,应自己分析问题产生的原因,通过分析缩小问题可能产生的范围,最终找到问题的所在。最重要的就是要保持一种解决问题的信心,面对困难如何处理,往往能够决定最终系统是否能够调试成功。然后,学习者可以开始仔细学习处理器同存储器的连接,存储空间的配置,各种外扩器件,如网卡,AC97声卡的工作原理和使用方法。嵌入式系统硬件设计中往往需要使用可编程器件,学习者还需要一定的时间来学习使用常用的可编程器件(C P L D / F P G A ),常用的有Xilinx和Altera公司的产品。进行系统硬件原理图设计,就需要使用原理图设计的E D A 工具,常用的E D A 原理图设计工具主要包括Cadence公司的Capture,Protel公司的Protel99 SE等。接下来就可以参照评估板的电路图,根据系统的设计要求,开始进行原理图的绘制了。在原理图绘制过程中,一定要搞清评估板电路连接的原因,对于一时没有搞清楚的问题切不可蒙混过关。例如,有些处理器的地址线是以字节位单位的,而另一些处理器的地址线则是以两个字节为单位的,当连接16 位的存储器的时候,切不可想当然的把处理器的A 0 直接连接到存储器的A 0 上面。另外,学生还应具有一定的P C B 板图绘制能力,因为在现阶段,很多公司还不能完全把原理图的设计工作和PCB 的绘制工作分开,往往要求硬件设计人员既能进
行原理图设计又能进行板图设计。即使是PCB设计和原理图设计分开的公司,也需要原理图设计者能为PCB 的设计者对于不同的信号提出布板要求。
驱动程序和操作系统移植工作
现代嵌入式系统的开发同传统8 位单片机系统的开发相比,一个显着的区别就是嵌入式操作系统的广泛使用。在拿到焊接完毕的电路板,并进行基本的测试后,就要进行驱动程序和操作系统的移植工作了。首先要进行的Bootloader的编写和移植工作。Bootloaer相当于PC系统的BIOS。对于有些嵌入式操作系统,如uc/OSII 没有bootloader同样可以开发调试。但是对于Windows CE和嵌入式linux系统而言Bootloader就是必须的了。本文以
Windows CE 为例,做一个简要的说明。
Windows CE 系统的移植工作主要就是BSP(板级支持包)的开发过程。B S P 将具体的硬件差异同操作系统的核心隔离开来,主要由Bootloaer ,OAL (OEMAbstraction
Layer)和设备驱动程序三部分组成。WindowsCE系统中Bootloader叫做Eboot。Eboot被写入系统的引导Flash。系统启动时运行 Eboot,完成通过网卡将调试PC 机中Windows CE 操作系统映像下载到目标系统的S D R A M 中并开始执行的功能。对于一个系统移植人员,首先需要阅读文档,了解Windows CE系统Bootloader和BSP的基本概念和开发过
程。(呵,还要做这工作啊,我还没想到(初学^_^))Windows CE的开发系统Platform Builder提供了详细的文档和例程,开发人员需要仔细的阅读文档和例程。搞清楚各个函数之间的调用关系。在开发过程中的一个重要的步骤就是打通串口,使得目标板能够通过PC 机串口向调试PC 机发送数据。由于A R M 系统的仿真器比较昂贵,而且操作系统的调试往往不使用JTAG 调试器进行单步调试。所以能从串口观察程序的执行过程和结果对于调试就显得十分重要了。串口打通之后一个比较棘手的问题就是网卡芯片的调试。刚刚接触嵌入式系统开发的人往往没有直接在寄存器级上使用网卡芯片的经验,而网卡芯片的说明一般都较为简短,这就要求开发者学习一些以太网的基础知识,对以太网的 MAC 层有一个基本的认识。另外,各种网络调试(抓包)工具的使用也能大大降低系统调试的难度。系统的O A L 需要根据具体硬件的不同做出相应的修改,这个部分可次参照文档进行,在调试过程中根据串口的信息分析出错的地方。要充分发挥跨文件字符串搜索工具的功能,在浩如烟海的源文件中找到出错的位置。当然,随着开发者对系统文件目录结构的熟悉和了解,错误定位的速度会不断加快。Windows CE 的驱动程序相对而言是比较好写的。程序结构较为简单,学习者可参照 MSDN Home > MSDN Library >Mobile and Embedded Development > Embedded Operating
System Development > Columns SPOT the Geek and WindowsCE Drivers 这篇文章。
应用程序的开发
嵌入式系统的应用程序开发同在PC 机上开发应用程序的区别不是很大。对于W i n d o w s C E 系统而言,Microsoft已经提供了较为完善的开发工具。特别是.NET Compact Framework 的使用,使得基于Windows CE.NET Compact Framework的应用程序有了跨平台性。开发人员可以使用Windows 的C# 语言直接在PC 上进行CE .NET应用程序的开发和模拟调试,也可将目标系统同PC 机相连,进行联机调试。现在有很多系统支持J2ME(JAVA 的嵌入式系统版本) ,这使得JAVA 在嵌入式系统应用开发中占有较大的
优势。另外,作为专业的嵌入式系统软件开发人员,还需要充分了解面向对象技术和设计模式等方面的知识,当然作为初学者可以先不深入研究这方面的内容。
常用嵌入式系统处理器和操作系统
处理器
常用嵌入式系统处理器主要包括A R M 处理器,Power PC 处理器,基于MIPS 内核的嵌入式处理器,软核处理器(如Alter 的Nios和Xilinx的MicroBlaze等)和D S P(数字信号处理器)等。
A R M 处理器的主要特点是具有较高的性能功耗比。A R M 处理器被广泛的应用在手机,P D A 等领域,其中较为着名的有Intel 公司生产的基于ARM 内核的XScale系列处理器。由于所有公司生产的基于ARM 内核的处理器具有相同的编程模型,在手持和电池供电的系统中,基于A R M 的嵌入式系统处理器往往被首先选用。PowerPC (简称PPC)处理器具有较强的运算性能和数据吞吐能力,在网络和数据通信领域基于PPC 的嵌入式系统处理器有着广泛的应用。其中Motorola公司生产的MPC860/MPC8260 被大量地应用在嵌入式网络产品中。MIPS 处理器的特点表现在十分强大的处理能力上。作为高性能处理器,MIPS 处理器适用于网络、企业及高级消费类电子应用,特别是在机顶盒系统中,MIPS 处理器具有较高的市场占有率。随着可编程器件的规模不断扩大,使得人们能够根据需要定制处理器,并方便的将针对某种特殊应用定制的处理器方便的在可编程器件内部实现。除了处理器外,计算机系统还需要许多其他构成部分,比如在多通道媒体数据处理系统中,经常需要使用可编程器件来实现高速的数据处理功能,使用软核DSP 来实现复杂的数字信号处理算法,同时还需要处理器进行事务处理,软核处理器将可编程器件,D S P 同处理器结合在一起,为系统级设计提供了极大的灵活性。D S P (数字信号处理器)有别于通用处理器,集中表现在其强大的数字信号处理能力上。在DSP 内部提供了硬件乘累加器,处理器在设计上对于特殊的寻址方式做了优化,一些DSP 还支持零耗循环(Zero OverheadLoop)。为了方便嵌入式系统设计,主流DSP 一般也都提供了丰富的外设。特别值得一提的是A D I 公司的Blackfin 系列DSP 和TI 公司的DM64X 系列DSP,两种处理器都提供了丰富的片上外设,非常适用嵌入式系统应用。
操作系统
Window CE.NET/5.0
作为Microsoft的产品,Window CE.NE/5.0提供了功能完备的平台开发工具Platform Builder和应用开发工具Embedded Visual C++/Visual Studio 2003。Windows CE由于拥有广大使用者所熟悉的windows 界面,系统提供了众多驱动程序,并且有完备的文档支持。对于应用开发而言,熟悉Windows 系统开发的程序员很容易转到WindowsCE 应用程序的开发。Windows CE将会是一个非常有前途的嵌入式操作系统。
VxWorks
VxWorks 是由Windriver(风河)公司出品的嵌入式实时操作系统,大名鼎鼎的火星登陆车就是使用了VxWorks。Windriver 为VxWorks 提供了集成开发环境tornado。
υC/OSII
υC/OS是由Jean Labrosse设计编写的开放源代码的嵌入式实时操作系统,笔者最早接触的嵌入式操作系统就是它。阅读并深入理解υ C/OS 的源代码对于理解实时系统是大有裨益的。
ARM Linux
ARM linux是由Russell King和其他开发者开发移植的用于ARM 处理器的linux操作系统。 ARM Linux系统在GNU GPL下发布。有兴趣的读者可以参看
的介绍。
υ CLinux
υ Clinux 是适用于没有MMU 的嵌入式处理的LinuxOS 版本。υ Clinux 同样在GNU GPL 下发布,有兴趣的读者可以参看

嵌入式系统开发过程中的常见问题和解决方法
Bootloader如何写入Flash ?
初学者一般都会遇到如何将程序写入处理器的问题。对于不同的处理器,可以采用不同的方法。例如Intel的Xscale处理器可以使用Intel公司提供的JFlash工具烧写。对于具有JTAG 调试工具软件的处理器,可以使用如下思路:编写一段程序,这段程序能将位于SDRAM/SRAM 固定地址中的数据写入Flash 中。烧写时,首先,将这段软件下载到SDRAM 中,然后通过调试软件将要写入Flash的数据下载到S D R A M / S R A M 的某个固定地址开始的缓冲区,然后通过调试器开始执行程序,将数据写入Flash。除此以外,网络上还提供了很多专用的写Flash的工具,开发者可以根据自己的需要选用。(现在明白了我在学的那个BF533为什么先下个flashProgramer.dxe先了)
什么是arm-elf-gcc?
arm -elf-gcc是一个交叉C语言编译器。我们在PC平台下编译程序,编译器运行的处理器同生成的代码将要运行的处理器相同。但是,在PC 机上编译ARM 程序时,编译器运行的处理器同生成的代码运行的处理器不同,这种编译器叫做交叉编译器。其中的elf是指编译器生成的目标文件格式。(其实我们平时用的单片机编译器如GCC—AVR等已是交叉编译器了,我到现在才弄清楚什么是交叉编译器)
走了哪条编译路径?
系统程序和驱动程序往往包含很多的编译选项,很多选项都是在编译时通过命令行定义的,如果想知道编译的是那一段程序可以使用如下的方法:
#ifdef PLAT_AAA
#error Code for Platform AAA
#else
#error Code NOT for Platform AAA
#endif
这样在编译的时候就知道,编译的是哪一条路经了。对于支持#pragma message( “I am here”)的编译器也可使用#pragma message预编译指令。
我怎么知道那段代码在那个文件中?
系统编程中经常需要使用在多个文件中搜索字符串,在windows平台下可以使用平台提供的多文件字符串搜索工具。在linux平台下,可以使用grep来搜索字符串。Grep 的搜索功能十分强大,支持正则表达式搜索,熟练使用grep对于阅读系统和驱动程序代码是很有
帮助的。
系统是从那个文件开始运行的?
对于W i n d o w s C E 系统,一般从
W I N C E 4 2 0 \PLATFORM\YourPlatform\KERNEL\HAL 目录的某个汇编文件中。对于Linux 系统版本不同会存在一定差异,以arm处理器为例,一般会在linux2.4.x\arch\arm\kernel的head-armv.S中。
程序执行到了那里?
可以在程序中插入如下代码来实现
printf( “I am here %s, %d\n”,__FILE__, __LINE__);
代码将打出printf语句所在的文件名和行号。
推荐书目
Jean J.Labrosse MicroC/OS-II The Real-Time Kernel,Second Edition
这本书是笔者接触嵌入式实时系统的入门书,在国内能够买到中文版。这本书较为清楚地讲述了实时系统的概念,各个组成部分的工作原理,特别是公开了实时系统内核的源代码,仔细研究定会受益匪浅。有个小的提示,对于初学者,这本书可以先不看第一章,直接从
第二章看起。
Abraham Silberschatz, Peter Baer Galvin,Greg Gagne Operating System Concepts
笔者在教学过程中发现,无论是计算机还是电子工程专业都有很多学生对于操作系统的基本概念都没有搞清,很少有学生有完整的系统编程经验。Operating SystemConcepts这本书对操作系统的感念讲述只能用经典来形容。对于嵌入式系统有兴趣深入研究的同学,首先
要把基础打好,这本书就成了必读之物了。
Andrew S. Tanenbaum Computer Networks
提起Andrew S. Tanenbaum 学习计算机的同学一定都知道OPERATINGSYSTEMs:Design and Implementation这本书,笔者对于Tanenbaum 这样的教授由衷佩服。网络协议栈是嵌入式系统中的支柱性组成部分。愿意致力于网络深层技术研究的同学,这本书将你们建立一个坚实的网络基础。
Karim Yaghmour Building Embedded Linux Systems
本书详尽的介绍了嵌入式linux系统的组成,基本概念和如何去建立各个部分。全书篇幅较小,可谓短小精悍。即可以作为嵌入式linux 系统的入门读物,又是开发过程各个部分的指南。
Advanced RISC Machines Ltd (ARM) ARM7 TDMI
Data Sheet
Advanced RISC Machines Ltd (ARM) ARM920T
Technical Reference Manual
学习嵌入式系统不了解当前应用最广泛的嵌入式处理器怎么行? ARM7 TDMI 的 data sheet是学习ARM编程模型,指令集的好东西。在嵌入式系统中,M M U (内存管理单元)是很重要的部分,又是较难理解和掌握的部分。ARM920T Technical Reference Manual 正好可以帮你讲解这方面的内容。
Perter Van Der LinDen Expert C Programming
嵌入式系统级编程最常用的语言还是C 。很多同学都自认为自己的C 语言学的很好,那好,就看看这本书吧,找找自己和Experts差距。
注:这篇文章是我在2004年第12期的学习园地看到的。文章的作者是袁通
作者简介
袁通,北京工业大学实验学院嵌入式系统课程教师,曾于2 0 0 4 年以访问学生身份工作于微软亚洲研究院。
看完这篇文章后,我就迫不及待得贴出来,因为确实是写的好啊。我搞嵌入式一年多了,从8051到ARM,学习过,彷徨过,高兴过,郁闷过。。。近来甚至有放弃的想法,终归到底是对嵌入式开发认识不全面造成的,一开始就一头钻到技术里,学习各种技术,最终迷失在自己一手造成的泥坑里。这篇文章非常清晰的讲述了嵌入式开发的方方面面,对我这样迷惑的人起到了醍醐灌顶的作用。
嵌入式开发与桌面开发既有不同,又有非常大的联系,而且十分注重实际操作能力。搞桌面开发的人在一开始接触嵌入式的时候,通常转换不过来,这主要体现在定位上。如文中所说,你是谁,你要做什么?我对硬件的了解仅限于编程领域,PCB设计一窍不通,但并不能说你不懂硬件就不能从事嵌入式开发。一个系统的开发设计方方面面,在自己感兴趣和熟悉的领域做出自己的贡献才是最主要的。
1。硬件设计: 需要有硬件设计的经验,对各种嵌入式器件有很好的了解。
2。系统移植:需要汇编经验,操作系统原理以及底层驱动的了解
3。应用程序:需要桌面编程经验

Ⅱ opencv不用把库放到开发板上吗

由于我本机PC端测试使用的opencv的版本为opencv2.4.6.1.故而我想要移植这个版本的opencv到zedboard板卡上。参考Xilinx出版的《Zynq开发实战》的第13章以及几个人的博客进行配置编译的时候,总是会出现如下的错误:
In file included from /usr/include/math.h:409:0,
from /opt/opencv-2.4.6.1/moles/core/include/opencv2/core/types_c.h:94,
from /opt/opencv-2.4.6.1/moles/core/include/opencv2/core/core.hpp:49,
from /opt/opencv-2.4.6.1_forArm/moles/core/precomp.hpp:50:
/usr/include/bits/mathinline.h: In function 'void cv::randnScale_8u(const float*, uchar*, int, int, const float*, const float*, bool)':
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
/usr/include/bits/mathinline.h: In function 'void cv::randShuffle_(cv::Mat&, cv::RNG&, double) [with T = unsigned char]':
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
/usr/include/bits/mathinline.h: In function 'void cv::randShuffle_(cv::Mat&, cv:
......
在用交叉编译工具链编译opencv时候,我本来已经将交叉编译工具链写入了环境变量,那它搜索的时候,应该是遍历交叉编译工具链下的头文件,但是 opencv却默认遍历到gcc头文件下,故而出现这样的错误,为何会这样呢?试了多种方式均不能编译通过,故而弃用书上编译opencv的方式,转向下 面的方式:
我们采用图形化的cmake进行配置,这样就可以指定交叉编译工具链的头文件目录,下载cmake安装包(ps:不要下载源代码),下载地址如下:
http://www.cmake.org/cmake/resources/software.html我使用的系统为32位Centos6.4,故而我选择的平台为Linux i386,下载其后面的压缩包。
下载完成后,解压缩cmake-2.8.12.2-Linux-i386.tar.gz到/usr/local下,使用下面的命令:
tar xvzf cmake-2.8.12.2-Linux-i386.tar.gz -C /usr/local
export PATH=$PATH:/usr/local/cmake-2.8.12.2-Linux-i386/bin
接下来,我们利用cmake-gui进行opencv的配置,创建zedopencv目录,解压缩opencv代码到此目录下,在opencv的源代码下创建zed_install,然后进入此目录。命令如下:
tar xvzf opencv-2.4.6.1.tar.gz -C ./zedopencv
cd ./zedopencv/opencv-2.4.6.1
mkdir zed_install
cd zed_install
cmake-gui
出现如下的界面:

其中,按照提示选择要编译的opencv源代码的路径以及安装编译路径,这里如图所示。然后点击Configure,出现如下的配置界面:

这里一定要注意,选择Unix Makefile选项,在下面选择指定编译器选项,然后点击next进入下面的界面,按照提示,填入如下的信息:

指定交叉编译环境的头文件目录是/opt/xlinx-arm-gcc/arm-xilinx-linux-gnueabi/libc/usr/,选择C 与C++的编译器,还有平台,这里一定要注意Library mode的选项,这里一定要选择在根目录与本地系统下均搜索,如上图所示,点击Finish完成配置。第三方库,尽量不用选,如下图所示:

然后点击Generate,完成配置,然后执行make,开始编译,编译的过程中会出现下面的一个错误:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libcxcore.so: undefined reference to `clock_gettime'
../../lib/libcxcore.so: undefined reference to `pthread_key_create'
../../lib/libcxcore.so: undefined reference to `pthread_getspecific'
../../lib/libcxcore.so: undefined reference to `pthread_setspecific'
按照错误的提示,是缺少线程链接,我们需要对此目录下的CmakeCache.txt进行修改,修改的位置如下:
178 //Flags used by the linker.
179 CMAKE_EXE_LINKER_FLAGS:STRING=-lpthread -lrt
然后保存退出,继续编译就可以完成所有的编译。完成后,在此目录下的lib下发现已经编译好了所有的库文件,创建zed-lib-opencv文件夹,拷贝所用的.so文件到此目录下。
为了便于制作镜像文件,在此目录下创建ramdisk文件夹。我写了个shell脚本,也就是图中所示的fs.sh,为了便于操作其中的参数$1代表要制作的镜像的名称,$2代表要制作镜像的文件夹,$3代表镜像的大小,脚本的具体内容如下:
#!/bin/bash
dd if=/dev/zero of=$1.image bs=1M count=$3

mke2fs -F $1.image -L "ramdisk" -b 1024 -m 0
tune2fs $1.image -i 0

chmod 777 $1.image

#mkdir ramdisk

mount -o loop $1.image ./ramdisk

cp -R ./$2/* ./ramdisk

umount ./ramdisk
由于ramdisk文件系统的大小为8M,而Opencv的库文件显然大于8M,其接近于25M,故而8M是满足不了的,SD卡有4G的空间,制作库文件的镜像,拷贝到SD卡上,把SD卡挂载到Linux系统,就可以解决空间不够用的问题。我们进行如下的操作:
首先进入filesys,在usr目录下创建lib,再进入etc/init.d,对rcS文件进行修改。添加下面几行代码:
echo "mount otherlib....."
mount /dev/mmcblk0p1 /mnt
mount /mnt/opencvlib.image /usr/lib

export PATH=$PATH:/usr/local/bin
export LD_LIBRARY_PATH=/usr/local/lib:/lib
然后,我们进行镜像的制作:
./fs.sh ramdisk8M filesys 8
./fs.sh opecv_lib zed-lib-opencv 80
制作了两个镜像文件ramdisk8M.image opecv_lib.image大小分别为8M与80M.
然后对ramdisk进行压缩:
gzip -9 ramdisk8M.image
然后将新生成的ramdisk8M.image.gz与opencv_lib.image拷 贝到SD卡启动zedboard即可发现,/usr/lib目录下已经有了opencv库文件,至此opencv移植到zedboard工作彻底完成!此 方法也可以用于一般的arm开发板opencv的移植。
要支持第三方库,可以参照这个博客:ffmpeg支持,在编译完第三方库之后,需要重新编译opencv库!

Ⅲ 如何使用oprofile对软件做profiling

一. Oprofile简介

Profiling是对不同性能特征的数据的形式化总结或分析,它通常以图形和表的形式出现。它提供为特定的处理器事件收集的采样百分数或数量,比如cache miss rate、TLB miss rate等等。一般来说,主要目的是为了找出软件中的性能瓶颈,然后有针对性的优化以提升软件的整体性能。

Oprofile 是用于 Linux 的若干种评测和性能监控工具中的一种。它可以工作在不同的体系结构上,包括ARM, PowerPC, MIPS, IA32, IA64 和 AMD Athlon等等。它的开销很小,从Linux 2.6 版起,它被包含进了Linux内核中。

Oprofile可以收集有关处理器事件的信息,帮助用户识别诸如循环的展开、cache的使用率低、低效的类型转换和冗余操作、错误预测转移等问题。Oprofile是一种细粒度的工具,可以为指令集或者为函数、系统调用或中断处理例程收集采样。Oprofile 通过取样来工作。使用收集到的评测数据,用户可以很容易地找出性能问题。

通过监察CPU的hardware events,oprofile可以在运行状态下对整个Linux系统进行profiling。Profiling的对象可以是Linux kernel (包括moles和interrupt handlers), shared libraries或者应用程序。

从0.9.8版本开始,oprofile支持Perf_events profiling mode模式。应用程序operf被用来控制profiling过程;而在legacy mode下,是通过opcontrol脚本和oprofiled daemon来完成的。Operf不再象legacy mode那样需要OProfile kernel driver,它直接和Linux Kernel Performance Events Subsystem打交道。使用operf,就可以用普通用户的身份来profiling用户的应用程序了,当然如果需要对整个系统来profiling的时候还是需要root权限的。

如果硬件不支持OProfile使用performance counters,OProfile就只能工作在Timer Mode下了。Timer Mode只能在legacy profiling mode下使用,即只能通过opcontrol脚本来控制。
Oprofile的优势:
Ÿ 比较低的运行开销
Ÿ 对被profiling的对象影响很小
Ÿ 可以profiling中断服务程序(interrupt handlers)
Ÿ 可以profiling应用程序和shared libraries
Ÿ 可以profiling dynamically compiled (JIT) code
Ÿ 可以对整个系统做profiling
Ÿ 可以观察CPU内部的细节,例如cache miss rate
Ÿ 可以多源代码做annotation
Ÿ 可以支持instruction-level的profiling
Ÿ 可以生成call-graph profiles

不过OProfile也不是万能的,它也有自己的局限性:
Ÿ 只能在x86, ARM, 和PowerPC架构上生成call graph profiles
Ÿ 不支持100%精确的instruction-level profiling
Ÿ 对dynamically compiled (JIT) code profiling的支持还不完善。

无论如何,Oprofile的功能都比gprof要强很多,代价是配置起来会比较麻烦。


二. 编译Oprofile

首先最好在Linux kernel里面选中Oprofile driver,以获得全面的支持。因为笔者使用的是Xilinx Linux pre-built 14.7,所以这里下载的是linux-xlnx-xilinx-v14.7.tar.gz

解压缩后,用以下命令调出Linux kernel的配置界面:
export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
make xilinx_zynq_defconfig
make xconfig 或者make menuconfig

在配置界面上将以下两项勾上:
General setup --->
[*] Profiling support
<*> OProfile system profiling

然后make uImage即可生成新的uImage,用来替换Xilinx Linux pre-built 14.7中的Linux kernel image。同时我们也需要vmlinux来检查profiling的结果。


Oprofile需要popt, bfd, liberty库,要在嵌入式单板上使用这些库,需要手工完成交叉编译。

针对popt 1.7,用以下命令完成编译:
./configure --prefix=/home/wave/xilinx/oprofileprj/rootfs --host=arm-xilinx-linux-gnueabi --with-kernel-support --disable-nls && make && make install

针对binutils 2.24,用以下命令完成编译:
./configure --host=arm-xilinx-linux-gnueabi --prefix=/home/wave/xilinx/oprofileprj/rootfs --enable-install-libbfd --enable-install-libiberty --enable-shared && make && make install
不过--enable-install-libiberty没有效果,所以需要手工把libiberty.a和libiberty.h拷贝到相应的位置。

针对oprofile 0.9.9,用以下命令完成编译:
./configure --host=arm-xilinx-linux-gnueabi --prefix=/home/wave/xilinx/oprofileprj/rootfs --with-kernel-support --with-binutils=/home/wave/xilinx/oprofileprj/rootfs && make && make install
配置过程结束后可能会有以下提示,因为没有打算用GUI和profile JITed code,所以直接忽视之。
config.status: executing libtool commands
Warning: QT version 3 was requested but not found. No GUI will be built.
Warning: The user account 'oprofile:oprofile' does not exist on the system.
To profile JITed code, this special user account must exist.
Please ask your system administrator to add the following user and group:
user name : 'oprofile'
group name: 'oprofile'
The 'oprofile' group must be the default group for the 'oprofile' user.

将编译完成的uImage,vmlinux,oprofile binary,重新编译的没有-pg的libjpeg binary以及tool chain的libc打包放到SD卡中,准备在ZC706开发板上尝试profile djpeg。

三. 运行Oprofile

正常启动嵌入式Linux后,在开发板的console上一次输入以下命令:

mount /dev/mmcblk0p1 /mnt

mkdir -p /home/root/work
cd /home/root/work
tar zxvf /mnt/jpeg-bin-nopg.tar.gz
cd jpeg-bin/bin
cp /mnt/park-2880x1800.jpg .
export LD_LIBRARY_PATH=/home/root/work/jpeg-bin/lib

cd /home/root/work
tar zxvf /mnt/rootfs.tar.gz
cd rootfs
chown root:root -R *
cp -R bin/* /usr/bin
cp -R lib/* /lib
cp /bin/which /usr/bin
cp /bin/dirname /usr/bin
mkdir -p /home/wave/xilinx/oprofileprj/rootfs/share
cp -R ./rootfs/* /home/wave/xilinx/oprofileprj/rootfs

cd /home/root/work
tar zxvf /mnt/libc.tar.gz
cp ./lib/libstdc*.* /lib

mkdir -p /home/wave/xilinx/libjpeg
cd /home/wave/xilinx/libjpeg
tar zxvf /mnt/jpeg-9.tar.gz

cp /mnt/vmlinux /home/root/work

cd /home/root/work/jpeg-bin/bin

opcontrol --init
opcontrol --vmlinux=/home/root/work/vmlinux
opcontrol --setup --event=CPU_CYCLES:100000::0:1 --session-dir=/home/root/

operf --vmlinux /home/root/work/vmlinux ./djpeg -bmp park-2880x1800.jpg > result.bmp
opreport -l ./djpeg

完成这一步后,我们就可以看到profiling的结果了,在笔者的平台上看到的内容的主要部分如下:
root@zynq:~/work/jpeg-bin/bin# opreport -l ./djpeg
Using /home/root/work/jpeg-bin/bin/oprofile_data/samples/ for samples directory.
CPU: ARM Cortex-A9, speed 666667 MHz (estimated)
Counted CPU_CYCLES events (CPU cycle) with a unit mask of 0x00 (No unit mask) count 100000
samples % image name symbol name
15293 58.6253 libc-2.17.so /lib/libc-2.17.so
2044

Ⅳ ARM交叉编译时链接错误,提示collect2: ld returned 1 exit status,求解答

libVimbaC.so编译的不对, 使用arm gcc链接so命令:
arm-none-linux-gnueabi-gcc -o libVimbaC.so -shared ..... VimbaC.cpp
就可以编译出arm下用的动态库了.

Ⅳ 如何使用oprofile对软件做profiling

下载的是linux-xlnx-xilinx-v14.7.tar.gz

解压缩后,用以下命令调出Linux kernel的配置界面:
export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
make xilinx_zynq_defconfig
make xconfig 或者make menuconfig

在配置界面上将以下两项勾上:
General setup --->
[*] Profiling support
<*> OProfile system profiling

然后make uImage即可生成新的uImage,用来替换Xilinx Linux pre-built 14.7中的Linux kernel image。同时我们也需要vmlinux来检查profiling的结果。


Oprofile需要popt, bfd, liberty库,要在嵌入式单板上使用这些库,需要手工完成交叉编译。

针对popt 1.7,用以下命令完成编译:
./configure --prefix=/home/wave/xilinx/oprofileprj/rootfs --host=arm-xilinx-linux-gnueabi --with-kernel-support --disable-nls && make && make install

针对binutils 2.24,用以下命令完成编译:
./configure --host=arm-xilinx-linux-gnueabi --prefix=/home/wave/xilinx/oprofileprj/rootfs --enable-install-libbfd --enable-install-libiberty --enable-shared && make && make install
不过--enable-install-libiberty没有效果,所以需要手工把libiberty.a和libiberty.h拷贝到相应的位置。

针对oprofile 0.9.9,用以下命令完成编译:
./configure --host=arm-xilinx-linux-gnueabi --prefix=/home/wave/xilinx/oprofileprj/rootfs --with-kernel-support --with-binutils=/home/wave/xilinx/oprofileprj/rootfs && make && make install
配置过程结束后可能会有以下提示,因为没有打算用GUI和profile JITed code,所以直接忽视之。
config.status: executing libtool commands
Warning: QT version 3 was requested but not found. No GUI will be built.
Warning: The user account 'oprofile:oprofile' does not exist on the system.
To profile JITed code, this special user account must exist.
Please ask your system administrator to add the following user and group:
user name : 'oprofile'
group name: 'oprofile'
The 'oprofile' group must be the default group for the 'oprofile' user.

将编译完成的uImage,vmlinux,oprofile binary,重新编译的没有-pg的libjpeg binary以及tool chain的libc打包放到SD卡中,准备在ZC706开发板上尝试profile djpeg。

三. 运行Oprofile

正常启动嵌入式Linux后,在开发板的console上一次输入以下命令:

mount /dev/mmcblk0p1 /mnt

mkdir -p /home/root/work
cd /home/root/work
tar zxvf /mnt/jpeg-bin-nopg.tar.gz
cd jpeg-bin/bin
cp /mnt/park-2880x1800.jpg .
export LD_LIBRARY_PATH=/home/root/work/jpeg-bin/lib

cd /home/root/work
tar zxvf /mnt/rootfs.tar.gz
cd rootfs
chown root:root -R *
cp -R bin/* /usr/bin
cp -R lib/* /lib
cp /bin/which /usr/bin
cp /bin/dirname /usr/bin
mkdir -p /home/wave/xilinx/oprofileprj/rootfs/share
cp -R ./rootfs/* /home/wave/xilinx/oprofileprj/rootfs

cd /home/root/work
tar zxvf /mnt/libc.tar.gz
cp ./lib/libstdc*.* /lib

mkdir -p /home/wave/xilinx/libjpeg
cd /home/wave/xilinx/libjpeg
tar zxvf /mnt/jpeg-9.tar.gz

cp /mnt/vmlinux /home/root/work

cd /home/root/work/jpeg-bin/bin

opcontrol --init
opcontrol --vmlinux=/home/root/work/vmlinux
opcontrol --setup --event=CPU_CYCLES:100000::0:1 --session-dir=/home/root/

operf --vmlinux /home/root/work/vmlinux ./djpeg -bmp park-2880x1800.jpg > result.bmp
opreport -l ./djpeg

完成这一步后,我们就可以看到profiling的结果了,在笔者的平台上看到的内容的主要部分如下:
root@zynq:~/work/jpeg-bin/bin# opreport -l ./djpeg
Using /home/root/work/jpeg-bin/bin/oprofile_data/samples/ for samples directory.
CPU: ARM Cortex-A9, speed 666667 MHz (estimated)
Counted CPU_CYCLES events (CPU cycle) with a unit mask of 0x00 (No unit mask) count 100000
samples % image name symbol name
15293 58.6253 libc-2.17.so /lib/libc-2.17.so
2044

阅读全文

与xilinx交叉编译环境源码相关的资料

热点内容
网页无法打开pdf 浏览:555
linux命令scp 浏览:519
怎样把图片转为pdf格式 浏览:115
linux变量类型 浏览:840
linux中网卡配置 浏览:704
appstore里面的软件怎么设定年龄 浏览:290
jpg在线转换pdf格式 浏览:600
java泛型详解 浏览:616
pdf介质框 浏览:210
苹果手机怎么用蓝牙传app软件到安卓 浏览:435
东方财富app怎么找场内基金 浏览:276
粉笔app怎么修改身份 浏览:529
价值投资选股公式源码 浏览:681
u盘文件夹变成了白色隐藏无法使用 浏览:876
python如何爬取火车票 浏览:977
生命哲学pdf 浏览:61
socket程序源码 浏览:156
修改文件夹用户和用户组 浏览:595
女生隐私软件不加密不要钱 浏览:560
压缩式雾化泵和雾化器一样吗 浏览:675