《嵌入式软件开发》期末考试复习资料.docx
《《嵌入式软件开发》期末考试复习资料.docx》由会员分享,可在线阅读,更多相关《《嵌入式软件开发》期末考试复习资料.docx(19页珍藏版)》请在冰点文库上搜索。
![《嵌入式软件开发》期末考试复习资料.docx](https://file1.bingdoc.com/fileroot1/2023-7/13/989d6cf9-cf80-400d-9c7c-ec2197f5c4e7/989d6cf9-cf80-400d-9c7c-ec2197f5c4e71.gif)
《嵌入式软件开发》期末考试复习资料
同学们,最近连续出差,回来后已经进入考试了,之前说的找时间给大家答疑已不现实,现在把考试的重点范围发给大家,请大家认真复习。
一、知识点(选择、填空、判断)
Linux常见的文件类型:
普通文件:
包括文本文件、shell脚本、二进制的可执行程序和各种类型的数据.
目录文件:
包含文件名和子目录名以及指向那些文件和子目录的指针
链接文件
设备文件:
字符设备文件/块设备文件
文件属性:
1.管道:
p表示命名管道,比如FIFO文件
2.堆栈:
f表示堆栈文件,比如LIFO
3.套接字:
s表示套接字
Linux常见的文件系统类型
}ext2和ext3:
ext3是现在Linux下常见的默认文件系统,采用了日志式的管理机制,它使文件系统具有很强的快速恢复能力。
}swap文件系统:
是Linux中作为交换分区使用的
}vfat文件系统
}NFS文件系统;网络文件系统,很方便的在局域网内实现文件共享,并且使多台主机共享同一主机上的文件系统,访问速度快、稳定性高,很方便的实现文件本地修改。
}ISO9660文件系统:
光盘所使用的文件系统,不仅可以提供对光盘的读写,还可以实现对光盘的刻录。
}内存文件系统:
proc、sys、ramdisk
}嵌入式文件系统:
cramfs、jffs、yaffs等
Linux常用命令的作用,实验时用的即可
}ps:
显示当前系统中由该用户运行的进程列表
}top:
动态显示系统中运行的程序(一般为每隔5s)
}文件系统挂载命令(mount):
挂载文件系统,它的使用权限是超级用户或/etc/fstab中允许的使用者。
挂载是指把分区和目录对应的过程,而挂载点是指挂载在文件树中的位置。
mount命令就可以把文件系统挂载到相应的目录下,并且由于Linux中把设备都当作文件一样使用,因此,mount命令也可以挂载不同的设备。
通常,在Linux下“/mnt”目录是专门用于挂载不同的文件系统的,它可以在该目录下新建不同的子目录来挂载不同的设备文件系统。
}cd:
改变当前工作目录
}ls:
列出目录和文件的信息
}mkdir:
创建一个目录
}cat:
连接并显示指定的一个和多个文件的有关信息。
}cp:
将给出的文件或目录复制到另一文件或目录中
}mv:
为文件或目录改名或将文件由一个目录移入另一个目录中。
}rm:
删除一个目录中的一个或多个文件或目录。
}ln:
为某一个文件在另外一个位置建立一个符号链接。
当需要在不同的目录用到相同的文件时,Linux允许用户不用在每一个需要的目录下都存放一个相同的文件,而只需将其他目录下文件用ln命令链接即可,这样就不必重复地占用磁盘空间。
}ln命令会保持每一处链接文件的同步性,也就是说,不论改动了哪一处,其他的文件都会发生相同的变化。
}ln的链接又软链接和硬链接两种:
}软链接就是上面所说的ln-s****,它只会在用户选定的位置上生成一个文件的镜像,不会重复占用磁盘空间,平时使用较多的都是软链接;
}硬链接是不带参数的ln****,它会在用户选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
}ping:
用于查看网络上的主机是否在工作
}ifconfig:
查看和配置网络接口的参数
Vi的模式:
vi:
命令行模式-插入模式-底行模式在插入模式中,按“ESC”键,则转入命令行模式,并在底行中输入“:
wq(存盘退出)”进入底行模式
Gcc的常用参数含义
文件权限的标示:
linux中文件的拥有者可以把文件的访问属性设成3种不同的访问权限:
可读(r)、可写(w)和可执行(x)。
文件又有3个不同的用户级别:
文件拥有者(u)、所属的用户组(g)和系统里的其他用户(o).
进程的状态P204
文件的不带缓存函数和带缓存函数
不带缓存:
open()函数(打开或创建文件)、close()函数(关闭一个被打开的文件)、read()函数(用于将从指定的文件描述符中读出的数据放到缓存区中,并返回实际读入的字节数)、write()函数(用于向打开的文件写数据,写操作从文件的当前指针位置开始)、lseek()函数(用于在指定的文件描述符中将文件指针定位到相应的位置)、lockf()函数和fcntl()函数(实现文件上锁)、select()函数和poll()函数(select()和poll()的I/O多路转接模型是处理I/O复用的一个高效的方法)
带缓存:
打开文件:
fopen()、fdopen()和freopen()、关闭标准流文件的函数为fclose()、读操作的函数为fread()、fwrite()函数是用于对指定的文件流进行写操作
Linux常用编辑器:
}Linux中最常用的编辑器有vi(vim)和emacs
程序运行空间分为两种
在Linux中,为了更好地保护内核空间,将程序的运行空间分为内核空间和用户空间(也就是常称的内核态和用户态),它们分别运行在不同的级别上,在逻辑上是相互隔离的。
Socket的类型
(1)流式socket(SOCK_STREAM)
流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。
(2)数据报socket(SOCK_DGRAM)
数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。
它使用数据报协议UDP。
(3)原始socket
原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。
Fork函数的作用:
fork()函数用于从已存在的进程中创建一个新进程。
新进程称为子进程,而原进程称为父进程。
使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。
进程间通信的方式:
(1)管道(Pipe)及有名管道(namedpipe)
(2)信号(Signal)(3)消息队列(MessgeQueue)
(4)共享内存(Sharedmemory)(5)信号量(Semaphore)(6)套接字(Socket)
Linux文件锁有哪两种:
建议性锁和强制性锁。
建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。
在一般情况下,内核和系统都不使用建议性锁。
强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。
采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。
串口对应的文件:
在Linux中,所有的设备文件一般都位于“/dev”下,串口1和串口2对应的设备名为“/dev/ttyS0”和“/dev/ttyS1”,而USB转接口的设备名通常为“/dev/ttyUSB0”和“/dev/ttyUSB1”
Make跟makefile的关系:
Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作;
makefile是make读入的惟一配置文件;
makefile的规则是make进行处理的依据,它包括了目标体、依赖文件及其之间的命令语句
NFS服务
NFS共享设置
1.NFS全程netfilesystem是linux系统与实验箱linux系统之间进行文件共享的一种服务方式,如果使用NFS就要保障XP、虚拟机、实验箱三者之间的IP在同一网段,且不冲突,并且可以互相ping通,之后再虚拟机种运行NFS
2.启动后界面如下,点击添加后弹出对话框
3.目录中设置我们要共享的目录主机中添*权限选择读写,其余复选框中均按图进行设置
4.添加成功后会出现如下一条记录
5.在实验箱端操作如下
[root@root]#ifconfigeth0192.168.1.13
[root@root]#mount–onolock,rsize=4096,wsize=4096192.168.1.12:
/home/uptech/mnt/nfs
[root@root]#cd/mnt/nfs
如果在挂载的时候出现无法挂载请在pc机linux系统下输入routedeldefault即可挂载
Shell
Shell环境就是linux的命令行界面。
当用户在命令行下工作时,不是直接同操作系统内核交互信息的,而是由命令解释器接受命令,分析后再传给相关的程序。
Shell是一种linux中的命令解释程序,为用户提供使用操作系统的接口。
用户在提示符下输入的命令都有shell先解释后在传给linux内核。
Bootloader
}简单地说,Bootloader就是在操作系统内核运行之前运行的一段程序,它类似于PC机中的BIOS程序。
通过这段程序,可以完成硬件设备的初始化,并建立内存空间的映射关系,从而将系统的软硬件环境带到一个合适的状态,为最终加载系统内核做好准备。
}通常,Bootloader比较依赖于硬件平台,特别是在嵌入式系统中,更为如此。
因此,在嵌入式世界里建立一个通用的Bootloader是一件比较困难的事情。
}Bootloader与哪些相关?
}Bootloader所支持的CPU和嵌入式开发板
}Bootloader的存储位置
}Bootloader的启动过程分为单阶段和多阶段两种。
通常多阶段的Bootloader能提供更为复杂的功能,以及更好的可移植性。
}Bootloader的操作模式
}Bootloader与主机之间进行文件传输所用的通信设备及协议,最常见的情况就是,目标机上的Bootloader通过串口与主机之间进行文件传输,传输协议通常是xmodem/ymodem/zmodem等。
但是,串口传输的速度是有限的,因此通过以太网连接并借助TFTP等一些协议来下载文件是个更好的选择。
Bootloader启动流程–stage1
基本的硬件初始化,包括屏蔽所有的中断、设置CPU的速度和时钟频率、RAM初始化、初始化外围设备、关闭CPU内部指令和数据cache等。
为加载stage2准备RAM空间,通常为了获得更快的执行速度,通常把stage2加载到RAM空间中来执行,因此必须为加载Bootloader的stage2准备好一段可用的RAM空间。
拷贝stage2到RAM中,在这里要确定两点:
①stage2的可执行映像在固态存储设备的存放起始地址和终止地址;②RAM空间的起始地址。
设置堆栈指针sp,这是为执行stage2的C语言代码做好准备。
Bootloader启动流程–stage2
用汇编语言跳转到main入口函数
由于stage2的代码通常用C语言来实现,目的是实现更复杂的功能和取得更好的代码可读性和可移植性。
但是与普通C语言应用程序不同的是,在编译和链接Bootloader这样的程序时,不能使用glibc库中的任何支持函数。
初始化本阶段要使用到的硬件设备,包括初始化串口、初始化计时器等。
在初始化这些设备之前、可以输出一些打印信息。
检测系统的内存映射,所谓内存映射就是指在整个4GB物理地址空间中指出哪些地址范围被分配用来寻址系统的内存。
加载内核映像和根文件系统映像,这里包括规划内存占用的布局和从Flash上拷贝数据。
设置内核的启动参数。
API跟系统调用
}所谓系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。
例如用户可以通过进程控制相关的系统调用来创建进程、实现进程调度、进程管理等。
}用户编程接口——API
管道套接字的定位?
?
?
(1)管道(Pipe)及有名管道(namedpipe):
管道可用于具有亲缘关系进程间的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
管道只存在于内核的内存空间中
(6)套接字(Socket):
这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。
启用进程的途径:
手工启动(前台启动和后台启动)、调度启动
一、名词解释
交叉编译:
嵌入式软件开发所采用的编译为交叉编译。
所谓交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。
进程:
进程是一个程序的一次执行的过程,同时也是资源分配的最小单元。
进程是系统中程序执行和资源分配的基本单位。
线程:
是进程内独立的一条运行路线,处理器调度的最小单元,也可以称为轻量级进程。
守护进程:
守护进程就是后台服务进程,它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护进程常常在系统引导载入时启动,在系统关闭时终止。
Tftp协议:
简单文件传输协议,它可以看做是一个FTP的简化版本,与FTP相比,它的最大区别在于没有用户管理的功能。
它的传输速度快,可以通过防火墙,使用方便快捷。
二、简答
简述Linux作为嵌入式操作系统的优势。
1.低成本开发系统
2,可应用于多种硬件平台
3.可定制的内核
4.性能优异
5.良好的网络支持
简述虚拟机下的Linux跟Windows文件共享的方法。
1、在虚拟机下设置windows的共享文件
虚拟机》设置》选型》点下共享文件夹选中后》添加》
下一步》名称(随便填)》浏览选择一个共享文件夹》下一步》选择启用该共享》完成
二、安装VMvaretools
虚拟机》安装vmvaretools》弹出对话框》确定》会在虚拟机里弹出cdrom界面如下,桌面上有vmvaretools盘符重启vmvare-tools服务正常情况下,此时可以在mnt目录下见到hgfs文件夹看hgfs文件夹里是否存在windows刚共享的windows-share,存在即表示成功,注意名字为虚拟机下面的名字,即第一步中所设置的windows-share,对应于windows下面的Linux
三、设置软链接便于访问
做个软连接,将windows-share放到根目录下,成为新的文件windows,以免每次都得进入/mnt/hgfs/windows-share/目录,以后直接操作根目录下面的windows目录即可了
实际上现在windows下面的E:
\Linux\和虚拟机下面的/mnt/hgfs/windows-share以及根目录下的/windows就是一样的了,改变任意一个,三者同时改变,是硬同步的
简述PV原子操作的原理。
PV原子操作是对整数计数器信号量sem的操作。
一次P操作使sem减一,而一次V操作使sem加一。
进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。
当信号量sem的值大于等于零时,该进程(或线程)具有公共资源的访问权限;相反,当信号量sem的值小于零时,该进程(或线程)就将阻塞直到信号量sem的值大于等于0为止。
PV原子操作主要用于进程或线程间的同步和互斥这两种典型情况。
若用于互斥,几个进程(或线程)往往只设置一个信号量sem。
在Linux中使用较多的进程间通信方式主要有哪些?
(1)管道(Pipe)及有名管道(namedpipe)
(2)信号(Signal)(3)消息队列(MessgeQueue)
(4)共享内存(Sharedmemory)(5)信号量(Semaphore)(6)套接字(Socket
三、程序分析(程序量不大,要求完全领会掌握,能自己编写具体程序)
守护进程的创建P220
/*dameon.c创建守护进程实例*/
#include
#include
#include
#include
#include
#include
#include
intmain()
{
pid_tpid;
inti,fd;
char*buf="ThisisaDaemon\n";
pid=fork();/*第一步*/
if(pid<0)
{
printf("Errorfork\n");
exit
(1);
}
elseif(pid>0)
{
exit(0);/*父进程推出*/
}
openlog("demo_update",LOG_PID,LOG_DAEMON);/*打开系统日志服务,openlog*/
setsid();/*第二步*/
chdir("/");/*第三步*/
umask(0);/*第四步*/
for(i=0;i{
close(i);
}
/*这时创建完守护进程,以下开始正式进入守护进程工作*/
while
(1)
{
if((fd=open("/tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0)
{
printf("Openfileerror\n");
exit
(1);
}
write(fd,buf,strlen(buf)+1);
close(fd);
sleep(10);
}
exit(0);
}
信号量解决两个进程执行的先后顺序P259
/*fork.c*/
#include
#include
#include
#include
#include
#include
#include
#defineDELAY_TIME3
intmain(void)
{
pid_tresult;
intsem_id;
sem_id=semget(ftok(".",'a'),1,0666|IPC_CREAT);/*创建一个信号量*/
init_sem(sem_id,0);
/*调用fork函数,其返回值为result*/
result=fork();
/*通过result的值来判断fork函数的返回情况,首先进行出错处理*/
if(result==-1)
{
perror("Fork\n");
}
elseif(result==0)/*返回值为0代表子进程*/
{
printf("Childprocesswillwaitforsomeseconds...\n");
sleep(DELAY_TIME);
printf("Thereturnedvalueis%dinthechildprocess(PID=%d)\n",result,getpid());
sem_v(sem_id);
}
else/*返回值大于0代表父进程*/
{
sem_p(sem_id);
printf("Thereturnedvalueis%dinthefatherprocess(PID=%d)\n",result,getpid());
sem_v(sem_id);
del_sem(sem_id);
}
exit(0);
}
简述实验室环境下宿主机与目标机之间串口通信实验的步骤
1.启动虚拟机时添加串口,连接试验箱(xshell),将windows下的Ip设为同一网段,用Telnetping通,在Xshell里新建newsession,然后打开试验箱开关,看确定是否连接上。
2.启动redhat,将windows下的有关实验文件与linux设置共享新建终端修改Makefilecc=arm-linux-gcc,
将实验文件同linux终端tty设备驱动拷贝其他目录中,然后设置nfs共享。
3.在Xshell中,将宿主机nfs共享的文件挂载到目标机上,加载驱动
4.接下来,将目标板的串口程序交叉编译,再将宿主机的串口程序在PC机上编译
5.连接PC的串口1和开发板的串口2,然后将目标板串口程序下载到开发板上,分别在两台机器上运行串口程序