毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 论文 >> 正文

嵌入式LED显示屏控制系统应用研究 第9页

更新时间:2009-10-16:  来源:毕业论文
嵌入式LED显示屏控制系统应用研究 第9页
26
$cp–r include/asm-arm/${TARGET_PREFIX}/include/asm
$cp–r include/asm-generic/${TARGET_PREFIX}/include
设置binutils
binutils包中的工具常用来操作二进制目标文件。该包中最重要的两个工具就是GNU汇编
和链接器ld。尽管as支持许多处理器架构,但是它并不需要让不同的架构使用不同的语法。as
的语法与机器无关。
首先将binutils-2.10.1.tar.gz放到${PRJROOT}/build-tools目录下,解压缩:
$cd build-binutils
$../binutils-2.10.1/configure–target=$TARGET–prefix=${PREFIX}
然后建立实际工具,安装binutils:
$make
$make install
设置引导编译器
该引导编译器只支持C语言,等C链接库编译好以后,需要重新编译gcc并提供完整的C
持。
首先将gcc-2.95.3.tar.gz解压缩并建立引导编译器的配置:
$cd${PRJROOT}/build-tools
$tar xvzf gcc-2.95.3.tar.gz
$cd build-boot-gcc
$../gcc-2.95.3/configure—target=$TARGET—prefix=${PREFIX}\
>--without-headers—with-newlib–enable-languages=c
准备好Makefile后建立编译器,再安装gcc:
$make all-gcc
$make install-gcc
设置C链接库
glibc包由许多链接库组成,它是跨平台开发工具链中,建立过程最麻烦、建立程序最冗长的
glibc是极其重要的一个软件组件,目标板必须靠它来执行或开发大部分的应用程序。
首先解包glibc-2.2.3.tar.gz和glibc-linuxthreads-2.2.3.tar.gz:
$cd${PRJROOT}/build-tools
$tar xvzf glibc-2.2.3.tar.gz
$tar xvzf glibc-linuxthreads-2.2.3.tar.gz—directory=glibc-2.2.3
然后建立C链接库:
$cd build-glibc
$CC=arm-linux-gcc../glibc-2.2.3/configure—host=$TARGET—prefix=”usr”\
>--enable-add-ons—without-headers=${TARGET_PREFIX}/include
配置命令脚本完成设定后,接着编译并安装glibc:
$make
$make install_root=${TARGET_PREFIX}prefix=””innstall
完成工具链的设置
到此整个跨平台的工具链就设置好了,在arm-linux开发过程中对它的使用将会像原生的第四章基于Linux的软件设计
27
工具链一样频繁。
表4.1列出了tools目录中第一层子目录:
目录内容
bin交叉开发工具
arm-linux目标板专用文件
include供交叉开发工具使用的头文件
info gcc的info文件
lib供交叉开发工具使用的工具链
man交叉开发工具的在线说明文件
share交叉开发工具与链接库共享的文件
表4.1${PRJROOT}/tools目录的内容
其中有两个目录最重要:bin和arm-linux。bin目录包含了交叉开发工具链所有的工具程序
们将会在主机上使用这些工具来为目标板开发应用程序。arm-linux目录中的软件组件都回应用
标板上。它的主要内容是目标板的头文件和运行时链接库。
4.2.2快速启动技术
图4.1系统层次图
图4.1为系统层次图。台式机的Linux从启动到登录shell界面会耗费很时间,要缩短Lin
统启动时间,就必须搞清楚Linux的启动过程。
内核启动后执行的第一个函数是start_kernel()。它完成下面一系列初始化工作。
printk(),显示内核版本信息
setup_arch(),做与体系结构相关的初始化工作。
parse_options(),解释系统参数。
trap_init(),设置系统异常入口点。
init_IRQ(),初始化系统中断服务。
sched_init(),系统调度器的初始化。
time_init(),时钟、定时器的初始化。
softirq_init(),系统软中断初始化。
console_init(),控制台初始化。
kmem_cache_init(),内核cache初始化。东南大学硕士学位论文
28
calibrate_cache_init(),校准时钟。
fork_init(),内存初始化。
buffer_init(),创建及设置通用cache。
fork_init(),建立uid_cache,并根据系统内存大小来确定最大进程数目。
check_bugs(),块设备缓冲区初始化。初始化一系列cache。
kernel_thread(),创建第一个核心进程,启动init进程。
cpu_idle(),运行idle进程。
接下去作的工作由init()函数完成。init()首先锁定内核,然后调用do_basic_setup()来完成外
备以及驱动程序的初始化。外设的初始化要根据内核配置来决定,在本系统下,需要如下初始
作:
网络初始化。
一系列其他设备初始化。
start_context_thread()创建设事件管理核心进程keventd。
通过do_initcalls()函数来启动任何使用__initcall标识的函数。
文件系统初始化。
加载文件系统。
do_basic_setup()完成后,init()会释放初始化函数所用的内存,并且打开/dev/console设备重
向工作台,让系统调用execve来执行init。到这里内核初始化工作已经完成,下面是用户态进
始化。
init程序存放在/sbin下,它的运行需要读取/etc/inittab文件决定它的具体工作内容。
要缩短系统启动时间,就要搞清楚启动过程中每一部分的时间消耗,最后做一些裁减工作
快启动速度。
在内核部分可以利用内核中的do_gettimeofday()函数来直接获得系统时刻,获得的时间值
存储在结构timevel中。
在进入用户态启动后,如果要测试每个服务的启动时间,那就可以直接利用系统
gettimeofday()来获取系统当前时刻。
要真正加快启动时间,就要自己重新写rc.syinit、rc等启动脚本,让它只做一些必要的初始
作及服务的启动。
4.2.3 ramdisk技术
ramdisk是一个内存块,作为一个盘分区使用,也就是将内存模拟为flash空间。使用ram
主要是为了提高访问速度,将文件存放在内存里可以提高性能。
要支持ramdisk,就要在内核编译选项里选择Block devices--->RAM disk support。默认的ram
大小为4MB,对于64MB的SDRAM空间来说足够了。
除了将ramdisk支持选项编译进内核之外,还可以通过对ramdisk的支持编译为模块的方式
需要的时候加载。模块的方式可以在加载模块时动态的决定ramdisk大小。
当编译ramdisk支持为模块形式时,通过向/etc/conf.modules中添加下列语句就可以动态
ramdisk大小。
options rd rd_size=10000
或者在加载模块命令时以参数的形式传:
insmod rd rd_size=10000
本系统可以采用ramdisk加快系统启动过程,把要运行的程序在内存初始化完成后立即进
载,用消耗无力内存的方式换取启动速度。第四章基于Linux的软件设计
29
4.2.4系统小型化技术
嵌入式系统的存储空间有限,要将Linux用于嵌入式系统就要对其进行定制,使这个系统
容量较小的Flash所容纳。
内核配置
通过修改内核代码来达到定制的目的是十分危险的,很容易造成代码的不稳定或者丧失代
灵活性。比较安全的办法是选择合适版本的内核,然后通过内核选项的配置获得既满足功能要
又能缩小体积德内核。
使用命令make menuconfig将开始定制内核,将不必要的功能除去,只留下最基本的一些
模块。
嵌入式C库
Linux作为一个完整地系统,仅仅缩减其内核大小是不够的,还要考虑shell的大小以及与
程序运行相关的C程序库的问题。
虽然glibc功能完善、可移植性强,但它的体积过于庞大而导致系统得开销非常大。为了使
系统更适合在嵌入式设备中运行,需要小容量的标准C库。
sglibc、uClibc、Newlib、dietlibc都是较好的小型C库。
小型shell
shell作为与系统打交道的最简单方式,虽然它不是系统内核的一部分,但是它调用了内核
部分功能来执行程序,建立文件,并以并行的方式协调各个程序的运行。Red Hat所用的she
BASH,它功能强大但体积庞大,而且不包括我们平时常用的一些Linux下的工具,所以用在嵌
系统中不是很合适。
BusyBox、ash是较好的小型shell。
4.2.5网络设备驱动程序开发
Linux网络设备驱动程序是Linux网络应用的重要组成部分,所有的Linux网络驱动程序遵
用的接口。对于每个网络接口,都用一个device的数据结构来表示。通常网络设备是一个物理设
但软件有时也可作为网络设备。在内核启动时,系统通过网络设备驱动程序登记已经存在的网
备。设备用标准的支持网络的机制来把接收到的数据转送到相应的网络层。所有被发送和接收
都用数据结构sk_buff表示。这是一个具有很好的灵活性的数据结构,可以很容易增加或删除网
议数据包的首部。
网络设备使用网络接口管理表dev_base,dev_base是一个指向device结构的指针,因为网
备是通过device数据结构来表示的。dev_base实际上是一条device结构链表的表头,在系统初
完成以后,系统检测到的网络设备将自动的保存在这张链表中,其中每一个链表单元表示一个
的物理网络设备。当要发送数据时,网络子系统将根据系统路由表选择相应的网络接口进行数
输,而当接收到数据包时,通过驱动程序登记的中断服务程序进行数据的接收处理。东南大学硕士学位论文
30
dev_queue_xmit()netif_rx()
struct device
数据包发送
harrd_start_xmit()
中断处理
(数据报接收)
网络物理设备媒介
网络接口协议层
网络设备接口层
设备驱动功能层
设备媒介层
图4.2 Linux网络驱动程序体系结构
Linux网络驱动程序的体系结构如图4.2所示。
网络设备接口层有一个非常重要的数据结构decive构成。这个数据结构是在系统中每一个
的代表,它提供了多种方法,供操作系统或协议层调用。这其中就包括设备初始化时调用的in
数、打开和关闭网络设备的open和stop函数、处理数据包发送的hard_start_xmit函数等。
在这个数据结构里面,主要定义的成员变量是init函数指针,这个函数指针初始化为设备
程序中提供的用来初始化device结构的过程,这个过程实际上是用来检测和驱动网络设备的。
行检测之前,每一个结点的init函数都指向对应的初始化函数;检测时每一个结点都分别调用
函数,如果成功则返回并将该结点保留。
在这个结构里面还定义了对硬件设备的打开和关闭函数指针(open和close)、硬件头的建
数指针(hard_harder)、硬件上数据的传输指针(hard_start_xmit)。当网络设备打开的时候,就
通过这个网络设备开始传输数据了,传输出来的数据存放在struct sk_buff结构里面。hard_srart
函数指针是和某一种具体的硬件相关的,通过在dev_queue_xmit这个外部函数调用hard_start
函数指针完成网络数据的发送过程。
net_device用来抽象一个数据链路层的具体网络接口卡,为IP层访问该设备提供接口。对
层来说,它能看到的就是该设备的net_device,net_device就像是IP与链路层交流的一座桥梁。
Linux网络各层之间的数据传送都是通过sk_buff完成的。sk_buff(套接字缓冲区)提供一
理缓冲区的方法,是Linux系统网络高效运行的关键。每个sk_buff包括一些控制方法和一块数
冲区,这个区域存放了网络数据传输的数据包。控制方法按功能分为两种类型,一种是控制整个b
链的方法,另一种是控制数据缓冲区的方法。sk_buff组织成双向链表的形式,根据网络应用的特
对链表的操作主要是删除表头的元素和添加到链表尾。sk_buff的数据结构在include/linux/sk
文件中定义。
struct sk_buff{
struct sk_buff*next;//sk_buff是一个双向链表,next指向链表后一个
区结点
struct sk_buff*prev;//prev指向前一个缓冲区结点
struct sk_buff_head*list;//链表
struct sock*sk;//套接字
struct timeval stamp;//到达的时间
struct net_device*dev;//使用的设备

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

嵌入式LED显示屏控制系统应用研究 第9页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。