嵌入式实习报告

嵌入式系统实习报告 学 院:

专 业:

班 级:

学 号:

姓 名:

指导老师: 计算机与信息学院电子信息工程 20091111 2009111123 王金民 严朝军 彭文标

嵌入式系统开发与应用概述

在今日,嵌入式ARM 技术已经成为了一门比较热门的学科,无论是在电子类的什么领域,你都可以看到嵌入式ARM 的影子。如果你还停留在单片机级别的学习,那么实际上你已经落下时代脚步了,ARM 嵌入式技术正以几何的倍数高速发展,它几乎渗透到了几乎你所想到的领域。由于嵌入式系统具有体积小、性能强、功耗低、可靠性高以及面向行业具体应用等突出特征, 目前已经广泛地应用于军事国防、消费电子、信息家电、网络通信、工业控制等各个领域。嵌入式的广泛应用可以说是无所不在。

linux系统

linux系统主要是由用户空间和内核空间再加上外部的硬件平台构成,用户空间就是用户应用程序的运行空间,主要包括两方面的内容:用户应用程序和GNU C Library(glibc)。而内核空间有三方面的内容,一是系统调用接口,它作为用户空间和内核空间相互转移的一种方式,二是内核空间,三是体系相关内核代码,在linux内核代码中,可以看到arch目录下有许多子目录,其中每一个子目录代表一种硬件平台。

而为什么要把linux系统划分为用户空间和内核空间呢?主要是一旦用户空间和内核空间没有分开,那用户将拥有很大的权限去操控内核或用户应用程序的崩溃将会造成系统的崩溃,而linux系统是利用cpu的模式分级来分别运行用户空间和内核空间,这样就可以使操作系统得到充分的保护。而现代的cpu通常实现了不同的工作模式,以ARM处理器为例实现了7种运行模式,分别为:

1)用户模式(usr):ARM微处理器正常程序执行模式

2)系统模式(sys):运行具有特权的操作系统任务

3)中断模式(irq):用于通用的中断处理

4)外部中断模式(fiq):用于高速数据传输或通道处理

5)数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护

6)管理模式(svc):操作系统使用的保护模式

7)未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真

ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变,除用户模式外,其他模式都是非用户模式或特权模式,除用户模式和系统模式外,其他模式都是异常模式,常用于处理异常或中断,以及需要访问受保护的系统资源等情况。

同时用户空间和内核空间是程序执行的两种不同状态,通过系统调用和硬件中断去实现用户空间到内核空间的转移,系统调用是主动的,硬件中断是被动的,比如键盘按下或者串口中断。

接下来说说linux的内核架构,它主要是包含7大组成部分

1.内存管理 内存管理的主要作用是使多个进程能安全高效的共享内存区域,通常使用以下两个手段:

①内存映射:将物理内存映射到虚拟内存中,变有限为无限

②有效管理:使用各种内存管理算法(如伙伴算法),减少内存浪费

2.虚拟文件系统 vfs隐藏了各种文件系统的具体细节,为文件操作提供统一的接口

3.网络协议栈 它为linux提供了完善丰富的网络协议实现

4.进程管理 进程管理的重点是创建进程、停止进程,并控制它们之间的通信。进程管理还包括控制活动进程如何共享cpu,即进程调度。

5.设备驱动 设备驱动也是内核的一部分,它不同于内核的其他部件,并且独立于内核的其他部件,同时它是与设备交互的唯一模块,通常由第三方厂商开发,一个驱动程序不与其他驱动程序交互;内核与驱动程序之间也仅通过一个严格定义的接口交互。

6.系统调用接口 SCI层为用户空间提供了一套标准的系统调用函数来访问Linux内核,搭起了用户空间到内核空间的桥梁。

7.体系相关部分

Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具可读性。

下面介绍下这些目录的组成

arch目录

arch是architecture的缩写。内核所支持的每种CPU体系,在该目录下都有对应的子目录。每个CPU的子目录,又进一步分解为boot,mm,kernel等子目录,分别包含控制系统引导,内存管理,系统调用等。其下子目录有

| --x86 /*英特尔cpu及与之相兼容体系结构的子目录*/

| |--boot /*引导程序*/

| | |--compressed /*内核解压缩*/

| |--tools /*生成压缩内核映像的程序*/

| |--kernel /*相关内核特性实现方式,如信号处理、时钟处理*/ | |--lib /*硬件相关工具函数*/

block目录

部分块设备驱动程序

crypto目录

加密、压缩、CRC校验算法

documentation

内核的文档

drivers目录(重点)

设备驱动程序

fs目录

存放各种文件系统的实现代码。每个子目录对应一种文件系统的实现,公

用的源程序用于实现虚拟文件系统vfs。

| |--devpts /* /dev/pts虚拟文件系统*/

| |--ext2 /*第二扩展文件系统*/

| |--fat /*MS的fat32文件系统*/

