嵌入式程序设计复习总结.docx
《嵌入式程序设计复习总结.docx》由会员分享,可在线阅读,更多相关《嵌入式程序设计复习总结.docx(11页珍藏版)》请在冰豆网上搜索。
嵌入式程序设计复习总结
嵌入式程序设计课程总结
第一章(嵌入式系统基础)
1.嵌入式系统概念
普遍的嵌入式系统的定义:
嵌入式系统是指以应用为中心,以计算机技术为基础,软件硬件可剪裁,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
特点:
1)面向特定应用的特点。
2)嵌入式系统的硬件和软件都必须进行高效地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能。
3)嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物。
4)为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片中或单片机本身,而不是存储于磁盘中。
5)嵌入式开发的软件代码尤其要求高质量、高可靠性。
6)嵌入式系统本身不具备二次开发能力。
2.交叉编译
嵌入式软件开发所采用的编译为交叉编译。
所谓交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。
3.交叉调试
调试器和被调试进程运行在不同的机器上,调试器运行在PC机(宿主机),而被调试的进程则运行在各种专业调试板上(目标板)。
调试器通过某种通信方式(串口、并口、网络、JTAG等)控制被调试进程。
4.Bootloader的作用
简单地说,Bootloader就是在操作系统内核运行之前运行的一段程序,它类似于PC机中的BIOS程序。
通过这段程序,可以完成硬件设备的初始化,并建立内存空间的映射关系,从而将系统的软硬件环境带到一个合适的状态,为最终加载系统内核做好准备。
第二章(程序开发工具)
1.Vi
四种模式:
标准模式、插入模式、命令行模式、可视模式。
2.Gcc
编译流程:
(4个步骤)
预处理、编译、汇编、链接。
常用选项:
库相关选项:
函数库分为静态库和动态库两种,静态库是一系列的目标文件(.o文件)的归档文件(文件名格式为libname.a),如果在编译某个程序时链接静态库,则链接器将会搜索静态库,从中提取出它所需要的目标文件并直接拷贝到该程序的可执行二进制文件(ELF格式文件)之中;动态库(文件名格式为libname.so[.主版本号.次版本号.发行号])在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。
3.Gdb
上机时进行的操作:
l、b、n、c
4.Make
能解释规则含义:
makefile的规则是make进行处理的依据,它包括了目标体、依赖文件及其之间的命令语句。
普通规则
隐含规则:
隐含规则能够告诉make怎样使用传统的规则完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可
模式规则:
模式规则是用来定义相同处理规则的多个文件的。
第三章(linuxC语言基础)
1.栈(stack):
由编译器自动分配释放,存放函数的参数值,局部变量的值,返回地址等,其操作方式类似于数据结构中的栈。
2.堆(heap):
一般由程序员动态分配(调用malloc函数)和释放(调用free函数),若程序员不释放,程序结束时可能由操作系统回收。
3.数据段(data):
存放的是全局变量、静态变量、常数。
根据存放的数据,数据段又可以分成普通数据段(包括可读可写/只读数据段,存放静态初始化的全局变量或常量)、BSS数据段(存放未初始化的全局变量)。
4.代码段(code):
存放程序代码。
5.字节序:
字节顺序是指一个字中各个字节的顺序,有大端模式和小端模式。
大端模式:
字数据的高字节存储在低地址中,字数据的低字节存放在高地址中。
小端模式:
字数据的高字节存储在高地址中,字数据的低字节存放在低地址中。
第四章(文件IO)
1.系统调用与用户编程接口API的区别
所谓系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。
例如用户可以通过进程控制相关的系统调用来创建进程、实现进程调度、进程管理等。
前面讲到的系统调用并不是直接与程序员进行交互的,它仅仅是一个通过软中断机制向内核提交请求,以获取内核服务的接口。
在实际使用中程序员调用的通常是用户编程接口——API
2.文件描述符的概念
文件描述符是一个非负的整数,它是一个索引值,并指向在内核中每个进程打开文件的记录表。
当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数.
通常,一个进程启动时,都会打开3个文件:
标准输入、标准输出和标准出错处理。
这3个文件分别对应文件描述符为0、1和2(也就是宏替换STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO)。
3.open()/read()/write()/close()与fopen()/fread()/fwrite()/fclose()的区别
open()/read()/write()/close()基于文件描述符;fopen()/fread()/fwrite()/fclose()基于流缓冲。
标准I/O提供流缓冲的目的是尽可能减少使用read()和write()等系统调用的数量。
标准I/O提供了3种类型的缓冲存储。
全缓冲:
在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。
对于存放在磁盘上的文件通常是由标准I/O库实施全缓冲的。
行缓冲:
在这种情况下,当在输入和输出中遇到行结束符时,标准I/O库执行I/O操作。
这允许我们一次输出一个字符(如fputc()函数),但只有写了一行之后才进行实际I/O操作。
标准输入和标准输出就是使用行缓冲的典型例子。
不带缓冲:
标准I/O库不对字符进行缓冲。
如果用标准I/O函数写若干字符到不带缓冲的流中,则相当于用系统调用write()函数将这些字符全写到被打开的文件上。
标准出错stderr通常是不带缓存的,这就使得出错信息可以尽快显示出来,而不管它们是否含有一个行结束符。
4.解释文件锁的应用场景,fcntl与lockf
文件锁包括建议性锁和强制性锁。
建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。
在一般情况下,内核和系统都不使用建议性锁。
强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。
采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。
在Linux中,实现文件上锁的函数有lockf()和fcntl(),其中lockf()用于对文件施加建议性锁,而fcntl()不仅可以施加建议性锁,还可以施加强制锁。
同时,fcntl()还能对文件的某一记录上锁,也就是记录锁。
记录锁又可分为读取锁和写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。
而写入锁又称为排斥锁,在任何时刻只能有一个进程在文件的某个部分上建立写入锁。
当然,在文件的同一部分不能同时建立读取锁和写入锁。
第五章(进程控制开发)
1.fork()
fork()函数用于从已存在的进程中创建一个新进程。
新进程称为子进程,而原进程称为父进程。
使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。
2.父进程回收子进程需要调用wait与waitpid
wait()函数是用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止。
如果该父进程没有子进程或者他的子进程已经结束,则wait()就会立即返回。
waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能,也能支持作业控制。
实际上wait()函数只是waitpid()函数的一个特例,在Linux内部实现wait()函数时直接调用的就是waitpid()函数。
3.exit()与_exit()的区别
exit()函数的作用是:
直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;exit()函数则在这些基础上做了一些包装,在执行退出之前加了若干道工序。
exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的“清理I/O缓冲”一项。
第六章(多任务编程)
1.管道(Pipe)及有名管道(namedpipe):
管道可用于具有亲缘关系进程间的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
单向性,往1号fd写,从0号fd读。
2.信号(Signal):
信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。
3.消息队列(MessgeQueue):
消息队列是消息的链接表,包括Posix消息队列SystemV消息队列。
它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。
4.共享内存(Sharedmemory):
可以说这是最有用的进程间通信方式。
它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。
这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。
5.信号量(Semaphore):
主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。
6.套接字(Socket):
这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。
能解释ls–l列出的权限的含义
-rwxr-xr-x
第一位表示文件类型,-表示文件,d表示目录
2-4位表示文件所有者的权限,u权限
5-7位表示文件所有者所属组成员的权限,g权限
8-10位表示所有者所属组之外的用户的权限,o权限
2-10位的权限总和有时称为a权限
以上例子中,表示这是一个文件(非目录),文件所有者具有读、写和执行的权限,所有者所属组成员和所属组之外的用户具有读和执行的权限而没有写的权限。
第七章网络编程(看书看代码才是王道)
1.TCP/UDP套接字编程模型(老师说书上的略有错误,我就不粘贴了)
2.并发处理模型(仔细理解实验内容)
第8章设备驱动
1.Linux将所有设备当作文件进行处理,位于/dev目录中
2.Linux系统的设备分为3类:
字符设备,块设备,网络设备
3.字符设备通常以字节为单位顺序读写的设备
4.块设备通常指需要以块为单位随机读写的设备
5.设备驱动程序位于操作系统内核空间
6.解释字符设备与块设备
字符设备:
字符设备通常指像普通文件或字节流一样,以字节为单位顺序读写的设备。
字符设备可通过设备文件节点访问,它与普通文件之间的区别在于普通文件可以被随机访问,而大多数字符设备只能提供顺序访问,因为对它们的访问不会被系统所缓存。
块设备:
块设备通常指一些需要以块(如512字节)的方式写入的设备,如IDE硬盘、SCSI硬盘、光驱等。
它的驱动程序的编写过程与字符型设备驱动程序的编写有很大的区别。
块设备驱动编程接口相对复杂,不如字符设备明晰易用。
块设备驱动程序对整个系统的性能影响较大,速度和效率是设计块设备驱动程要重点考虑的问题。
系统中使用缓冲区与访问请求的优化管理(合并与重新排序)来提高系统性能。
7.主设备号,次设备号,具备相同主设备号的设备之间公用同一驱动程序,而用次设备号来标识具体物理设备
8.Insmod:
insmod和modprobe是用于加载当前模块,但insmod不会自动解决依存关系,即如果要加载的模块引用了当前内核符号表中不存在的符号,则无法加载,也不会去查在其他尚未加载的模块中是否定义了该符号;modprobe可以根据模块间依存关系以及/etc/modules.conf文件中的内容自动加载其他有依赖关系的模块。
Rmmod:
rmmod是用于将当前模块卸载。
Lsmod:
lsmod列出当前系统中加载的模块,其中左边第一列是模块名,第二列是该模块大小,第三列则是使用该模块的对象数目。
9.解释mknod/dev/mytestdevicec590
语法:
mknodName{b|c}MajorMinor
mknod命令建立一个目录项和一个特殊文件的对应索引节点。
第一个参数是Name项设备的名称。
选择一个描述性的设备名称。
b标志表示这个特殊文件是面向块的设备(磁盘、软盘或磁带)。
c标志表示这个特殊文件是面向字符的设备(其他设备)。
最后两个参数是指定主设备的数目,它帮助操作系统查找设备驱动程序代码,和指定次设备的数目,也就是单元驱动器或行号,它们是十进制或八进制的。
一个设备的主要和次要编号由该设备的配置方法分配,它们保存在ODM中的CuDvDr类里。
在这个对象类中定义了主要和次要编号以确保整个系统设备定义的一致性,这是很重要的。
10.内核模块编程中打印信息的函数printk,输出信息的位置是/var/log/message
第九章QT
1.信号与插槽机制是QT的核心机制,用于对象之间的通信,实现程序对用户操作界面时间的响应。
2.Qmake用法
Qmake–project
Qmake
Make
第10章(实验上机部分,只具体解释了最后一个问题)
1.使用厂商提供的交叉编译环境
搭建开发环境
自己从头编译构建也是可以的,但是会有挑战性
2.下载内核/文件系统
厂商提供有文件系统骨架
3.根据所做应用的不同,需要定制内核/文件系统
如何从一个目录打包成文件系统
4.如果定制一个只读的文件系统呢?
Mount,拷贝出来,加内容,重新打包
5.测试程序
Ssh上传,文件系统可写?
Nfs
整个文件系统烧写
6.在宿主机通常使用minicom来通过串口与开发板交互,编译可以运行在开发板上的程序用的编译器命令是arm-linux-gcc,远程调试开发板上的程序用的命令是arm-linux-gdb,gdbserver运行在开发板上
7.方便开发调试,要用到nfs,开发板充当nfs客户端,宿主机充当nfs服务器
8.在宿主机上搭建tftp服务器是为了方便bootloader下载内核与文件系统
9.为了确认宿主机与开发板之间的网络连通,使用ifconfig命令将二者设置统一网段的IP
10.解释
scproot@192.168.0.1:
/root/Work/Helloworld/root
scp就是securecopy,是用来进行远程文件拷贝的。
scp本地用户名@IP地址:
文件名1远程用户名@IP地址:
文件名2
[本地用户名@IP地址:
]可以不输入,可能需要输入远程用户名所对应的密码.
时间仓促,错误难免,只从课件上找到理论部分的解释,程序部分大家还是看书吧。
大雪无痕