嵌入式系统复习绵阳职业技术学院计应班.docx
《嵌入式系统复习绵阳职业技术学院计应班.docx》由会员分享,可在线阅读,更多相关《嵌入式系统复习绵阳职业技术学院计应班.docx(17页珍藏版)》请在冰点文库上搜索。
![嵌入式系统复习绵阳职业技术学院计应班.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/ae7f40e8-62d8-4743-98bf-50dc13ecd70c/ae7f40e8-62d8-4743-98bf-50dc13ecd70c1.gif)
嵌入式系统复习绵阳职业技术学院计应班
考试类型:
一、Linux相关操作命令(10%)
二、单项选择题(30%)
三、问答题(32%)
四、阅读编程及应用题(28%)
平时练习:
(复习提纲)
1、熟悉用户系统相关命令(useradd、passwd、su);
2、熟悉文件操作相关命令(cp、mv、rm、mkdir、cd、pwd、ls、chmod、df、du);
3、熟悉压缩打包相关命令(tar、unzip);
4、掌握网络相关命令(ifconfig、netstar、grep)
5、掌握其他命令(rpm、mount、unmoun、find、ps、man、);
2.命令应用举例
①用useradd命令添加bc用户
参考:
①cd︺/
②useradd︺bc
②用passwd命令设置bc账户密码
参考:
①passwordbc
②根据提示设置密码。
③用cp命令将/home目录下的test文件复制到/tmp目录下
参考:
cp︺/home/test︺/tmp/
④用mv命令将/home下test更名为test1
参考:
mv︺/home/test︺/home/test1
⑤用rm命令删除/home下的test1文件
参考:
rm︺–rf︺/home/test
⑥用mkdir在/home下创建workdir目录
参考:
mkdir︺/home/workdir
⑦用cd命令进入/home/workdir目录
参考:
cd︺/home/workdir
⑧用pwd命令显示当前工作命令的绝对路径
参考:
pwd
⑨用ls命令显示/home目录下的文件与目录
参考:
ls–a/home
(-a:
列出目录中所有文件,包括“.”开头的隐藏文件)
⑩用chmod命令给hello.c文件的所有者、同组用户加上写的权限。
参考:
chmodu+wg+whello.c
⑾用tar命令将/home/tmp下的所有文件和目录打包成一个tmp.tar文件。
参考:
tar–cvftmp.tar/home/tmp/
⑿用tar命令将打包文件tmp.tar在当前目录下解开。
参考:
tar–xvzftmp.tar/home/tmp/
⒀用ifconfig命令配置网卡eth0的IP地址为192.168.0.198;用ifconfig暂停(恢复)网卡eth0的工作;
参考:
①ifconfigeth0192.168.0.198
;②ifconfigeth0down
⒁用netstat命令查看系统中所有的网络监听端口。
参考:
netstat–a
⒂用grep命令在当前目录及子目录中查找包含w字符串的所有文件。
参考:
grep“w”./–rn
⒃用rpm命令安装名为VMwareTools-6.02-59824.i386的文件。
用rpm命令列出所有已安装的rpm文件。
参考:
①rpmVMwareTools-6.02-59824.i386
②rpm-qa
⒄用mount命令将光驱挂载到/mnt目录下,支持中文显示。
参考:
mount–oiocharset=gb2312/dev/cdrom/mnt/cdrom
⒅用find命令在当前目录及子目录下寻找名为test的文件。
参考:
find./-name‘test’
⒆用ps命令查看系统中的所有进程。
参考:
find./-name‘test’
⒇用man命令查看grep命令的使用方法。
参考:
mangrep
选择题型举例:
1.RS232-C串口通信中,表示逻辑1的电平是(D)。
A、0vB、3.3vC、+5v~+15vD、-5v~-15v
2.ARM汇编语句“ADDR0,R2,R3,LSL#1”的作用是(A)。
A.R0=R2+(R3<<1)B.R0=(R2<<1)+R3
C.R3=R0+(R2<<1)D.(R3<<1)=R0+R2
3.若R1=2000H,(2000H)=0x86,(2008H)=0x39,则执行指令LDRR0,[R1,#8]!
后R0的值为(D)。
A.0x2000B.0x86C.0x2008D.0x39
4.寄存器R13除了可以做通用寄存器外,还可以做(C)。
A、程序计数器B、链接寄存器C、栈指针寄存器D、基址寄存器
5.ARM指令集和Thumb指令集分别是(D)位的。
A.8位,16位B.16位,32位C.16位,16位D.32位,16位
6.存储一个32位数0x2168465到2000H~2003H四个字节单元中,若以大端模式存储,则2000H存储单元的内容为(A)。
A、0x21B、0x68C、0x65D、0x02
7.S3C2420XI/O口常用的控制器是(D)。
(1)端口控制寄存器(GPACON-GPHCON)。
(2)端口数据寄存器(GPADAT-GPHDAT)。
(3)外部中断控制寄存器(EXTINTN)。
(4)以上都是。
8.和PC机系统相比下列哪个不是嵌入式系统独具的特点(C)
A、系统内核小B、专用性强C、可执行多任务D、系统精简
9.S3C2410X处理器为用户进行应用设计提供了支持多主总线的IIC接口。
处理器提供符合IIC协议的设备连接的串行连接线为(C)。
A.SCL和RTXB.RTX和RCXC.SCL和SDAD.SDA和RCX
10.如果BootLoader、内核、启动参数以及其他的系统映像四部分在固态存储设备上分别存放,则其存储结构的分配顺序应当是(C)。
A.文件系统、内核、启动参数、Bootloader。
B.启动参数、Bootloader、内核、文件系统。
C.Bootloader、内核、启动参数、文件系统。
D.Bootloader、启动参数、内核、文件系统。
11.(B)不是进程和程序的区别。
A.程序是一组有序的静态指令,进程是一次程序的执行过程。
B.程序只能在前台运行,而进程可以在前台或后台运行。
C.程序可以长期保存,进程是暂时的。
D.程序没有状态,而进程是有状态的。
12.要配置NFS服务器,在服务器端主要配置(C)文件
A./etc/rc.d/rc.inet1B./etc/rc.d/rc.M
C./etc/exportsD./etc/rc.d/rc.S
13.进程有(B)三种状态。
A.准备态、执行态和退出态B.精确太、模糊太和随机态
B.手工态、自动态和自由态D.运行态、就绪态和等待态
14.嵌入式系统的开发通常是在交叉开发环境实现的,交叉开发环境是(A)
A.在宿主机上开发,在目标机上运行。
B.在目标机上开发,在宿主机上运行。
C.在宿主机上开发,在宿主机上运行。
D.在目标机上开发,在目标机上运行。
判断题型举例:
1.ARM处理器结构体系中具有T变种处理器核可以工作在ARM状态和Thumb状态。
(√)
2.由于CPU内部寄存器的访问速度较高,根据ATPC标准,应尽可能使函数的参数控制在4个以下。
(√)
3.S3C2410的处理器对内存的访问只能通过Load/Store指令来实现。
(√)
4.C语言程序可以嵌套加入汇编程序模块。
(√)
5.ARM处理器的运行模式可通过中断或异常处理改变(√)
6.嵌入式软件一般情况下调试器和被调试程序运行在相同的计算机上。
(x)
7.每个人的口袋中都装着ARM。
(√)
8.ARMCPU工作的System与User模式的主要异同点是:
System模式与User模式的运行环境一样,但是它可以不受任何限制地访问任何资源,该模式主要用于运行系统中的一些特权任务(√)
问答题、编程题举例:
1、嵌入式系统的定义、主要特点。
答案要点:
目前国内一个普遍被认同的定义是:
以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
主要特点:
①是专用的计算机系统,用于特定的任务;②资源较少,可以裁减;③功耗低,体积小,集成度高,成本低;④使用实时操作系统;⑤可靠性要求更高,具有系统测试和可靠性评估体系;⑥运行环境差异大;⑦大部分程序固化在ROM中;⑧较长的生命周期;⑨嵌入式微处理器通常包含专用调试电路
2、实验箱中的系统软件由那几部分组成?
如何给下位机配置(烧写)文件系统?
下位机的软件系统由Bootloader 系统内核、根文件系统和应用程序四部分组成。
Bootloader相当于PC机上的BIOS,在下位机加电时自动运行,执行硬件初始化和调用系统内核的功能。
Bootloader分为U-boot、Vivi、Blob、ARMBoot、RedBoot等多种,本实验使用实验箱自带光盘中的vivi。
如何给实验箱烧写文件系统,请参考教材P196~198。
3、ARM处理器中,引起异常的原因有哪些?
原因主要:
a.指令执行引起的异常,如:
软件中断、未定义指令(包括所要求的协处理器不存在是的协处理器指令)、预取址中止(存储器故障)、数据中止。
b.外部产生的中断,如:
复位、FIQ、IRQ。
4、Bootloader的作用是什么?
参考:
简答说来,Bootloader就是操作系统内核运行的一小段程序。
完成初始化系统硬件及设置的任务,包括CPU、SDRAM、Flash和串口等的初始化,以及时钟的设置和存储器的映射。
也可以这样描述:
BootLoader是系统加电后、操作系统内核或用户应用程序运行之前,首先必须运行的一段程序代码。
通过这段程序,为最终调用操作系统内核、运行用户应用程序准备好正确的环境。
(对于嵌入式系统来说,有的使用操作系统,也有的不使用操作系统,但在系统启动时都必须运行BootLoader,为系统运行准备好软硬件环境。
)
5、简述网络文件系统NFS,并说明其作用。
NFS即网络文件系统,是主机通过网络进行文件共享的协议。
通常用于Unix和Linux系统中。
NFS服务器的共享目录可以被NFS客户端作为文件系统挂载到本地。
NFS通常用于局域网中的文件共享,其特点是不需要将文件下载到本地即可访问。
6、ARM的异常有哪几种,各进入何种工作模式?
他们退出各采用什么指令?
答:
1)复位(Reset)异常(管理模式);
2)未定义指令(undefinedinstruction)异常(未定义模式);
3)软件中断(SWI)异常(管理模式);
4)指令预取中止(PrefechAbort)异常(中止模式);
5)数据访问中止(DataAbort)(中止模式);
6)快速中断请求(FIQ)(FIQ模式);
7)外部中断请求(IRQ)(IRQ模式)。
异常返回指令:
1)SWI,未定义的返回:
MOVSPC,R14;2)IRQ,FIQ,预取中止的返回:
SUBSPC,R14,#4;3)数据中止返回并重新存取:
SUBSPC,R14,#8
异常中断的优先级:
复位(最高优先级)-->数据异常中止--->FIQ-->IRQ--->预取指异常中止--->SWI---->未定义指令(包括缺协处理器)。
7、假定在目录/home/arm下有一个C程序,该程序由几个单独的文件组成,而这几个文件又分别包含了其他文件,如下表所示:
文件
包含文件
main.c
stdio.htable.h
list.c
list.h
symbol.c
symbol.h
Table.c
table.h
Table.h
symbol.h,list.h
请完成下列任务:
(1)编写Makefile文件,最终的目标文件为hello(交叉编译器为arm-unknown-linux-gcc)
(2)将目标机/home/arm目录通过网络文件系统挂载/mnt到宿主机(其IP为192.168.9.10)的。
解答:
(1)Makefile文件的编写:
①最容易理解的写法
hello:
main.olist.osymbol.otable.o
armv4l-unknown-linux-gcc-oprogmain.olist.osymbol.otable.o#行前按TAB键
main.o:
main.ctable.hsymbol.hlist.h
armv4l-unknown-linux-gcc-c-omain.omian.c#行前按TAB键
list.o:
list.clist.h
armv4l-unknown-linux-gcc-c-olist.olist.c#\行前按TAB键
symbol.o:
symbol.csymbol.h
armv4l-unknown-linux-gcc-c-osymbol.osymbol.c#\行前按TAB键
table.o:
table.ctable.hsymbol.hlist.h
armv4l-unknown-linux-gcc-c-otable.otable.c#\行前按TAB键
clean:
rmhello*.o#\行前按TAB键
②更好(高效)的写法是:
CC=armv4l-unknown-linux-gcc#指明采用交叉编译器
EXEC=hello#表示编译后生成的可执行文件名为fact
OBJS=main.olist.osymbol.otable.o#给出目标文件列表
CFLAGS+=#给出编译参数
LDFLAGS+=-static#给出链接参数
all:
$(EXEC)#编译主入口
$(EXEC):
$(OBJS)
$(CC)$(LDFLAGS)-o$@$(OBJS)#注意行前空白由一个TAB制表符生成
clean:
#清除编译结果
-rm-f$(EXEC)*.elf*.gdb*.o#注意行前空白由一个TAB制表符生成
(2)mount-tnfs-onolock192.168.0.10:
/home/arm/mnt
8、什么是交叉编译?
嵌入式系统开发中为什么要使用交叉编译?
所谓交叉编译,是指在一个平台上编译生成在另一个平台上运行的可执行程序。
之所以采用交叉编译,这是因为目标平台上不具备直接运行开发环境的条件。
9、嵌入式开发的基本过程有哪几步?
答:
嵌入式开发的基本过程为:
采用相应的编辑工具编写应用程序,然后在上位机编译调试应用程序,然后使用NFS将上位机上编译好的文件下载到下位机上运行。
10、ARM支持哪两种数据存储格式,简单描述各自特点。
解答:
分为大端格式和小端格式。
大端格式:
被存放字数据的高字节存储在存储系统的低地址中,而被存放的字数据的低字节则存放在存储系统的高地址中。
小端格式:
与大端存储格式相反,在小端存储格式中,存储系统的低地址中存放的是被放字数据中的低字节内容,存储系统的高地址存放的是被存字数据中的高字节内容。
11、程序、进程、线程有何区别?
要点:
程序是编译后形成的可执行代码,是静止的。
进程是程序的一次执行,是活动的。
线程是进程的可执行单元,同一进程的不同线程共享进程的资源和地址空间。
12、如何在c语言程序中内嵌汇编?
答:
内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。
嵌入式汇编在形式上表现为独立定义的函数体。
(具体请参考教材Page183~184代码实例9-10、9-11)
13、编写一个打印3000~5000之间素数的程序,将上述程序的源代码分散在两个文件中,其中一个文件包含main()函数,另一个文件包含prime()函数。
编写makefile文件实现对这两个文件的编译。
修改其中一个文件后,再进行编译,观察make的输出信息。
假设上述程序的源代码包含两个C语言源文件,a.c和a1.c,其中main()函数包含在a.c中,如下所示。
a.c:
#include
#include
intprime(int);
voidmain()
{
inta,k;
for(a=3000;a<=5000;a++)
{
k=prime(a);
if(k==1)printf("%d是素数\n",a);
elseprintf("%d不是素数\n",a);
}
}
a1.c:
intprime(intx)
{
inti,j;
i=(x-1);
for(j=2;j<=i;j++)
{
if(x%j==0)
break;
}
if(j
elsereturn1;
}
该工程的makefile文件内容如下。
makefile:
CC=armv4l-unknown-linux-gcc#指明采用交叉编译器
EXEC=fact#表示编译后生成的可执行文件名为fact
OBJS=a.oa1.o#给出目标文件列表
CFLAGS+=#给出编译参数
LDFLAGS+=-static#给出链接参数
all:
$(EXEC)#编译主入口
$(EXEC):
$(OBJS)
$(CC)$(LDFLAGS)-o$@$(OBJS)#注意行前空白由一个TAB制表符生成
clean:
#清除编译结果
-rm-f$(EXEC)*.elf*.gdb*.o#注意行前空白由一个TAB制表符生成
以上文件准备好以后,执行命令“make”或者“makeall”,将根据makefile的内容对该项目进行自动编译,生成可执行文件fact;执行命令“makefact”将运行可执行文件fact;执行命令“makeclean”将删除所有目标文件。
14、如何将宿主机(虚拟机)和下位机(实验箱)的IP地址配置在同一网段?
(若下位机的IP地址为192.168.0.121,上位机的IP地址为202.201.33.15,请写出将上位机和下位机的IP地址配置在同一个网段的过程教材P195(3))
解答:
在上位机的终端命令窗口中键入下面的命令,可以将上位机和下位机的IP地址配置在同一个网段192.168.0.*
ifconfigeth0192.168.0.252netmask255.255.255.0
13.给定一个32位整形变量a,1)设置a的bit30位为1。
2)清除a的bit22位。
以上两个操作中,要保持其他位不变。
写出相关的汇编代码或C语言代码片段。
解答:
参考答案
汇编代码片段:
LDRR0,=0x40000000;D31=1,D30~D0=0
LDRR1,a
EORR1,R1,R0;R1(or)R0saveR1
LDRR0,=0xFFBFFFFF;D22=0,其余D为1
ANDR1,R1,R0;R1(and)R0saveR1
SRTR1,a;R1saveavariable
C代码片段:
inta;
a|=(1<<31);//a31=1,其余位不变。
a&=~(1<<22);//a22=0,其余位不变。
15.ARM汇编和C语言混合编程的例子:
(参考教材P178实例9-2)
#include
voidmy_strcpy(constchar*src,char*dst)
{
intch;
__asm
{
loop:
#ifndef__thumb
//ARMversion
LDRBch,[src],#1
STRBch,[dst],#1
#else
//Thumbversion
LDRBch,[src]
ADDsrc,#1
STRBch,[dst]
ADDdst,#1
#endif
CMPch,#0
BNEloop
}
}
intmain(void)
{
constchar*a="Helloworld!
";
charb[20];
my_strcpy(a,b);
printf("Originalstring:
'%s'\n",a);
printf("Copiedstring:
'%s'\n",b);
return0;
}
实验部分:
请参考Lab_9教材作者给的程序,编写出让博创UP-TECH实验箱S3c2410两位数码管显示:
教材的原来的程序功能:
00(delay1.5s)→11→22→。
。
。
→99
#include
#include
#include
#include
#include
#include
#defineTUBE_IOCTROL0x11
#defineDOT_IOCTROL0x12
voidjmdelay(intn){
inti,j,k;
for(i=0;ifor(j=0;j<100;j++)
for(k=0;k<100;k++);
}
intmain(){
intfd;
inti;
unsignedintLEDWORD;
unsignedcharLEDCODE[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
unsignedcharman_data[9][8]={
{0x4c,0x92,0x92,0x7c,0x0c,0x12,0x12,0x0c},
{0,0,0,0,0,0,0x0b,0xd3},
{0,0,0,0,0x0b,0xd3,0x3c,0x48},
{0,0,0x0b,0xd3,0x3c,0x4b,0x20,0},
{0,0,0x03,0x13,0xfc,0x08,0,0},
{0,0,0,0x0b,0xd3,0x3c,0x48,0},
{0,0x0b,0xd3,0x3c,0x48,0x20,0,0},
{0,0x08,0x93,0x4b,0x3c,0x24,0x48,0x20},
{0x48,0x20,0,0,0,0,0,0}
};
fd=open("/dev/led/0raw",O_RDWR);
if(fd<0){
printf("####Leddeviceopenfail####\n");
return(-1);
}
LEDWORD=0xff00;
printf("willenterTUBELED,pleasewaiting..............\n");
LEDWORD=0xff00;
ioctl(fd,0x12,LEDWORD);
sleep
(1);