| |--isofs /*ISO9660光盘cd-rom上的文件系统*/

include目录

内核所需要的头文件。与平台无关的头文件在include/linux 子目录下,与平台相关的头文件则放在相应的子目录中。

init目录

内核初始化代码

ipc目录

进程间通信的实现代码

kernel目录

Linux大多数关键的核心功能都是在这个目录实现。(调度程序,进程控

制,模块化)

lib目录

库文件代码

mm目录

mm目录中的文件用于实现内存管理中与体系结构无关的部分(与体系结

构相关的部分在哪里实现?arch)

net目录

网络协议的实现代码

| |--802 /*802无线通讯协议核心支持代码*/

| |--appletalk /*与苹果系统连网的协议*/

| |--ax25 /*AX25无线INTERNET协议*/

| |--bridge /*桥接设备*/

| |--ipv4 /*IP协议族V4版32位寻址模式*/

| |--ipv6 /*IP协议族V6版*/

samples

一些内核编程的范例

scripts

配置内核的脚本

security

SElinux的模块

sound

音频设备的驱动程序

usr

cpio命令实现

virt

内核虚拟机

Linux内核的配置与编译

Linux内核具有可定制的优点,配置内核的目的是裁剪掉不必要的文件和目录,获得一个最简单的又能满足用户开发的操作系统,以解除嵌入式开发过程中所遇到的存储空间有限的困扰。内核配置与编译的具体步骤如下:

1.清除临时文件、中间文件和配置文件

1)make clean

Remove most generated files but keep the config即清除大部分生成的文件但保留配置文件

2)make mrproper

Remove all generated files + config files即清除所有生成的文件还有配置文件

3)make distclean

Mrproper + remove editor backup and patch files即实现

make mrproper命令的同时删除编辑器备份文件和补丁文件

2.确定目标系统的软硬件配置情况,比如cpu类型,网卡型号,所需支持的网络协议等。

3.使用如下命令之一配置内核:

1) make config:基于文本模式的交互式配置

2)make menuconfig:基于文本模式的菜单型配置

3)make oldconfig:使用已有的配置文件(.config),但是会询问新增的配置选项

4)make xconfig:图形化的配置(需安装图形化系统)

Make menuconfig是最为常用的内核配置方式 如果一个.config文件已经存在,它将使用该文件设置那些默认的值

4.编译内核

编译内核通常也需要几个步骤,一是清除以前编译通过的残留文件;二是编译内核image文件和可加载模块;三是安装模块。

下面是编译内核的具体步骤。

①make dep 命令用在内核2.4或之前,用于建立源文件之间的依赖关系,在执行内核配置命令之后使用,不过在2.6内核中已经取消该命令,该功能由内核配置命令实现。

②make clean 命令用于删除前面留下来的中间文件,该命令不会删除.config等配置文件。这个步骤是可选的,它的目的是清除原先编译过而残留的.com和.o(obj文件)。如果是刚下载的源代码,那么这一步就可以省略了,但是如果已经编译多次内核,这一步是必要的,不然后面可能会出现很多莫名其妙的小问题。 ③make zImage命令用于编译生成压缩形式的内核镜像,当编译成功后,就会在arch\arm\boot\目录下生成zImage文件,大小一般为几百KB。对于嵌入式Linux内核而言,直接将生成的zImage下载到嵌入式目标板的flash中即可。对于较大的内核,如果用make zImage编译,系统会提示使用make bzImage命令来编译,bzImage是big zImage的缩写,可用于生成较大的压缩内核,比如桌面Linux系统内核。

④在配置菜单的过程中,有些选项被选择为模块的,即选项前为[M],并且在回答Enable loadable module support(CONFIG_MODULES)时选了Yes的,则接下来就还要用命令make modules 来编译这些可加载模块,并用

make modules_install将make modules生成的模块文件复制到相应目录,桌面Linux内核一般是在/lib/modules目录下。

⑤制作init ramdisk

mkinitrd initrd-$version $version

例:

mkinitrd initrd-2.6.29 2.6.29

$version 可以通过查询/lib/modules下的目录得到

Ramdisk是将一部分固定大小的内存当做分区来使用。它并非一个实际的文件系统,二是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过ramdisk放在内存中,可以明显的提高系统的性能。在linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。

⑥cp arch/x86/boot/bzImage

/boot/vmlinuz-$version

$version 为所编译的内核版本号

(拷贝initrd-2.6.29到/boot下,将arch/x86/boot/bzImage更名为vmlinuz-2.6.29移动到/boot下)

⑦修改/etc/grub.conf 或者/etc/lilo.conf

(GNU GRUB(简称 GRUB )是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。)

这时重启Linux操作系统,在进入内核时按下回车键进入内核选择界面,选择自己编译的内核,即可进入自己编译的内核的操作系统,用uname -r 可以查看当前内核版本。

嵌入式linux文件系统的制作与移植

文件系统包含两个层次的含义:

