嵌入式Linux实时操作系统及应用编程代码与答案.docx
《嵌入式Linux实时操作系统及应用编程代码与答案.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux实时操作系统及应用编程代码与答案.docx(77页珍藏版)》请在冰豆网上搜索。
![嵌入式Linux实时操作系统及应用编程代码与答案.docx](https://file1.bdocx.com/fileroot1/2023-1/21/afff9757-6ebe-4b99-8659-8d83968985a6/afff9757-6ebe-4b99-8659-8d83968985a61.gif)
嵌入式Linux实时操作系统及应用编程代码与答案
嵌入式Linux实时操作系统及应用编程
嵌入式Linux实时操作系统及应用编程
嵌入式Linux实时操作系统及应用编程
嵌入式Linux实时操作系统及应用编程
附录A习题参考答案
嵌入式Linux实时操作系统及应用编程
第1章
1.嵌入式系统是指操作系统和功能软件集成于计算机硬件系统之中。
简单的说就是系统的应用软件与系统的硬件一体化,类似与BIOS的工作方式。
具有软件代码小,高度自动化,响应速度快等特点。
特别适合于要求实时的和多任务的体系。
根据IEEE(国际电气和电子工程师协会)的定义:
嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”(原文为devicesusedtocontrol,monitor,orassisttheoperationofequipment,machineryorplants)。
简单地讲就是嵌入到对象体中的专用计算机系统。
嵌入式系统一般有3个主要的组成部分:
硬件、实时操作系统以及应用软件。
●
图1.1嵌入式系统三个组成部分
硬件:
包括处理器、存储器(ROM、RAM)、输入输出设备、其他部分辅助系统等。
●实时操作系统(Real-TimeOperatingSystem,RTOS):
用于管理应用软件,并提供一种机制,使得处理器分时地执行各个任务并完成一定的时限要求。
●应用软件:
实现具体业务逻辑功能。
2.嵌入式系统的三要素是嵌入、专用、计算机;其中嵌入性指的是嵌入到对象体系中,有对象环境要求;专用性是指软、硬件按对象要求裁减;计算机指实现对象的智能化功能。
广义地说一个嵌入式系统就是一个具有特定功能或用途的计算机软硬件集合体。
即以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
3.嵌入式实时操作系统(Real-TimeOperatingSystem,RTOS)是指操作系统本身要能在一个固定时限内对程序调用(或外部事件)做出正确的反应,亦即对时序与稳定性的要求十分严格。
目前国际较为知名的有:
VxWorks、NeutrinoRTOS、NucleusPlus、OS/9、VRTX、LynuxOS,RTLinux、BlueCatRT等。
4.嵌入式系统一般由硬件层、中间层、软件层和功能层组成。
其作用分别如下:
(1)硬件层:
由嵌入式微处理器、外围电路和外设组成。
外围电路有:
电源电路、复位电路、调试接口和存储器电路,就构成一个嵌入式核心控制模块。
操作系统和应用程序都可以固化在ROM或者Flash中。
为方便使用,有的模块在此基础上增加了LCD、键盘、USB接口,以及其他一些功能的扩展电路。
(2)中间层:
硬件层与软件层之间为中间层,也称为BSP(BoardSupportPackage,板级支持包)。
作用:
将系统软件与底层硬件部分隔离,使得系统的底层设备驱动程序与硬件无关;
功能:
一般应具有相关硬件的初始化、数据的输入/输出操作和硬件设备的配置等功能。
BSP是主板硬件环境和操作系统的中间接口,是软件平台中具有硬件依赖性的那一部分,主要目的是为了支持操作系统,使之能够更好地运行于硬件主板上。
(3)软件层:
主要是操作系统,有的还包括文件系统、图形用户接口和网络系统等。
操作系统是一个标准的内核,将中断、I/O、定时器等资源都封装起来,以方便用户使用。
(4)功能层:
由基于操作系统开发的应用程序组成,用来完成对被控对象的控制功能。
功能层是面向被控对象和用户的,为了方便用户操作,往往需要具有友好的人机界面。
5.非占先式调度法也称作合作型多任务(cooperativemultitasking),各个任务彼此合作共享一个CPU。
中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。
但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。
当系统响应时间很重要时,要使用占先式(preemptive)内核。
最高优先级的任务一旦就绪,总能得到CPU的控制权。
当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。
6.在实时系统中,如果系统在指定的时间内未能实现某个确定的任务,会导致系统的全面失败,这样的系统被称为强实时系统或硬实时系统。
强实时系统响应时间一般在毫秒或微秒级。
在弱实时系统中,虽然响应时间同样重要,但是超时却不会发生致命的错误。
其系统响应时间在毫秒至秒的数量级上,其实时性的要求比强实时系统要差一些。
7.嵌入式系统的设计步骤及各部分的主要工作如下。
(1)需求分析阶段,罗列出用户的需求;
(2)体系结构设计阶段,描述系统的功能如何实现;
(3)详细设计阶段,进行硬件系统与软件系统的分类划分,以决定哪些功能用硬件实现,哪些用软件实现;
(4)系统集成,把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进在设计过程中的错误;
(5)系统测试,对设计好的系统进行测试,看其是否满足给定的要求。
8.Linux作为嵌入式操作系统的优势主要有以下几点:
(1)可应用于多种硬件平台。
Linux已经被移植到多种硬件平台,这对于经费,时间受限制的研究与开发项目是很有吸引力的。
原型可以在标准平台上开发后移植到具体的硬件上,加快了软件与硬件的开发过程。
Linux采用一个统一的框架对硬件进行管理,从一个硬件平台到另一个硬件平台的改动与上层应用无关。
(2)Linux的高度模块化使添加部件非常容易。
本身内置网络支持,而目前嵌入式系统对网络支持要求越来越高。
(3)Linux是一个和Unix相似、以内核为基础的、具有完全的内存访问控制,支持大量硬件(包括X86,Alpha、ARM和Motorola等现有的大部分芯片)等特性的一种通用操作系统。
(4)Linux可以随意地配置,不需要任何的许可证或商家的合作关系。
其程序源码全部公开,任何人可以修改并在GUN通用公共许可证(GNUGeneralPublicLicense)下发行。
这样,开发人员可以对操作系统进行定制,适应其特殊需要。
(5)Linux带有Unix用户熟悉的完善的开发工具,几乎所有的Unix系统的应用软件都已移植到了Linux上。
其强大的语言编译器GCC,C++等也可以很容易得到,不但成熟完善,而且使用方便。
9.(参考答案)Linux执行进程调度一般是在以下情况发生的:
(1)正在执行的进程运行完毕;
(2)正在执行的进程调用阻塞原语将自己阻塞起来进入等待状态;
(3)正在执行的进程调用了P原语操作,从而因资源不足而被阻塞;或调用了V原语操作激活了等待资源的进程队列;
(4)执行中的进程提出I/O请求后被阻塞;
(5)系统分配的时间片已经用完;
以上都是CPU为不可剥夺方式下的引起进程调度的原因。
在CPU方式是可剥夺时,还有下面的原因:
(6)就绪队列中的某个进程的优先级变得高于当前运行进程的优先级,从而也将引起进程调度。
嵌入式Linux实时操作系统及应用编程
第2章
一.填空题:
1、改变目录位置至用户的工作目录
2、改变目录位置至相对路径user的目录下
3、查看当前目录下的文件
4、查看文件.bash_profile的内容
5、分页查看inittab文件内容
6、将目录/tmp下的文件file1复制到当前目录下,文件名为file2
7、将文件file1移到目录dir1下,文件名仍为file1
8、建立一新目录dir1
9、删除目录dir1,但dir1下必须没有文件存在,否则无法删除
10、删除文件名中有五个字符且前四个字符为file的所有文件
11、文件config的内容依次显示到屏幕上
12、以分页方式查看文件名file1的内容
13、以分页方式查看文件名file1的内容
14、显示目录dir1的总容量
15、对于目录dir1,设定成任何使用者皆有读取及执行的权利,但只有所有者可做修改
16、对于文件file1,设定只有所有者可以读、写和执行的权利。
17、将文件file4链接至文件file3。
18、寻找文件file1中包含字符串abc所在行的文本内容。
19、自根目录下寻找文件file1的路径。
20、比较目录dir1与dir2内各文件的不同之处。
二、单项选择题
1.A2.B3.D4.C5.B
6.C7.A8.C9.D10.B
11.A12.D13.D14.B15.B
16.B17.A18.D19.B20.B
嵌入式Linux实时操作系统及应用编程
第3章
一.填空题:
1.next
2.命令模式
3.预处理、编译、汇编和连接
4.stepnext
5.末行模式
6.预处理链接
7.汇编
8.wtest.txt
二、综合题
1.参考答案:
pr1:
prog.osubr.o
gcc–opr1prog.osubr.o
prog.o:
prog.cprog.h
gcc–c–oprog.oprog.c
subr.o:
subr.csubr.h
gcc–c–osubr.osubr.c
2.
(1)
hello:
main.olist.osymbol.otable.o
gcc-oprogmain.olist.osymbol.otable.o
main.o:
main.ctable.hsymbol.hlist.h
gcc-c-omain.omain.c
list.o:
list.clist.h
gcc-c-olist.olist.c
symbol.o:
symbol.csymbol.h
gcc-c-osymbol.osymbol.c
table.o:
table.ctable.hsymbol.hlist.h
gcc-c-otable.otable.c
clean:
rmhello*.o
(2)mount–tnfs–onoclock192.168.0.10:
/home/armtest/hello/mnt
3.
hello.c:
#include
#include
#include
#include"hello.h"
intmain(intargc,char*argv[])
{
printf("HelloWorld!
\n");
message();
return0;
}
hello.h:
voidmessage(void);
message.c:
#include
voidmessage(void){
printf("Thisisamessage!
\n");
}
三.选择题
1.C2.A3.B4.B5.B6.C
7.C8.D9.D10.A11.A
嵌入式Linux实时操作系统及应用编程
第4章
一.选择题
1.A2.C3.D4.D5.C
6.B7.C8.A9.D10.D
11.D12.D13.D14.B15.D
16.B17.A18.C19.C20.C
二.简答题
1、Linux内核的编译菜单有好几个版本,运行:
(1)makeconfig:
进入命令行,可以一行一行的配置,但使用不十分方便。
(2)makemenuconfig:
大多数开发人员使用的Linux内核编译菜单,使用方便。
(3)makexconfig:
在2.4.X以及以前版本中xconfig菜单是基于TCL/TK的图形库的。
2、在完成内核的裁减之后,内核的编译就只要执行以下几条命令:
makeclean编译内核之前先把环境给清理干净。
有时你也可以用makerealclean或makemrproper来彻底清除相关依赖,保证没有不正确的.o文件存在。
makedep编译相关依赖文件
makezImage创建内核镜像文件
makemodules创建内核模块,若不创建内核模块,这步可以不要。
makeinstall把相关文件拷贝到默认的目录。
在给嵌入式设备编译时这步可以不要。
因为具体的内核安装还需要你手工进行。
3、此命令是装载压缩映像文件zImage到flash存储器中,地址是kernel分区,并采用xmodem传输协议。
4、此命令是设置网卡1的地址192.168.1.1,掩码为255.255.255.0,不写netmask参数则默认为255.255.255.0。
5、此命令将nfs服务的共享目录sharedir加载到/mnt/nfs。
6、此命令是装载根文件系统root.cramfs到flash存储器中,地址是根文件系统分区,并采用xmodem传输协议。
7、这个命令的操作同时进行了分区和格式化,0~128K存放vivi,128K~192K存放VIVI控制台指令,192K~1216K存放kernel,1216K~4288K存放root,其余部分存放应用程序。
嵌入式Linux实时操作系统及应用编程
第5章
一.选择题
1.B2.C 3.C4.C5.D6.C
二.综合应用题
1.
Tomismyfriend
Jackismyfriend
Harryismyfriend
2.
(1)程序注释
#!
/bin/sh定义实用的shell
#
#/etc/rc.d/rc.httpd注释行,凡是以星号开始的行均为注释行。
#
#Start/stop/restarttheApachewebserver.
#
#TomakeApachestartautomaticallyatboot,makethis
#fileexecutable:
chmod755/etc/rc.d/rc.httpd
#
case"$1"in#case结构开始,判断“位置参数”决定执行的操作。
本程序携带一个“位置参数”,即$1
'start')#若位置参数为start
/usr/sbin/apachectlstart;;#启动httpd进程
'stop')#若位置参数为stop
/usr/sbin/apachectlstop;;#关闭httpd进程
'restart')#若位置参数为stop
/usr/sbin/apachectlrestart;;#重新启动httpd进程
*)#若位置参数不是start、stop或restart时
echo"usage$0start|stop|restart";;#显示命令提示信息:
程序的调用方法
esac#case结构结束
(2)程序的功能是启动,停止或重新启动httpd进程
(3)程序的调用方式有三种:
启动,停止和重新启动。
3.
#!
/bin/sh
FILENAME=
echo“Inputfilename:
”
readFILENAME
if[-c"$FILENAME"]
then
cp$FILENAME/dev
fi
4.
#/bin/bash
typesetfirstsecond
read-p"Inputthefirstnumber:
"first
read-p"Inputthesecondnumber:
"second
result=$[$first+$second]
echo"resultis:
$result"
exit0
5、
#!
/bin/sh
i=1
while[i-le50]
do
if[-d/userdata];then
mkdir-p/userdata/user$i
chmod754/userdata/user$i
echo"user$i"
let"i=i+1"(或i=$(($i+1))
else
mkdir/userdata
mkdir-p/userdata/user$i
chmod754/userdata/user$i
echo"user$i"
let"i=i+1"(或i=$(($i+1))
fi
done
嵌入式Linux实时操作系统及应用编程
第6章
一.简答题
1.使用虚拟地址寻址整个系统的主存和辅存的方式在现代操作系统中被称为虚拟内存。
MMU便是实现虚拟内存的必要条件。
嵌入式处理器如果存在MMU,由于在MMU具备内存地址映射和寻址功能,操作系统会使用它完成从虚拟地址到物理地址的转换,所有的应用程序只需要使用虚拟地址寻址数据。
虚拟内存的管理方法使系统既可以运行体积比物理内存还要大的应用程序,也可以实现“按需调页”策略,既满足了程序的运行速度,又节约了物理内存空间。
2.进程内存区域涉及到5种数据段,即:
①代码段:
代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像。
②数据段:
数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。
③BSS段:
BSS段包含了程序中未初始化的全局变量,在内存中BSS段全部置零。
④堆(heap):
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。
当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
⑤栈:
栈是用户存放程序临时创建的局部变量,也就是说函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。
除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。
3.在Linux系统中,内核在最高级执行,也称为“系统态”,在这一级任何操作都可以执行。
而应用程序则执行在最低级,即所谓的“用户态”。
在这一级处理器禁止对硬件的直接访问和对内存的未授权访问。
模块是在所谓的“内核空间”中运行的,而应用程序则是在“用户空间”中运行的。
它们分别引用不同的内存映射,也就是程序代码使用不同的“地址空间”。
4.共享内存区域是被多个进程共享的一部分物理内存。
如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。
共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。
这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中。
但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址。
5.内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。
当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。
二.编程题
1.参考程序:
#include
structtest
{
inta[10];
charb[20];
}
intmain()
{
structtest*ptr=calloc(sizeof(structtest),10);
}
2.参考程序:
#include
#include
#include
#include
#include
main()
{
intfd;
void*start;
structstatsb;
fd=open(“/etc/passwd”,O_RDONLY);/*打开/etc/passwd*/
fstat(fd,&sb);/*取得文件大小*/
start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);
if(start==MAP_FAILED)/*判断是否映射成功*/
return;
printf(“%s”,start);
munma(start,sb.st_size);/*解除映射*/
closed(fd);
}
嵌入式Linux实时操作系统及应用编程
第7章
一、单项选择题
1.A2.B3.A4.D5.6.A7.C
二.编程题
1.
(1)
Voidmain(void)
{
intfid;
fid=open(“./test.txt”,O_RDWR|O_CREAT);
if(fid==-1)
{
Printf(“openorcreateerror\n”);
exit(0);
}
Close(fid);
}
(2)
objects=main.o
exec=main
all:
$(objects)
gcc–o$(exec)$(objects)
main.o:
main.c
gcc–cmain.c
clean:
rm–r$(exec)$(objects)
2.参考程序:
#include
#include
#include
#include
#include
#include
#defineBUFFER_SIZE1024
int main(int argc,char **argv)
{
int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr;
if(argc!
=3) {
fprintf(stderr,"Usage:
%s fromfile tofile\n\a",argv[0]);
exit
(1);
}
/*打开源文件*/
if((from_fd=open(argv[1],O_RDONLY))==-1){
fprintf(stderr,"Open %s Error:
%s\n",argv[1],strerror(errno));
exit
(1);
}
/*创建目的文件*/
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1){
fprintf(