嵌入式改2.docx
- 文档编号:7736238
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:18
- 大小:83.80KB
嵌入式改2.docx
《嵌入式改2.docx》由会员分享,可在线阅读,更多相关《嵌入式改2.docx(18页珍藏版)》请在冰豆网上搜索。
嵌入式改2
简答题
1.什么是交叉编译
交叉编译是在一种平台上编译出能够运行在体系结构不同的另一种平台上的程序。
(比如PC平台上编译出能运行在以ARM为内核的CPU平台上的程序)
2.什么是交叉编译器
能够实现交叉编译的工具称为交叉编译器
3.为什么嵌入式系统开发需要使用交叉编译工具链
由于一般嵌入式系统存储大小与处理器性能有限,通常都要在性能优越的PC上建立交叉编译工具链,用该交叉编译工具链在PC平台上编译目标机上要运行的程序。
4.Linux系统的交叉编译工具链由哪几个部分组成
交叉编译工具链主要binutils,gcc,glibc三个部分组成
5.构建交叉编译工具链的有几种方法与及其特点
方法一:
分步配置、编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。
特点:
易出错,相对比较难,适合想深入学习构建交叉编译工具链的人员
方法二:
通过Crosstool脚本工具来实现自动编译生成交叉编译工具链
特点:
相对比方法一简单,并且出错的机会非常少,建议大多数情况下使用该方法构建交叉编译工具链
方法三:
直接通过网上下载已经制作好的交叉编译工具链
优点:
简单省事;缺点:
没有灵活性,所以构建所用的库以及编译器的版本也许并不适合要编译的程序。
方法四:
开发商提供的交叉编译工具链
优点:
简单省事,很好的适应开发板环境;缺点:
没有灵活性,所以构建所用的库以及编译器的版本也许并不适合要编译的程序。
6.Bootloader是什么,及其作用(课本102页)
BootLoader就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统硬件环境,为最终调用操作系统内核做好准备。
7.嵌入式系统为什么需要Bootloader
对于嵌入式系统,Bootloader是基于特定硬件平台来实现的。
因此,几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader。
Bootloader不但依赖于CPU的体系机构,而且依赖于嵌入式系统板级设备的配置。
8.Bootloader启动过程两个阶段的完成什么任务,各有什么特点
两个阶段完成的任务:
BootLoader的stage1通常包括以下步骤:
(1).硬件设备初始化。
(2).为加载BootLoader的stage2准备RAM空间。
(3).拷贝BootLoader的stage2到RAM空间中。
(4).设置好堆栈。
(5).跳转到stage2的C入口点。
BootLoader的stage2通常包括以下步骤:
(1).初始化本阶段要使用到的硬件设备。
(2).检测系统内存映射(memorymap)。
(3).将kernel映像和根文件系统映像从flash上读到RAM空间中。
(4).为内核设置启动参数。
(5).调用内核。
特点:
依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。
而stage2则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。
9.常用Bootloader有哪些
BLOB、U-boot、RedBoot、ViVi
10.常见的几种嵌入式操作系统?
uClinux、ecos
11.makeclean与makemrproper的区别(课本160页)
clean目标可以清除大多数生成的文件,但是保留.config
mrproper可以清除所有生成的文件,包括.config和各种备份文件
注意,使用时记得加make。
如makeclean
12.uClinux与标准linux内核的区别
1)uClinux文件大约290M,标准linux内核文件约为35M
2)uClinux包含:
非标准的linux2.0、2.4和2.6三种内核;包含uClibc(精简的glibc库);包含应用工具BusyBox;
3)uClinux编译后同时生成内核、库、BusyBox工具和文件系统
4)uClinux没有MMU内存管理单元,则编译一般使用arm-elf-tools工具
13.嵌入式系统的定义,组成(课本第1页)
定义:
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统。
嵌入式系统与通用计算机系统的本质区别在于系统应用不同,嵌入式系统是将一个计算机系统嵌入到对象系统中。
组成:
嵌入式系统一般包含嵌入式微处理器、外围硬件设备、嵌入式操作系统和应用程序4个部分。
14.RISC处理器特点(s3c2410)(课本第8页)
(1)体积小、低功耗、低成本、高性能。
(2)支持Thumb(16位)/ARM(32位)双指令集,能很好地兼容8/16位器件。
(3)大量使用寄存器,指令执行速度更快。
(4)大多数数据操作都在寄存器中完成。
(5)寻址方式灵活简单,执行效率高。
(6)指令长度固定。
15.简述Cramfs文件系统的特点
1)Cramfs被设计为简单并且非常小的可压缩的文件系统;
2)Cramfs主要用于较小的ROM的嵌入式系统;
3)Cramfs是一个压缩式的文件系统,但它不需要一次性将文件系统中的所有内容都解压缩到内存;
4)Cramfs中解压缩都是由Cramfs文件系统自身进行维护,用户并不需要了解过程,增强了透明度。
16.字符设备和块设备区别
(1)字符设备传输数据是按字节的大小传输。
(2)块设备是以块为单位传输,通常块的大小是1024字节
(3)其次字符设备通常是直接作用于I/O端口
(4)块设备是间接作用的,因为它与内核之间是有缓冲区的
17、SamsungS3C2410的特点?
S3C2410是著名的半导体公司Samsung推出的一款32位RISC处理器,为手持设备和一般类型的应用提供了低价格、低功耗、高性能微控制器的解决方案。
S3C2410的内核基于ARM920T,带有MMU功能,采用0.18µm工艺,其主频可达203MHZ。
8、编译工具链的流程?
(1)做好准备,下载工具源代码包和补丁,准备内核头文件,创建工作目录等
(2).编译binutils。
(3)编译辅助编译器。
(4)编译glibc库。
这里要使用交叉编译工具链
(5).编译生成完整的GCC编译器。
其他
1、如何理解实时性以及哪些嵌入式操作系统具有实时性?
所谓实时性,就是在确定的时间范围内响应某个事件的特性。
µC/OS、VxWorks、Neculeus、Linux和WindowsCE等。
2、嵌入式Linux的概念?
所谓嵌入式Linux是指Linux在嵌入式系统中的应用,而不是什么嵌入式功能。
实际上,嵌入式Linux和Linux是同一件事。
3、Linux的发展历史?
Linux起源于1991年
Linux1.0正式发行于1994年3月,仅支持386的单处理器系统
Linux2.0发行于1996年6月
Linux2.4于2001年1月发布
Linux2.6于2003年12月发布
4、Linux内核、Linux操作系统和Linux发行版的关系?
操作系统是由内核和应用程序组成的,不同的人或者公司根据自己的需要放入不同的内核和应用程序构成不同的操作系统,我们称这些为操作系统的发行版。
而操作系统是个抽象的概念,我们所看到的都是操作系统发行版。
5、为什么需要交叉开发环境?
由于嵌入式系统的硬件一般有很大的局限性,或者处理器频率很低,或者存储空间很小,或者没有键盘、鼠标设备。
这样的硬件平台无法胜任庞大的Linux系统开发任务。
因此,开发者提出了交叉开发环境模型。
交叉开发环境是由开发主机和目标板两套计算机系统构成的。
目标板Linux软件是在开发主机上编辑、编译,然后加载到目标板上运行的。
6、嵌入式Linux系统的组成部分?
嵌入式Linux系统包含Bootloader(引导程序)、内核和文件系统3部分。
ARM公司的成立时间,地点?
1991年ARM公司成立于英国剑桥。
7、文件系统的判断
YAFFS是一种专门为NANDflash设计的文件系统
(1)YAFFS基于日志的文件系统,提供磨损平衡和掉电恢复的鲁棒性
(2)YAFFS充分考虑了NAND内存的特点,根据NAND内存以页面为单位存取的特点,将文件组织成固定大小的数据段。
(3)利用NAND内存提供的每个页面16B的备用空间来存放ECC(ErroeCorrectionCode)和文件系统的组织信息,不仅能够实现错误检测和坏块处理,也能够提高文件系统的加载速度。
(4)YAFFS采用一种多策略混合的垃圾回收算法,结合了贪心策略的高效性和随机选择的平均性,达到了兼顾损耗平均和系统开销的目的
RomFS文件系统的特点
a)RomFS是一个空间利用有效的只读文件系统;
b)RomFS是一个块文件系统
c)内核2.4、2.5、2.6代码都支持RomFS
d)RomFS是根文件系统中存储空间要求最小的一个
JFFS2文件系统的特点
a)JFFS2是嵌入式系统中应用最广的一种文件系统
b)具有日志结构,提供垃圾回收机制
c)由于基于日志结构,意外掉电仍然可保持数据完整
d)缺点:
挂载时间长,扩展性差
NFS文件系统的特点
a)网络文件系统
b)允许一个系统在网络上与其他主机共享目录和文件
c)使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件
优点:
本地工作站可以使用更少磁盘空间
用户不必在每个网络上的计算机里都有一个home目录
移动存储器可以被识别与使用
8、U-Boot源代码分为哪三类?
(1)第一类是与处理器体系结构或者开发板硬件之间相关
(2)第二类是一些通用的函数或者驱动程序
(3)第三类是U-Boot的应用程序,工具或者文档
9、SkyEye与Vmware的区别?
(自行整理)
10、常用的嵌入式系统C语言库?
glibc,uclibc,dietlibc,newlib
11、什么是busybox
(1)busybox集成了一百多个最常用linux命令和工具软件
(2)用户可以非常方便地在busybox中制定所需的应用程序
(3)busybox可以有效地减小bin程序的体积
(4)busybox可以大大简化制作嵌入式系统根文件系统的过程
12、为什么要构造交叉开发模式?
由于嵌入式系统硬件上的特殊性,一般不能安装发行版的linux系统。
于是人们想到了交叉开发模式
13、什么叫交叉开发?
在开发主机上,可以安装开发工具,编辑,编译目标板的linux引导程序、内核和系统文件,然后在目标板上运行,通常这种在主机环境下开发,在目标板上运行的开发模式叫交叉开发。
14、如何构造交叉开发环境?
(1)创建开发环境工具链
(2)通信接口的作用(串口:
发送命令USB口:
烧写EOS到NANDFlash网口:
通过tftp下载内核JTAG:
:
烧写bootloader到NORFlash)
20、make工具与makefile文件的作用?
Make工具是通过makefile文件来描述源程序之间的相互联系并自动维护编译工作。
Makefile两个作用,一是编译所在目录的文件,二是进入子目录调用子目录的makefile。
21、GNUBinutils的概念?
GNUBinutils是一套用来构造和使用二进制所需的工具集
22、GCC的概念?
GCC是一个用于linux系统下编程的编译器。
GCC不再单只是GNUCcompiler的意思了,而是GUNcompilercollection即编译家族的意思了,目前已经成为linux下最重要的软件开发工具之一。
23、高级语言从编译到应用程序的过程?
C语言(*.c)经过预处理(*.c)和编译之后(*.s)经过汇编(*.o)
24、ARM的CPU、处理器、开发板之间的关系?
ARM的CPU只是提供算术逻辑等应用,ARM公司只设计cpu,把这一技术卖给半导体商后,被做成各种不同功能的处理器,购买处理芯片,搭建一个系统,焊接成板即为开发板。
分析题
1、交叉编译工具链的安装?
rpm
(1)将armv4l-unknown-linux-toolchain.tar.bz2复制到虚拟机中的共享目录share
(2)在/home下创建/toolchain安装目录:
mkdir/home/toolchain
(3)进入该目录:
cd/home/toolchain
(4)复制交叉编译工具链文件包至安装目录
cp/mnt/hgfs/share/armv4l-unknown-linux-toolchain.tar.bz2/home/toolchain
(5)解压文件包:
tarxvjfarmv4l-unknown-linux-toolchain.tar.bz2
(6)若armv4l-unknown-linux-toolchain.tar.bz2解压后生成的目录为armv4l,则进入解压后的目录:
cdarmv4l
(7)安装交叉编译工具链:
rpm–ivh--force*.rpm
安装目录:
/opt/host/armv4l
A)则交叉编译工具位于bin子目录
B)添加交叉编译工具目录至环境变量:
exportPATH=$PATH:
/opt/host/armv4l/bin
C)该方法添加的环境变量是非永久的。
D)测试linux系统是否识别该交叉编译工具,采用的命令是:
whicharmv4l–unknown-linux-gcc
E)交叉编译工具的使用,编译hello.c程序
armv4l–unknown-linux-gcc-ohello_armhello.c
(8)编译的程序的查看:
filehello_arm
tar
(1)将armv4l-unknown-linux-toolchain.tar.bz2复制到虚拟机中的共享目录share
(2)在/home下创建/toolchain安装目录:
mkdir/home/toolchain
(3)进入该目录:
cd/home/toolchain
(4)复制交叉编译工具链文件包至安装目录
cp/mnt/hgfs/share/armv4l-unknown-linux-toolchain.tar.bz2/home/toolchain
(5)解压文件包:
tarxvjfarmv4l-unknown-linux-toolchain.tar.bz2
(6)若armv4l-unknown-linux-toolchain.tar.bz2解压后生成的目录为armv4l,则进入解压后的目录:
cdarmv4l
(7)交叉编译工具的使用,编译hello.c程序
arm-linux-gcc-ohello_armhello.c
(8)编译的程序的查看:
filehello_arm
2、SkyEye编译、安装(编译的程序hello_arm的测试)
(1)下载skyeye源代码包skyeye-1.1.4.tar.bz2到/home/downloads
(2)创建工作目录:
在/home下创建skyeye安装目录:
mkdir/home/skyeye
(3)复制源码包到工作目录:
cp/home/downloads/skyeye-1.1.4.tar.bz2/home/skyeye
(4)进入工作目录:
cd/home/skyeye
(5)解压源码包:
tar–xvjfskyeye-1.1.4.tar.bz2
(6)进入解压目录:
cdskyeye-1.1.4
(7)编译SkyEye源代码:
makeNO_BFD=1NO_CHECK=1
(8)SkyEye仿真系统的组成:
SkyEye程序、SkyEye配置文件、内核、文件系统
(9)假设内核为Vmlinux,则SkyEye系统的启动:
skyeye-eVmlinux
(10)安装目录:
skyeye/bin子目录下
3、busybox编译、安装
(1)下载busybox源代码包busybox-1.1.4.tar.bz2到/home/downloads
(2)创建工作目录:
在/home下创建skyeye安装目录:
mkdir/home/busybox
(3)复制源码包到工作目录:
cp/home/downloads/busybox-1.1.4.tar.bz2/home/busybox(4)进入工作目录:
cd/home/busybox
(5)解压源码包:
tar–xvjfbusybox-1.1.4.tar.bz2
(6)进入解压目录:
cdbusybox-1.1.4
(7)编译busybox源代码:
makedep(建立依赖关系)makezimage(编译内核)
(8)安装makeinstall
4、U_Boot的编译、安装?
(1)下载U-Boot源代码包u-boot-1.1.4..tar.bz2到/home/downloads
(2)创建工作目录:
在/home下创建bootloader,安装目录:
mkdir/home/bootloader
(3)复制源码包到工作目录:
cp/home/downloads/u-boot-1.1.4.tar.bz2/home/bootloader
(4)进入工作目录:
cd/home/bootloader
(5)解压源码包:
tar–xjfu-boot-1.1.4..tar.bz2
(6)进入解压目录:
cdu-boot-1.1.4.tar.bz2
(7)配置、编译
a)基于S3C2410开发板,配置U_Boot:
makesmdk2410_config
b)配置(设嵌入式处理器为ARM体系结构),ccc的前缀为arm-linux-,则编译源代码生成启动加载程序:
makeARCH=armCROSS_COMPILE=arm-linux-
5、配置、编译linux2.6内核?
(1)准备源码包:
S3C2410-kernel2.4.18_r1.2.tar.bz2
下载的文件包:
S3C2410_kernel2.4.18_r1.2.tar.bz2位于/home/downloads
(2)创建工作目录:
在/home下创建kernel安装目录:
mkdir/home/kernel
(3)复制源码包到工作目录:
cp/home/downloads/S3C2410_kernel2.4.18_r1.2.tar.bz2/home/kernel
(4)进入工作目录:
cd/home/kernel
(5)解压源码包:
tar–xjfS3C2410_kernel2.4.18_r1.2.tar.bz2
(6)进入解压目录:
cdS3C2410_kernel2.4.18_rel
(7)配置(设嵌入式处理器为ARM体系结构),ccc的前缀为arm-linux-,则编译源代码生成启动加载程序:
makemenuconfigARCH=armCROSS_COMPILE=arm-linux-
(8)建立依赖关系:
makedep
(9)编译内核:
makezImage
编译后内核所在目录:
/home/kernel/S3C2410_kernel2.4.18_rel/arch/arm/boot
(10)该命令编译生成的内核为gzip压缩形式。
程序设计
1、驱动程序
(1)LED驱动程序(gpio.h)
#include
#defineGPIO_SET_PIN0
#defineGPIO_CLR_PIN1
#defineGPIO_CFG_PIN_OUT2
#defineGPIO_CFG_PIN_IN3
……………………………….
(gpio.c)
intgpio_open(…,…);
intgpio_release(…,…);
intgpio_ioctl(…,…,unsignedintcmd,unsignedlongarg);
#defineGPIO_MAJOR_NR126
#defineEDVICE_NAME“gpio”
#defineGPIO_CONC_ADDR0xold20010//portC
#defineGPIO_DATA_ADDR0xold20014//portC
structfile_operationsgpio_fops=
{
open:
gpio_open;
release:
gpio_release;
ioctl:
gpio_ioctl;
};
int__initgpio_init(void)
{
register_chrdev(GPIO_MAJOR_NR,DEVICE_NAME,&gpio_fops);
return0;
}
void__exitgpio_cleanup(void)
{
unregister_chrdev(GPIO_MAJOR_NR,DEVICE_NAME);
}
intgpio_open(….,…,)
{
MOD_INC_USE_COUNT;
return0;
}
intgpio_release(…,…)
{
MOD_DEC_USE_COUNT;
return0;
}
intgpio_ioctl(…,….,unsignedintcmd,unsignedlongarg)
{
intnum;
volatileu32*Regconc,*Regdata;
Regconc=(volatileu32*)(GPIO_CONC_ADDR);
Regdata=(volatileu32*)(GPIO_DATA_ADDR);
switch(cmd)
{
caseGPIO_SET_PIN:
*Regdata|=1u< break; caseGPIO_CLR_PIN: *Regdata&=~(1u< break; caseGPIO_CFG_PIN_OUT: *Regconc&=~(1u<<(2*arg+1)); *Regconc|=1u<<(2*arg); break; caseGPIO_CFG_PIN_IN: *Regconc&=~(1u<<(2*arg)); *Regconc&=~(1u<<(2*arg+1)); break; } return0; } (2)驱动测试与应用程序(main.c) #include #include #include“gpio.h” intmain(void) { intfd; intloop; fd=open(“/dev/gpio”,O_RDONLY); ioctl(fd,GPIO_CFG_PIN_OUT,1); ioctl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式