由于我们学校的毕业设计基本都是用
jsp做网站,可惜我对此无兴趣,只好选择了和
C语言有关的嵌入式开发。先说明一下,这里只是记录我的毕业设计过程,没提出有什么新的技术,欢迎大家交流。
本毕业设计是基于嵌入式
linux的
qt多媒体中心,要求可以播放常见的音频、视频,并可以拍照和录像。我所采用的是
ok6410的开发板,它自带了
linux3.01的内核,
qt环境以及
usb摄像头驱动等,恰好支持我的摄像头。
我使用的是
linuxdeepin 12.12 alpha 64位(
ubuntu12.10),直接使用的
ok6410自带的交叉编译器(
32位),由于我之前已经安装好了
32位支持环境(
参见此文),所以交叉编译其正常运行可以。
下面介绍一下这几天收集的预备知识。
一、关于摄像头
一般开发板支持的摄像头有两种
cmos和
usb。
我想
usb摄像头光学感应器件应该也是
cmos的,不知对否?
关于摄像头的知识,有许多好的博客,这里是
链接,我就不再重复了。
二、关于编译器
arm-none-linux-gnueabi交叉编译器
codesourcery公司推出的,基于
GCC进行优化的编译器,
官方网站。
arm编译器的区别,来自百度
知道,
链接工具命名:
arch-Vendor/Hardware Platform-(os-)abi
1、
arm-none-linux-gnueabi
(ARM architecture, no vendor, linux OS, and the gnueabi ABI)
用于编译
ARM架构的
u-boot、
linux内核、
linux应用等
2、
arm-none-eabi
用于编译
ARM架构的裸机系统
(包括
linux的
boot、
kernel)
3、
arm-eabi
Android
ARM 编译器
如
arm-fsl-linux-gnueabi表示飞思卡尔平台的编译器
三、关于qt,地址
Qt泛指
Qt的所有桌面版本,比如
Qt/X11,
Qt
Windows,
Qt
Mac等。由于
Qt最早是在
Linux中随着
KDE流行开来的,因此通常很多人说的
Qt都指用于
Linux/Unix的
Qt/X11。一般命名以
qt-x11-opensource-xxx!
QT/E
-> Qtopia-core -> Qt-embedded-opensource(同一种鸟):
Qt
在刚出现的时候,对于
Linux和
Unix系统,只有构建于
Xlib之上的
X11版。但随着
Linux操作系统在嵌入式领域的应用日渐广泛,
Qt推出了嵌入式的版本
Qt/E。由于嵌入式受限的硬件环境往往难以运行庞大的
X服务器,
Qt/E去掉了
X
Lib的依赖而直接工作于
Frame
Buffer上,因而效率更高,但它并不是
Qt的子集,而应该是超集,部分机制(如
QCOP等)不能用于
Qt/X11中。
Qtopia(注意不是
Qtopia-core,两者是不一样的):一般命名为
qtopia-opensource,最初是
sourceforge.net上的一个开源项目,全称是
Qt
Palmtop
Environment,是构建于
Qt/E之上一个类似桌面系统的应用环境,包括了
PDA和手机等掌上系统常见的功能如电话簿、日程表等。现在
Qtopia
已经成为了
Trolltech的又一个主打产品,为基于
Linux操作系统的
PDA和手机提供了一个完整的图形环境。
值得特别注意的是在版本
4之前,
Qt/E和
Qtopia是不同的两套程序,
Qt/E是基础类库,
Qtopia是构建于
Qt/E之上的一系列应用程序。但从版本
4开始,
Trolltech将
Qt/E并入到了
Qtopia产品线中去了,并推出了新的
Qtopia4。但实际上原来的
Qt/E仍然作为基础类库,只是改名为
Qtopia
Core了,也许又感觉
Qtopia
Core跟
Qtopia容易让人搞混,所以又改名为
qt-embedded-linux-opensource-linux/wince(
QT也支持
Wince
)。它作为嵌入式版本的核心,既可以与
Qtopia配合,也可以独立使用。而原来的
Qtopia则被分成几层,核心的应用框架和插件系统被称为
Qtopia
Platform,上层的应用程序则按照不同的目标用户分为不同的包,如
Qtopai
PDA,
Qtopia
Phone。
Qte的改名过程,
Qte-->Qtopia
Core-->Qt-embedded-linux-xxxx
Qtopia/QtEmbedded版本对应关系
?
Qtopia1.7.0
/ Qte 2.3.7
Qtopia2.1.1
/ Qte 2.3.10
Qtopia2.1.2
/ Qte 2.3.11
Qtopia2.2.0
/ Qte 2.3.12 (包含在
qtopia2.2源码包中
)
qtopia
2的应用基于
qte
2.3.x的
qtopia
4的应用基于
qtopia
core(相当于原来的
qte)
4.x
四、关于eabi和浮点运算
关于
eabi,原文如下
来自chinaunix
1。什么是
ABI
ABI,
application
binary interface (ABI),应用程序二进制接口。
既然是接口,那就是某两种东西之间的沟通桥梁,此处有这些种情况:
A。应用程序
<-
>
操作系统;
B。应用程序
<-
>
(应用程序所用到的)库
C
。应用程序各个组件之间
类似于
API的作用是使得程序的代码间的兼容,
ABI目的是使得程序的二进制(级别)的兼容。
2。什么是
OABI
和
EABI
OABI中的
O,表示
“Old”,
“Lagacy”,旧的,过时的,
OABI就是旧的
/老的
ABI。
EABI中的
E,表示
“Embedded”,是一种新的
ABI。
EABI有时候也叫做
GNU
EABI。
OABI和
EABI都是专门针对
ARM的
CPU来说的。
3。
EABI的好处/为何要用
EABI
A。支持软件浮点和硬件实现浮点功能混用
B。系统调用的效率更高
C。后今后的工具更兼容
D。软件浮点的情况下,
EABI的软件浮点的效率要比
OABI高很多。
4。
OABI和
EABI的区别
两种
ABI在如下方面有区别:
A。调用规则(包括参数如何传递及如何获得返回值)
B。系统调用的数目以及应用程序应该如何去做系统调用
C。目标文件的二进制格式,程序库等
D。结构体中的填充(
padding/packing)和对齐。
E。
OABI:
*
ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa
*
gcc -dumpmachine: arm-unknown-linux
*
objdump -x for compiled binary:
private
flags = 2: [APCS-32] [FPA float format] [has entry point]
*
"file" on compiled Debian binary:
ELF
32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0,
dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped
*
"readelf -h | grep Flags""
Flags:
0x0
EABI:
*
ABI flags passed by gcc to binutils: -mabi=aapcs-linux
-mfloat-abi=soft -meabi=4
*
gcc -dumpmachine: arm-unknown-linux-gnueabi
*
objdump -x for compiled binary:
private
flags = 4000002: [Version4 EABI] [has entry point]
*
"file" on compiled binary (under Debian):
ELF
32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17,
dynamically linked (uses shared libs), for GNU/Linux 2.4.17, stripped
*
"readelf -h | grep Flags""
Flags:
0x4000002, has entry point, Version4 EABI