简答题:1-2微处理器,2-1-2ARM处理器和指令集内部结构2,4嵌入式软件编程技术 5开发环境和调试技术 7-1linux操作系统 8嵌入式文件系统 课后思考题
1.5.6.7
2.3.4.5.6.7.9.11.13
4
5
7.2.5.8.10
8
1.嵌入式系统的前世今生及应用领域;
首个嵌入式系统:AGC
军事
工业制造
仪器仪表
智能家居
智能家电
智能汽车
商业、办公自动化及通信
PMP
protable media player
sixth sense系统
可佩戴式多点触控投影机
健身服
指套探测器
表皮电子
tacit project手套
flora kit电脑
环境检测
地址灾害监控
2.嵌入式系统的发展阶段;
操作系统:
无操作系统阶段
将嵌入式软件固化在只读内存,汇编编程
简单操作系统阶段
开发简单的应用软件
前提:微电子工艺水平的提高
主要特点:出现了大量高可靠、低功耗的嵌入式CPU,此时的嵌入式系统虽然比较简单,但是初步具有一定的兼容性和扩展性,内核精巧并且效率高。主要用于控制系统负载以及监控应用程序的运行
实时操作系统
实时控制;软实时;硬实时;增加用户体验
面向Internet的阶段
传感网络,物联网,工业物联网,CPS(信息物理社会)
PC时代
后PC时代
嵌入式系统是以应用为中心,以计算机技术为基础,采用可剪裁软硬件,适用于对功能、实时性、可靠性、功耗等有严格要求的专用计算机系统
微处理器是整个系统的核心,通常由三大部分组成:控制单元、算数逻辑单元和寄存器
存储器包括主存和外存,外存采用flash芯片存储数据,体积小、功耗低、抗震。
大多数输入、输出接口和部分设备已经集成在嵌入式微处理器中
相对通用处理器,嵌入式处理器的特点:
种类 | 特点与不同之处 | 用途 |
---|---|---|
微处理器MPU | 相对于通用计算机中的CPU:1.只保留和嵌入式应用紧密相关的功能硬件,去除其它冗余的功能,以最低功耗和成本实现特定的需求2.在工作温度、抗电磁干扰、可靠性等方面对CPU做了各种增强3.微处理器装配在专门设计的电路板上,系统的可靠性较低,技术保密性较差4.不是为任何已有的特定计算目的而设计的芯片, | Am186/88,386EX,SC-400,Power PC,68000,MIPS,ARM系列等 |
微控制器MCU | (1)以某一微处理器内核为核心 (2)芯片内部集成各种必要功能和外设) (3)特点:单片化、体积大大减小,从而使成本和功耗下降、可靠性提高 | 1.通用系列:8051,P51XA,MCS-251,MCS-96/196/291等 2.半通用系列:支持USB接口的C540,C541;支持I2C,LCD及众多专用MCU和兼容系列 |
DSP处理器 | (1)采用哈弗结构和专用的硬件乘法器 (2)使用快速DSP指令(RISC) (3)适用于处理器运算速度要求较高、向量运算较多的应用领域 | 1.数字信号处理 数字滤波, 2.移动电话、语音识别 3.智能化嵌入式系统 |
SOC | (1)一种系统集成芯片,功能可以完全由硬件完成,也可以由软硬件完成 (2)高密度、高速度、高抗干扰性 | 1.ARM+ARM 2.ARM+DSP 3. ARM+FPGA |
典型嵌入式处理器 | 特点 | 应用场景 |
---|---|---|
ARM | (1)体积小、低功耗、低成本、高性能 (2)支持Thumb/ARM双指令集 (3)大量使用寄存器 (4)寻址方式灵活 (5)固定长度的指令 | 1.Cortex M系列处理器:低端嵌入式应用市场 2. 经典ARM及Cortex R系列处理器:中高端嵌入式应用市场 3.Cortex A系列处理器:高端嵌入式应用市场 |
MIPS | 高性能、高处理能力的高端嵌入式处理器 | 应用于消费类电子、下一代网络、宽带产品、智能卡、机顶盒、数字电视、DVD |
POWERPC | 可伸缩性好、方便灵活 | 应用于DSL调制解调器、SOHO路由器、远程接入服务器、DSLAM、执行局交换机设备、无线基站、企业路由器 |
嵌入式软件系统体系结构:驱动层,操作系统层,中间件层,应用层
10.嵌入式操作系统的分类;
嵌入式软件系统体系结构:驱动层,操作系统层,中间件层,应用层
4.8.16.32.64位嵌入式系统
信息家电类,移动终端类,汽车电子类,工业控制类,通信类
- 强实时系统,毫秒或者微妙
- 一般实时系统,几秒
- 弱实时系统,数十秒或更长
- 硬实时系统
如果系统响应时间不能满足,会引起系统崩溃或致命的错误
- 软实时
不会导致系统出现致命错误或崩溃
循环轮询系统
有限状态机系统
前后台系统
单处理器多任务系统
多处理器多任务系统
嵌入式操作系统 | 特点 | 应用场景 |
---|---|---|
Linux | (1)广泛的硬件支持 (2) 内核高效稳定 (3)开放源码,软件丰富 (4)优秀的开发工具 (5)完善的网络通信和文件管理机制 | Android、MeeGo |
VXwork | 高可靠性、高实时性、可剪裁性好、但非常昂贵 | 用于美国“极地登陆者”号、“深空二号”和火星气候轨道器等登陆火星探测器上 |
QNX | 高可靠性、高安全性、高度伸缩性、可灵活剪裁 | 广泛嵌入到汽车、智能机器、智能仪器仪表、机顶盒、通讯设备、PDA等应用,目前作为黑莓手机及黑莓平板电脑的操作系统 |
uc/OS | 开源、结构小、可剥夺、实时的 (缺点:不支持时间片轮转调度法) | 用于控制类等低端应用中。如照相机行业、医疗检测仪器、音响设施等 |
2.ARM 各体系架构版本与各系列产品的特点;
架构 | 区别 | 应用场景 |
---|---|---|
v1 | 基本指令 | 只在原型机ARM1出现过 |
v2 | 对V1进行了扩展,增加了指令以及寻址空间 | ARM2与ARM3架构 |
v3 | 增加了CPSR和SPSR寄存器;寻址空间;中止和未定义处理器模式 | |
v4 | 引进了16位的Thumb指令集 | |
v5 | 新增指令 | |
v6 | 在芯片功耗和多媒体处理上有所突破 | 根下一代的消费类电子、无线设备、网络应用和汽车电子产品等需求制定 |
v7 | 采样Thumb-2技术,兼容性好 | |
v8 | 支持64微指令集的处理器架构;包含两个执行状态:AArch64和AArch32 | 基于64微Cortex-A5X系列的百度ARM服务器 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TULiqLS-1608779280944)(D:\数据可视化\大数据分析学习\图片\image-20201221143448012.png)]
3.能够举例分析ARM微处理器系列芯片的特点?
特点 | |
---|---|
CISC | (1)指令的种类繁多 (2) 指令功能强大 (3)指令机器码长度因指令不同而不同 (4)指令执行时间有较大的差异 (5)高性能微指令结构耗用大量晶体管,造成体积成本增加 |
RISC | (1)具有一个短小精悍的指令集 (2)指令具有相同的机器码位长 (3)95%的指令执行时间为一个时钟周期 (4)节省了大量晶体管,但无法实现高性能指令 (5)采用载入(Load/Store)模式 |
指标 | RISC | CISC |
---|---|---|
指令集 | 一个周期执行一条指令,通过简单指令的组合实现复杂操作;指令长度固定 | 指令长度不固定,执行需要多个周期 |
流水线 | 流水线每周期前进一步 | 指令的执行需要调用微代码的一个微程序 |
寄存器 | 更多通用寄存器 | 用于特定目的的专用寄存器 |
Load/Store结构 | 独立的Load/Store指令完成数据在寄存器和外部存储器之间的传输 | 处理器能够直接处理存储器中的数据 |
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。
冯.洛依曼结构的处理器指令和数据使用同一个存储器
ARM状态,此时处理器执行32位的、字对齐的ARM指令
Thumb状态,此时处理器执行16位的、半字节对齐的Thumb指令
ARM微处理器开始执行代码是,应该处于ARM状态
进入Thumb状态:
进入ARM状态
ARM指令集和Thumb指令集在应用上的区别?
ARM体系结构将存储器看作是从零地址开始的字节的线性组合
从零字节到三字节放置第一个存储的数据
从第四个字节到第七个字节放置第二个存储的字数据,依次排列
作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB
ARM体系结构可以用两种方法存储字数据,分别是大端格式、小端格式
工作模式 | 运用场合 | 说明 |
---|---|---|
用户(usr) | 运行用户应用程序 | 不能直接切换到其它模式 |
系统(sys) | 运行操作系统 | 与用户模式类似,但具有可以直接切换到其它模式等特权 |
块中断(fiq) | 高速I/O数据传输处理 | FIQ异常响应时进入该模式 |
中断(irq) | 常规I/O数据传输处理 | IRQ异常时进入该模式 |
管理(svc) | 开机/复位程序及软中断掉 | 系统复位和软件中断时进入此模式 |
访问中止(abt) | 用于支持虚拟内存和/或存储器保护 | 仅用于ARM9及后续结构 |
未定义(und) | 自定义指令,协处理器软件仿真 | 未定义指令异常响应式进入此模式 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wD6Pdyzv-1608779280946)(D:\数据可视化\大数据分析学习\图片\image-20201221150548978.png)]
8.ARM 状态下的寄存器组织(未分组的寄存器
PC 寄存器);
任何时候,通用寄存器R14-R0、程序计数器PC、一个或两个状态寄存器都是可以访问的
R0-R7为未分组的寄存器,在中断或异常处理时,使用相同的物理寄存器
R8-R12为分组寄存器,取决于当前的处理器模式,有两组寄存器,一组用于FIQ,一组用于其它
R14为链接寄存器(LR),保存子程序返回地址;发生异常时,将R14对应的异常模式版本设置为异常返回地址。将PC的当前值拷贝个R14,执行完子程序后,将R14的值拷贝会PC
寄存器R13常作为堆栈指针.
寄存器R15用作程序计数器(PC)。
在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;
在Thumb状态下,位[0]为0,位[31:1]用于保存PC;
CPSR反映了当前处理器的状态:
4个条件代码标志(负(N)、零(Z)、进位©和溢出(V) );
2个中断禁止位,分别控制一种类型的中断;
5个对当前处理器模式进行编码的位;
1个用于指示当前执行指令(ARM还是Thumb)的位。
10.异常的基本概念及分类;
非预知的引发处理器暂时脱离正常指令序列并转到另外的 程序段去运行的现象
异常包括异常和中断两种类型。
(1) 异常 (Exceptions) 是因指令的执行而产生的,属于软件触发, 且大部分是不可屏蔽的。
(2) 中断 ( Interrupt) 通常是由电信号作用到处理器专门的中断 请求引脚触发的,属硬件触发。而且通常 可以通过对中断屏蔽位的设置禁止或允许 对其的响应
ARM处理器共设置了七种不同类型的异常,包括:
对异常的响应:
异常返回:
寻址方式 | 说明 |
---|---|
立即寻址 | 也叫立即数寻址,操作数包含在指令的操作码中 |
寄存器寻址 | 利用寄存器中的内容作为操作数 |
寄存器移位寻址 | 操作数有寄存器的数值进行相应移位得到 |
寄存器间接寻址 | 以寄存器中的内容作为操作数的地址 |
基址变址寻址 | 将寄存器的内容与指令中给出的地址偏移量相加,得到操作数的地址 |
多寄存器寻址 | 一条指令可以完成多个寄存器的传送,这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值 |
堆栈寻址 | 使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶 |
相对寻址 | 以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,两者相加后的到操作数的地址 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ArpSNMkn-1608779280948)(D:\数据可视化\大数据分析学习\图片\image-20201221161613837.png)]
{} {s} ,{,}
<>号内的项是必须的,{}号内的项是可选的
opcode:指令助记符;cond:执行条件
S:是否影响CPSR寄存器的值
Rd:目标寄存器; Rn:第一个操作数的寄存器
op2:第二个操作数
14.ARM9 的指令系统(跳转指令、数据处理指令、
杂项指令、饱和算术指令)
存储器访问指令:
数据处理指令:
跳转指令:
即分支指令,能够跳转到指定地址或根据跳转地址的最低位来切换处理器状态
助记符 | 说明 | 操作 | 条件码位置 |
---|---|---|---|
B label | 分支指令 | PC<–label | B {cond} |
BL label | 带链接的分支指令 | LR<-PC-4, PC<-label | BL{cond} |
BX Rm | 带状态切换的分支指令 | PC<-Rm,切换处理器状态 | BX{cond} |
BLX RM | 带链接与状态切换的指令 | LR<-PC-4,PC<-Rm,切换处理器状态 | BLX{cond} |
协处理器指令:
杂项指令:
15.ARM 的四条伪指令(ADR、ADRL、LDR、NOP);
Unix操作系统:诞生了c语言,只能自己使用和发放到大学得科研机构中
Minix操作系统:用于教学,开放源码。微内核结构
GNU计划:1987年6月完成得11万行源代码开放得编译器
POSIX标准
Internet:
RedHat:使用数量最多得Linux发行版
Debian:自由社会使用最多得发行版
Ubuntu:基于Debian的一个发行版
从Linux诞生以来,Linux内核就没有停止过升级,从1991年0.01版本到1999年具有里程碑意义的2.2版本,一直到我们现在看到的x.x.xx版本
4.Linux 主机开发环境搭建;
5.Linux 基本命令(用户系统相关命令、文件目录相
令、网络相关命令);
文件目录命令
命令 | 作用 |
---|---|
ls / ls -l |
列目录 |
pwd |
显示当前目录名称 |
cd /etc --> cd ../bin |
更改当前目录 (即从etc目录到bin目录) |
mkdir mydir-->rmdir mydir |
建立和删除目录 |
文件操作命令:
命令 | 功能 |
---|---|
file |
显示指定文件的类型 |
touch |
建立指定名称的文件或更新文件时间 |
cp |
复制文件或目录 |
rm |
删除文件或目录 |
mv |
移动文件或目录,文件或目录重命名 |
find |
在指定目录查找符合条件的文件 |
文本文件查看命令:
命令 | 功能 |
---|---|
cat |
显示文本文件内容 |
more |
分页显示文本文件内容 |
less |
分页显示文本文件内容,并可方便反复浏览 |
head |
显示文件首部内容 |
tail |
显示文件尾部内容 |
压缩打包相关命令:
文件后缀 | 解压命令 | 示例 |
---|---|---|
.a | tar xv | tar xv hello.a |
.z | uncompress | uncompress hello.z |
.gz | gunzip | gunzip hello.gz |
.tar.gz/.tgz | tar xvzf | tar xvzf hello.tar.z |
.tar.bz2 | tar jxvf | tar jxvf hello.tar.bz2 |
.rpm | 安装:rmp -i 解压:rmp2cpio | 安装:rpm -i hello.rpm 解压:rmp2cpio hello.rpm |
.deb | 安装:dpkg -i 解压:dpkg-dep --fsys-tarfile | 安装:dpkg -i hello.deb 解压:dpkg-dep --fsys-tarfile hello.deb |
-zip | unzip | unzip hello.zip |
6.Linux 软件的安装;
Linux | 管理机制 | 使用指令 | 线上升级机制 |
---|---|---|---|
Red Hat/Fedora | RPM | rpm | YUM(yum) |
Debian/Ubuntu | DPKG | dpkg | APT(apt-get |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oHVBLYpj-1608779280949)(D:\数据可视化\大数据分析学习\图片\image-20201221185954155.png)]
文档编辑VI
GCC工具
GDB工具
Make工具
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPGMJgpi-1608779280951)(D:\数据可视化\大数据分析学习\图片\image-20201221190205279.png)]
9.vi 的基本操作命令;
i:在当前光标所在处插入要输入的字符,光标后面的字符会向后退
o:在光标所在行的下方插入一行
a:从当前光标的下一个字符的位置添加字符,已存在的字符会向后退
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtNVgxj2-1608779280952)(D:\数据可视化\大数据分析学习\图片\image-20201221190526545.png)]
11.GCC 的常用选项及 GCC 的常用编译指令;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N8ZVi4Ys-1608779280953)(D:\数据可视化\大数据分析学习\图片\image-20201221190637991.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pC9Nsp8V-1608779280954)(D:\数据可视化\大数据分析学习\图片\image-20201221190653166.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZF3hoFO7-1608779280955)(D:\数据可视化\大数据分析学习\图片\image-20201221190702725.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SssHxrfW-1608779280955)(D:\数据可视化\大数据分析学习\图片\image-20201221190712351.png)]
GCC常用编译指令:
选项 | 用法 | 作用 |
---|---|---|
无选项编译链接 | gcc hello.c | 将hello.c预处理、汇编、编译并链接形成可执行文件,这里未指定输出文件,默认输出为a.out |
选项-o | gcc hello.c -o hello | 将hello.c预处理、汇编、编译并链接形成可执行文件helllo,-o选项用来指定输出文件的文件名 |
选项-E | gcc -E hello.c -o hello.i | 将hello.c预处理输出hello.i文件 |
选项-S | gcc -S hello.i | 将预处理输出文件hello.i汇编成hello.s文件 |
选项-c | gcc -c hello.s | 将汇编输出文件hello.s编译输出为hello.o文件 |
无选项链接 | gcc hello.o -o hello | 将编译输出文件hello.o链接成最终可执行文件hello |
选项-O | gcc -O1 hello.c hello | 使用编译优化级别1编译程序,级别为1~3,级别越大优化效果越好,但编译时间越长 |
选项-Wall | gcc -Wall hello.c -o hello | 能够显示所有的警告信息,以便于修改调试 |
12.GDB 的基本用法与命令;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EATbY8pi-1608779280956)(D:\数据可视化\大数据分析学习\图片\image-20201221191033312.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HpLaQTFj-1608779280957)(D:\数据可视化\大数据分析学习\图片\image-20201221191042183.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmmiVMsd-1608779280957)(D:\数据可视化\大数据分析学习\图片\image-20201221191052133.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aG804qZE-1608779280958)(D:\数据可视化\大数据分析学习\图片\image-20201221191112205.png)]
13.Make 程序和 Makefile 文件;
Make:自动编译所有内核代码文件,要
使用make工具程序,必须编写一个名称为
makefile(或Makefile)的文件。
Makefile:主要包含一些make要遵守的执
行规则和要求执行的命令等内容,用于告诉
make需要对所涉及的源文件做哪些操作和处
理以生成相应的目标文件。
14.Makefile 里主要包含的五个东西;
显式规则,隐含规则,变量定义,文件指示和注释
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8DVNCXDm-1608779280959)(D:\数据可视化\大数据分析学习\图片\image-20201221191310815.png)]
16.make 的工作原理;
17.Makefile 的语法-常用变量、自动变量、自动生成
依赖性、伪目标;
自动推导文件以及文件依赖关系后面的命令
伪目标:即便该命令执行出错,make也不管:.PHONY
伪目标是一个标签
1.GUN ARM 汇编编程基础: GUN ARM 汇编语句
格式、常用的预定义寄存器名称、GNU 汇编语言定
义入口点、常用伪操作(.end;.include;.gobal)。
GUN
执行指令,伪操作,伪指令
R0-R15:通用寄存器
A1-A4:入口参数,处理结果,暂存
IP:保存栈指针
LR:链接寄存器
CPSR:当前程序状态寄存器
SPSR:程序状态备份寄存器
GNU
汇编程序段:text代码段,数据段,未初始化,端数据
默认入口时_start标号,也可以使用ENTRY标记指明其他入口点
十进制,二进制0B,八进制0,十六进制
字符串“xxx\n”
表达式,其他符号使用与C语言类似
常用伪操作:数据定义伪操作,函数定义伪操作
伪操作:穿插在汇编编译、链接程序将源程序正确生成目标代码并合理分配存储区的一类符号
.end:表明源文件的结束
.include:在指定位置展开文件
.gobal:全局标号
主要作用:标识段的气质及属性,定义数据的类型,分配存储区大小,定义过程及其类型,表示程序的结束位置等
理解例题,会写展开代码
用GNU ARM汇编1程序设计实现20的阶乘,并将其64位结果放在R9和R8寄存器中(其中R9放高32位,R8放低32位)
.global _start
.text
_start:
MOV R8, #20 @低32位初始化为20
MOV R9, #0 @高32位初始化为0
SUB R0,R8, #1 @初始化计数器
Loop:
MOV R1,R9 @暂存高位值
UMULL R8,R9,R0,R8 @[R9 : R8] = R0 * R8 R9存储高8位的值,R8存储低8位的值
MLA R9,R1,R0,R9 @R9 = R1 * R0 + R9
SUBS R0,R0,#1 @计数器递减
BNE Loop @计数器不为0时继续循环
.Stop:
B Stop
.end @文件结束
- 将全局变量变为局部变量
- 使用信号量操作
- 使用中断处理函数:Disable_IRQ()
硬件部分:
- 复制CPSR到SPSR_
- 设置正确的CPSR位
- 切换到
- 保存返回地址到LR_
- 设置PC跳转到相应的异常向量表入口
软件部分:
- 把SPSR和LR压栈
- 把中断服务程序的俱存其压栈
- 开中断,允许嵌套中断
- 中断服务程序执行完后,恢复寄存器
- 弹出SPSR和PC,恢复执行
子程序间通过寄存器R0-R3传递参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FTcETynE-1608779280960)(D:\数据可视化\大数据分析学习\图片\image-20201223145818873.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zRDe5PBs-1608779280961)(D:\数据可视化\大数据分析学习\图片\image-20201223145828860.png)]
汇编程序调用C程序
- 在汇编程序中使用import伪指令事先声明将要调用的C语言函数
- 通过BL指令来调用c函数
c程序调用汇编程序
- 在汇编程序中使用EXPORT伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用
- 在C程序中使用extern关键字声明要调用的汇编子程序为外部函数
内联汇编:
- 事先一些高级语言不能事先或者不容易事先的功能
- 时间要求紧迫
- 支持大部分ARM指令和Thumb指令
asm(
汇编语句模板
输出部分
输入部分
修改部分(用寄存器保存下来)
)
1.宿主机-目标机开发模式;
宿主机:资源丰富
目标机:资源受限
4种链接方式:串口,以太网,USB,JTAG
()为中间得到的结果文件
代码编程(c/汇编源程序)->交叉编译(OBJ文件)->交叉链接(系统映像文件)->重定向与下载到目标板->目标板与宿主机开发平台一起调试
交叉调试 | 本地调试 |
---|---|
调试器和被调试程序运行在不同的计算机上 | 调试器和被调试器运行在同一台计算机上 |
可独立运行 | 需要操作系统的支持 |
被调试程序的装载由调试器完成 | 被调试程序的装载由Loader程序完成 |
需要通过外部通信的方式控制被调试程序 | 不需要通过外部通信的方式来控制被调试程序 |
可以调试不同指令集的程序 | 只能调试相同指令集的程序 |
交叉编译环境构建,主从机通信环境构建,交叉调试环境构建
交叉开发环境:交叉编译,交叉连接,交叉调试在内的嵌入式应用软件开发环境
**串口 **
特点及应用场合
- 驱动实现最简单
- 传输速度慢,距离短,不适合大数据量、长距离数据传输
- 需要在宿主机、目标寄两端均提供驱动
- 常用于宿主机-目标机的字符流通讯
网络
- 驱动实现相对复杂,一般采用精简的网络通讯协议
- 常用于宿主机-目标机的 大数据量数据传输,可以作为串口通讯的补充
- 需要在宿主机、目标寄两端均提供驱动
- 宿主机端实现服务器,目标机端提供客户端
- TFTP:简单文件传输协议
- BOOTTP:实现客户端IP地址的获取
USB
- USB接口支持热插拔,即插即用,传输速度快
- 简单易用
- 通常分主从设备端,主机端为主设备段,目标板为从设备端
- 主机端需要安装驱动程序,识别从设备后,可以传输数据
JTAG
- 是一个标准,对具有JTAG接口的芯片硬件电路进行边界扫描和故障检测
文件传输方式
- 串口传输方式
- 网络传输方式
- USB接口传输方式
- JTAG接口传输方式
- 移动存储设备
宿主机端的仿真
目标机端的仿真
- 从头编译
- 分别编译和安装工具链所需要的各种库及源代码
- 脚本编译
- 利用Crosstool脚本工具,选择合适的平台,一次性编译生成
- 下载使用
- 最为简单能满足所有人的开发需求
交叉汇编器
交叉链接器
用于处理可执行程序和库的一些基本工具
stub:在目标寄OS和宿主机OS分配添加一些功能模块
三种方法:
- ROM Monitor调试目标程序
- KGDB调试系统内核
- gdbserver调试应用程序
GDB Server
- 远程调试类Unix系统下的应用程序
- 通过类Unix系统提供的ptrace系统调用来实现对被调试应用程序的访问和控制
- 无法实现操作系统级的调试,只能实现应用程序级调试
- 应用程序代码无需与调试模块链接就能实现远程调试
在操作系统内核运行之前运行的一段小程序
功能
不通用
Linux系统启动过程
启动加载模式
下载模式
通用bootloader一般同时支持两种工作模式
5.BOOTLOADER 的生命周期;
stage1:
硬件设备初始化、为加载Boot Loader的stage2准备RAM空间,拷贝Boot Loader的stage2到RAM空间中,设置好堆栈,跳转到stage2的C入口点
汇编
简单的硬件初始化
stage2
初始化本阶段要使用到的硬件设备、检测系统内存映射,将kernel映像和根文件系统映像从flash读到RAM空间中,为内核设置启动参数、调用内核
C语言
复制数据
设置启动参数
串口通信等功能
7.典型 Boot loader 的特点及应用场景;(LILO、
GRUB、U-Boot、RedBoot、VIVI、BLOB);
LILO
- 引导Linux操作系统的启动
GNU GRUB
- 允许用户在开机时从多个操作系统选择一个内核镜像启动,并可以向其传递参数
- 动态可配置性
- 高度可移植性
- 丰富的用户接口
- 通过网络下载系统镜像
U-Boot
- 通用引导加载程序
- 对PowerPC系列处理器/对Linux支持最完善
- 功能:系统引导,基本辅助,设备驱动,上电自检功能,特殊功能等等等
- 三类目录
- 处理器体系结构或者开发板硬件直接相关
- 一些通用的函数或者驱动程序
- U-Boot的应用程序、工具或者文档
- 阶段一
- 汇编庇阿涅
- 通常与CPU紧密相关
- 初始化CPU
- 初始化相关设备
- 在start.s文件中实现
- 阶段2
- C语言编写
- 初始化
- 进入命令循环
- 加载操作系统内核
RedBoot
- 以eCos为基础的引导程序
- 为 **管理FLASH映像,映像下载,Redboot配置以及其他如串口、以太网口提供了一个交互式命令行接口
VIVI
- 为S3C24XX处理器引导Linux
- 由韩国Mizi公司开发
- 适合于ARM9处理器
BLOB
- MIPS公司开发的
负责控制进程访问CPU,保证进程能够公平的访问CPU,同时保证内核可以准时执行一些必需的硬件操作
是多个进程可以安全的共享机器的主存系统,并支持虚拟内存
通过提供一个所有设备的公共接口,VFS抽象类不同硬件设备的细节
提供对许多建网标准和网络硬件的访问
子系统为进程和进程间通信提供了一些机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zSZBfKZg-1608779280961)(D:\数据可视化\大数据分析学习\图片\image-20201223182520062.png)]
主要功能模块:初始化,内存管理,进程调度,进程间通信,中断处理,设备驱动,文件系统,网络通信,模块编程,其他
解压源代码
配置内核
编译内核和模块
配置启动文件
内存管理主要工作;
地址映射,内存空间分配,地址保护机制
ARM7及以下不支持MMU
ARM9及以上支持MMU
任务:屏蔽各种硬件的内存结构并向上层返回同一的访问接口
用一组寄存器实现:地址映射;地址访问保护与限制
内核空间:Linux内核的运行空间
用户空间:用户程序所在的空间
内核空间可以执行任意命令,调用系统的一切资源;
用户空间只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(又称 system call),才能向内核发出指令
Linux对物理内存空间按照分页方式进行管理,把物理内存划分成大小相同的物理页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-drHwgjGI-1608779280962)(D:\数据可视化\大数据分析学习\图片\image-20201223183844124.png)]
一个作业通常包括几个进程,几个进程共同完成一个任务,一个程序有多个进程,一个进程有一个或多个多个线程
Linux 系统的进程描述符;
进程控制块PCB
task_struct:进程标示符,状态,优先级,程序计数器,内存指针,上下文数据,I/O状态信息,记账信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KK8a7BIk-1608779280962)(D:\数据可视化\大数据分析学习\图片\image-20201223184139569.png)]
fork():通过系统调用创建一个与原来进程几乎完全相同的进程,父进程返回进程ID,子进程返回0,错误返回负值
Unix进程创建:
写时拷贝:推迟甚至免除拷贝数据的技术,只有在需要写入的时候,,数据才会被赋值,从而使各个进程拥有各自的拷贝
进程终止:正常的进程结束,通过信号,exit函数的调用
孤儿进程:父进程提前退出,子进程在退出时永远处于僵死状态
调度时机:
调度依据:
普通进程和实时进程,进程优先级,实时进程优先级
进程调度策略:
动态优先级+轮转法+分时调度
内核模块是一种没有经过链接,不能独立运行的目标文件,是在内核空间中运行的程序。经过链接装载到内核里面成为内核的一部分,可以访问内核的公用符号(函数和变量)
内核模块可以让操作系统内核在需要时载入和执行,在不需要时由操作系统卸载。它们扩展了操作系统内核的功能却不需要重新启动系统
如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜像来加入新的功能。
Linux支持动态可加载内核模块
模块的编译需要配置过的内核源码,生成的内核模块后缀为.ko
可根据需要动态加载/卸载,载入内核后,便为内核的一部分,与其他部分地位一致
内核更加模块化
配置更加灵活
Linux的模块主要由6部分组成:
1.模块的加载函数(必须)
2.模块的卸载函数(必须)
3.模块许可证(LICENSE)
4.模块参数(可选)
5.模块导出符号(可选)
6.模块作者等信息声明(可选)
内核模块相关命令:
lsmod:列出内核已载入模块的状态
insmod:向Linux内核添加删除模块
rmmod:删除内核中的一模块
modprobe:Linux内核添加删除模块
depmod:分析可加载模块的依赖性,生成modules.dep文件和映射文件
modinfo:显示内核模块的信息
中断处理:中断响应,中断处理,中断返回
ARM将中断控制器集成在CPU内部,由外设产生的中断请求都由芯片上的中断控制器汇总成一个IRQ中断请求
中断控制器向CPU提供一个中断请求寄存器和中断控制寄存器
实现:封装C库调用,直接调用
1.嵌入式文件系统设计目标
2.常用的嵌入式文件系统
本地文件系统:
网络文件系统
3.Linux 常见文件系统
windows下一切皆设备
-:普通文件,b:块设备文件,c:字符设备文件,d:目录,l:链接文件,p:命名管道文件,s:本地套接口
ext2,ext3,ext4,XFS和Btrfs。
XFS和Btrfs都使用了B-tree,
ext2文件系统所有数据块被划分成若干个分许,每个组包含相同个数的数据块。
ext3在ext2的基础上实现了支持日志,自动扩展,目录下的文件和子目录数不再受性能限制。数据安全性提高,目录下的文件和子目录数不再受性能限制
ext4文件系统容量、性能、扩展性、安全都得到了进一步提高。
xfs支持的文件和分区大,动态分配。
Btrfs支持的文件和分区更大,支持备份和恢复等。
基于4K的块大小
文件系统 | 最大文件名长度 | 最大文件大小 | 最大分区大小 |
---|---|---|---|
ext2 |
255bytes | 2TB | 16TB |
ext3 |
255bytes | 2TB | 16TB |
ext4 |
255bytes | 16TB | 1EB |
XFS |
255bytes | 8EB | 8EB |
Btrfs |
255bytes | 16EB | 16EB |
文件系统 | 适用场景 | 原因 |
---|---|---|
ext2 | U盘 | U盘一般不会存很多文件,且U盘的文件在电脑上有备份,安全性要求不高。ext2的兼容性没有fat好,大部分U盘格式使用fat |
ext3 | 对稳定性要求高的地方 | 没ext4好,只是ext4还不稳定 |
ext4 | 小文件较少 | ext系列的文件系统都不支持inode动态分配,如果有大量小文件需要存储,不建议使用ext4 |
xfs | 小文件多或者需要大的xttr空间 | xfs支持inode动态分配,所以不存在inode不够的情况,xttr的最大长度可以达到64k |
btrfs | 没有频繁的写操作,且需要dbtrfs的一些特性 | btrfs虽然还不稳定,但是支持众多的功能,如果需要这些功能并且不会频繁的写文件,选择btrfs |
proc是一个虚拟文件系统,只存在于内存中,通过它可以查询,设置系统的运行情况级各种系统参数。
lsmode==cat /proc/modules
/proc下的**“数字目录”指代了相应pid的进程**
Flash设备的特性:主要依靠储存电荷保存数据,具有抗机械正东、轻巧、紧凑、节能等良好特性。
问题:损耗均衡,坏块处理问题,掉电保护问题
Flash类型:NAND,NOR,DINOR,AND。
8.常见的 RAM 文件系统
Ramdisk:
将一部分固定大小的内存当作分区来使用
经常被访问不会被更改的文件;
ramfs/tmpfs:
工作于虚拟文件系统(VFS)层
存储一些临时性或经常要修改的数据
不能格式化,文件系大小可随所含文件内容大小变化
9.网络文件系统
通过TCP/UDP对NFS Client和NFS Server进行通信
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjMGDTh4-1608779280963)(D:\数据可视化\大数据分析学习\图片\image-20201224093328320.png)]
根文件系统是内核启动所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在跟文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z8s7Xqg2-1608779280964)(D:\数据可视化\大数据分析学习\图片\image-20201224093926470.png)]
目录 | 内容 |
---|---|
bin | 必要的用户命令 |
sbin | 必要的系统管理员命令 |
usr | 大多数用户使用的应用程序和文件目录 |
proc | 提供内核和进程信息的proc文件系统 |
dev | 设备文件及其他特殊文件 |
etc | 系统配置文件 |
lib | 必要的链接库 |
*boot | 引导加载程序使用的静态文件 |
*home | 用户主目录 |
mnt | 临时挂在的文件系统的挂载点 |
*opt | 附加软件的安装目录 |
*root | root用户主目录 |
tmp | 临时文件目录 |
var | 监控程序和工具程序存放的可变数据 |
Linux跟文件系统包含文件:
1.将交叉编译器内的库文件拷贝到对应的lib目录下
2.建立/dev目录
3.下载系统应用程序
4.创建并执行系统初始化文件
一、编译busybox
二、制作根文件系统目录
mkdir rootfs
cd rootfs
//建立目录结构
mkdir bin etc dev lib proc tmp root home sys usr sbin var mnt
//运行库-来自工具链
cp -a /usr/arm-linux-gnueabi/lib/* lib
//busybox工具集
cp -a /home/gantang/busybox-1.21.0/_install/* .
//设备文件
sudo cp -a /dev/console /dev/loop0 /dev/loop1 /dev/null /dev/ram0 /dev/tty /dev/tty0 /dev/tty1 /dev/tty2 /dev/zero dev
vim etc/mdev.conf
vi etc/init.d/rcS
1.外部设备与 CPU 的通讯信息;
3.什么是驱动程序;
设备驱动程序是操作系统中唯一知道控制器有几个寄存器及它们用途的程序
每个设备文件对应两个设备号
7.Linux 设备驱动的特点;
抽象接口,驱动程序里面去实现需要的接口
Linux应用程序可以通过设备文件的一组固定的入口点来访问驱动程序,这组入口点是由每个设备的设备驱动程序提供的
系统试图使它对各类设备的输入输出看起来像是对普通文件一样,把设备映射为一种特殊的文件
9.字符设备驱动框架;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A2WFZozz-1608779280964)(D:\数据可视化\大数据分析学习\图片\image-20201224105927239.png)]
10.file结构体与inode之间的关系;
11.cdev 结构体与其操作函数;
在使用cdev_add()向系统注册字符设备之前应先申请设备号
已知设备号:int register_chrdev_region(dev_t from,
unsigned count, const char *name);
未知设备号:int alloc_chrdev_region(dev_t *dev,
unsigned baseminor, unsigned count, const char *name);
使用上面两种方式申请的设备号,都应该在不使用设备时,释放设备号。设备号的释放统一使用下面的函数:
void unregister_chrdev_region(dev_t from, unsigned count);
#从用户态拷贝到内核态:
unsigned long copy_from_user(void *to, const void _user* from, unsigned long count);
#从内核态拷贝到用户态:
unsigned long copy_to_user(void _user* to, const void *from, unsigned long count);
指令直接对端口进行输入、输出控制
3.什么是驱动程序;
设备驱动程序是操作系统中唯一知道控制器有几个寄存器及它们用途的程序
每个设备文件对应两个设备号
7.Linux 设备驱动的特点;
抽象接口,驱动程序里面去实现需要的接口
Linux应用程序可以通过设备文件的一组固定的入口点来访问驱动程序,这组入口点是由每个设备的设备驱动程序提供的
系统试图使它对各类设备的输入输出看起来像是对普通文件一样,把设备映射为一种特殊的文件
9.字符设备驱动框架;
[外链图片转存中…(img-A2WFZozz-1608779280964)]
10.file结构体与inode之间的关系;
11.cdev 结构体与其操作函数;
在使用cdev_add()向系统注册字符设备之前应先申请设备号
已知设备号:int register_chrdev_region(dev_t from,
unsigned count, const char *name);
未知设备号:int alloc_chrdev_region(dev_t *dev,
unsigned baseminor, unsigned count, const char *name);
使用上面两种方式申请的设备号,都应该在不使用设备时,释放设备号。设备号的释放统一使用下面的函数:
void unregister_chrdev_region(dev_t from, unsigned count);
#从用户态拷贝到内核态:
unsigned long copy_from_user(void *to, const void _user* from, unsigned long count);
#从内核态拷贝到用户态:
unsigned long copy_to_user(void _user* to, const void *from, unsigned long count);