1.按照固定格式组织的目录与文件

2.在特定的存储介质上管理这些目录和文件需要的数据

当我们在linux下输入ls / 的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行版在对根文件系统的布局上都遵循FHS(Filesystem Hierarchy Standard)标准的建议规定。

各个目录名称及其存放的内容:

/bin 必备的用户命令,例如ls、cp等

/sbin 必备的系统管理员命令,例如ifconfig、reboot等

/dev 设备文件,例如mtdblock0、tty1等

/etc 系统配置文件,包括启动文件,例如inittab等

/lib 必要的链接库,例如C链接库、内核模块

/home 普通用户主目录

/root root用户主目录

/usr/bin 非必备的用户程序,例如find、du等

/usr/sbin 非必备的管理员程序,例如chroot、inetd等

/usr/lib 库文件

/var 守护程序和工具程序所存放的可变,例如日志文件

/proc 用来提供内核与进程信息的虚拟文件系统,由内核自动生成目录下

的内容

/sys 用来提供内核与设备信息的虚拟文件系统,由内核自动生成目录下

的内容

/mnt 文件系统挂接点,用于临时安装文件系统

/tmp 临时性的文件,重启后将自动清除

根文件系统是Linux启动时使用的第一个文件系统。没有根文件系统,Linux将无法正常启动。根文件系统由一系列目录组成,目录中包含了应用程序、C库、以及相关的配置文件。

那如何制作一个根文件系统呢?主要包括以下步骤:

1、创建根文件系统的目录

如:mkdir bin sbin lib etc dev proc sys usr mnt tmp var

2、创建设备文件

cd dev

mknod -m 666 console c 5 1

mknod -m 666 null c 1 3

cd ..

3、安装/etc

tar -xzvf etc.tar.gz /xxx/rootfs/etc

4、配置busybox

进入busybox目录执行

make menuconfig

进入 Busybox Settings

build Options->

选中 “Build busybox as a static binary”, 静态链接

Cross Compiler prefix (arm-linux-)

Installation Options->

选中 “Don‘t use /usr”, 选中该项可以避免busybox被安装到

宿主系统的/usr目录下,破坏宿主系统

Busybox Installation Prefix (/nfsroot/rootfs)该选项表明编

译后的busybox的安装位置

7、编译、安装busybox

make ARCH=arm CROSS_COMPILE=arm-linux-

make install

前提是系统中安装好了交叉编译工具arm-linux-gcc

至此一个粗略的根文件系统制作完成,下面就需要移植到开发板中。 我们知道ARM嵌入式系统的组成为:

1)bootloader 引导加载器

2)kernel 操作系统内核

3)rootfs 根文件系统 (带GUI,QTopia)

在系统加载完内核后就会去启动根文件系统,而启动根文件系统这个过程被bootargs这个参数控制,所以我们需要修改这个参数以使系统运行我们的根文件系统,但这之前我们需要在宿主机上将根文件系统共享出来。我们先在linux系统中配置好nfs服务器,并且在设置配置文件exports将根文件系统所在路径共享出来,接下来在ARM开发板启动时控制超级终端进入shell界面,在这里输入命令print会显示开发板启动的配置信息,通过set命令我们可以设置bootargs 参数为:

console=ttySAC0

root=/dev/nfs

nfsroot=192.168.0.113:/mynfs/rootfs ip=192.168.0.1:192.168.0.113:192.168.0.1:255.255.255.0::eth0:off

设置完成后用save命令保存设置,输入reset复位命令,ARM系统重启,重启完成后我们看到ARM系统的根文件系统就是我们自己制作的根文件系统。 实习体会

在嵌入式系统中,除了课本上的基础知识外,还学会了软件编程的基本思路,掌握了液晶屏的使用及其电路设计方法;掌握有关音频处理的基础知识;掌握液晶显示文本及图形的方法与程序设计。

通过这次设计,掌握了液晶显示实验、μC/OS-II移植、μC/OS-IILCD显示的工作原理及串口通信实验的工作过程,学会了使用仿真软件Embest EduKit-IV实验平台及ULINK2仿真器套件,并学会通过应用软件仿真来实现各种通信系统的设计,对以后的学习和工作都起到了一定的作用,加强了动手能力和学业技能。虽然花了很长时间编写软件程序设计,但这一切还是理论上的。希望学校能提供机会和条件,让我们能够去真正地将理论和实践相结合。通过这次程序,感觉自己所掌握的知识是那么的有限,还有许多需要改进和不足的地方,同时也帮助了我怎样学好这门课程,增加了我对这门学科的兴趣。总体来说,这次实习我受益匪浅。在摸索该如何设计电路使之实现所需功能的过程中特别有趣,培养了我的设计思维,增加了实际操作能力。在让我体会到了设计电路的艰辛的同时,更让我体会到成功的喜悦和快乐。通过这次实习通信系统的设计,使我更加清楚以后的发展及学习的方向。

相关推荐