嵌入式系统应用领域:只能交通,智能家居,智能手表,机器人,智慧医疗,智能汽车,智能电网
嵌入式系统是以应用为中心,以计算机技术为基础,并且软/硬件可裁切,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
嵌入式系统的特点:
a) 专用性强。由于嵌入式系统通常是面向某个特定应用的,所以嵌入式系统的硬件和软件,尤其是软件,都是为特定用户群设计的,通常具有某种专用性的特点
b) 体积小型化。嵌入式计算机把通用计算机系统中许多由板卡完成的任务集成在芯片内部,从而有利于实现小型化,方便将嵌入式系统嵌入目标系统中
c) 实时性好。嵌入式系统广泛应用于生产过程控制、数据采集、传输通信等场合,主要用来对宿主对象进行控制,所以对嵌入式系统有或多或少的实时性要求。例如,对武器中的嵌入式系统,某些工业控制装置中的控制系统等的实时性要求就极高
d) 可裁剪性好。从嵌入式系统专用性的特点来看,嵌入式系统的供应者理应提供各式各样的硬件和软件以备选用,力争在同样的硅片面积上实现更高的性能,这样才能在具体应用中更具竞争力
e) 可靠性高。由于有些嵌入式系统所承担的计算任务涉及被控产品的关键质量、人身设备安全,甚至国家机密等重大事务,且有些嵌入式系统的宿主对象工作在无人值守的场合,如在危险性高的工业环境和恶劣的野外环境中的监控装置。所以,与普通系统相比较,嵌入式系统对可靠性的要求极高
f) 功耗低。有许多嵌入式系统的宿主对象是一些小型应用系统,如移动电话、MP3、数码相机等,这些设备不可能配置交流电源或容量较大的电源
g) 嵌入式系统本身不具备自我开发能力,必须借助通用计算机平台来开发。嵌入式系统设计完成以后,普通用户通常没有办法对其中的程序或硬件结构进行修改,必须有一套开发工具和环境才能进行
h) 嵌入式系统通常采用“软硬件协同设计*”的方法实现
4. **嵌入式实时系统:**实时系统能够在指定或者确定的时间内完成系统功能和外部或内部、同步或异步时间做出响应的系统
硬实时:硬实时系统有一个刚性的、不可改变的时间限制,它不允许任何超出时限的错误。超时错误会带来损害甚至导致系统失败、或者导致系统不能实现它的预期目标。比如在航天领域,必须保证100%正确b) 软实时系统的时限是一个柔性灵活的,它可以容忍偶然的超时错误。失败造成的后果并不严重,例如在网络中仅仅是轻微地降低了系统的吞吐量。
5. **嵌入式系统的组成:**由软件和硬件组成
a) 硬件结构:处理器,存储器,外部设备,I/O接口,图形控制器
b) 软件体系:
嵌入式应用软件是针对特定应用领域,用来实现用户预期目标的软件
中间件层是用于帮助和支持应用软件开发的软件,通常包括数据库、网络协议、图形支持及相应开发工具等,例如:MySQL、TCP/IP、GU1等都属于这一类软件
操作系统层具有一般操作系统的核心功能,负责嵌入式系统的全部软硬件资源的分配、调度工作控制、协调并发活动
驱动层是直接与硬件打交道的一层,它为操作系统和应用提供硬件驱动或底层核心支持
嵌入式处理器除了ARM还有PowerPC、MIPS、Motorola 68K、ColdFire
嵌入式操作系统:1)Windows CE(2)VxWorks(3)pSOS(4)QNX(5)Palm OS(6)嵌入式Linux
操作系统内核的主要功能有哪些:
a) 支撑功能
中断处理
时钟管理
原语操作:原语(Primitive)是由若干条指令组成的,用于完成一定功能的一个过程。
b)管理功能
进程管理:进程的调度与分派、创建与撤销等;实现进程同步、进程通信的原语
存储器管理:如将逻辑地址转换为物理地址、内存的分配与回收等
设备管理:各类设备的驱动程序等
ARM处理器的优点
a) 体积小、低功耗、低成本、高性能;
b) 支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;
c) 大量使用寄存器,指令执行速度更快;
d) 大多数数据操作都在寄存器中完成;
e) 寻址方式灵活简单,执行效率高;
f) 指令长度固定。
ARM 汇编指令的寻址方式有哪些,每种记住一个汇编例子语句。
a) 寄存器寻址
ADD R0, R1, R2 ;R1+R2->R0
b) 立即寻址
ADD R0, #1 ;R0+1->R0
ADD R0, R0, #0x3F ;R0+0x3F->R0
c) 寄存器间接寻址
ADD R0, R1, [R2] ;R1+[R2]->R0
LDR R0, [R1] ;[R1]->R0
d) 寄存器变址寻址
基址变址寻址是把基址寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。该方式常用于访问基地址附近的某些存储单元,一般有以下几种方式:
LDR R0, [R1, #4] ;[R1+4]->R0
第一条指令,将寄存器R1的值加上4作为操作数的有效地址,取得操作数后存入R0中。
LDR R0, [R1, #4]! ;[R1+4]->R0、R1+4->R1
第二条指令,将寄存器R1的值加上4作为操作数的有效地址,取得操作数后存入R0中,然后寄存器R1的值加上4个字节。
LDR R0, [R1], #4 ;[R1]->R0、R1+4->R1
第三条指令,将寄存器R1的值作为操作数的有效地址,取得操作数后存入R0中,然后寄存器R1的值加上4个字节。
LDR R0, [R1, R2] ;[R1+R2]->R0
第四条指令,将寄存器R1和R2的值相加作为操作数的有效地址,取得操作数后存入R0中。
e) 多寄存器寻址
LDMIA R0, {R1,R2,R3,R4,} ;[R0]->R1,[R0+4]->R2,[R0+8]->R3,[R0+12]->R4
f) 堆栈寻址
满递增堆栈:堆栈指针指向最后压入的数据,由低地址向高地址生成。
满递减堆栈:堆栈指针指向最后压入的数据,由高地址向低地址生成。
空递增堆栈:堆栈指针指向下一个将要压入数据的空位置,由低地址向高地址生成。
空递减堆栈:堆栈指针指向下一个将要压入数据的空位置,由高地址向低地址生成。
g) 块拷贝寻址
LDMIA R0!,{R2-R9} ;从R0指向的位置复制8个字到R2-R9
STMIA R1,{R2-R9} ;R2-R9复制8个字到R1指向的位置
h) 相对寻址
B rel ;(PC)+rel->PC
//以程计数器PC的当前值为及地址,指令中的相对地址标号为偏移量
ARM 微处理器的工作状态、工作模式要重点掌握
两种工作状态
ARM状态:32位,ARM状态执行字对齐的32位ARM指令。
Thumb状态,16位,执行半字对齐的16位指令。
七种工作模式
用户模式:用户模式是用户程序的工作模式,它运行在操作系统的用户态,它没有权限去操作其它硬件资源,只能执行处理自己的数据,也不能切换到其它模式下,要想访问硬件资源或切换到其它模式只能通过软中断或产生异常。
系统模式:系统模式是特权模式,不受用户模式的限制。用户模式和系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。
SVC模式:管理模式,它是一种操作系统保护模式。当复位或软中断指令执行时处理器将进入该模式
FIQ模式:快速中断模式,支持高速数据传输和通道处理,当一个FIQ中断产生是将进入该模式
IRQ模式:也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源。
中止模式:中止模式用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式,linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。
未定义指令异常模式:未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。
ARM 中寄存器特点,R13,14,15 的这几个寄存器的特殊作用要重点记忆和掌握
ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个位状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC(即R15)、一个状态寄存器都是可访问的。
通用寄存器
通用寄存器包括R0~R15,可以分为3类:
(1)未分组寄存器R0~R7
(2)分组寄存器R8~R14
(3)程序计数器PC(R15)
堆栈指针SP(R13)
寄存器R13在ARM指令中常用作堆栈指针SP,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针,而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针.
由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间。这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。
子程序链接寄存器LR(R14)
R14称为子程序链接寄存器LR(Link Register),当执行子程序调用指令(BL)时,R14可得到R15(程序计数器PC)的备份
在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值复制给R14,执行完子程序后,又将R14的值复制回PC,即可完成子程序的调用返回。
程序计数器PC(R15)
寄存器R15用作程序计数器(PC),在ARM状态下,位[1:0]为0,位[31:2]用于保存PC,在Thumb状态下,位[0]为0,位[31:1]用于保存PC.
由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节程序状态寄存器
ARM 微处理器的存储器格式(大小端) (一个具体的数在大小端模式下究竟如何存储)、
寻址方式(理解)
大端格式和小端格式是两种存储字数据的方法。具体讲是在ARM体系的嵌入式系统结构中存储器存放数据的两种叫法,在嵌入式体系结构中将存储器看作是从零地址开始的字节的线性组合。从第03字节放置第一个存储的字数据,从第47字节放置第二个存储的字数据,依次排序。作为32位的微处理器,ARM体系结构可支持最大寻址4GB(2^32字节)。
大端格式是指字数据的高字节放置在地地址中,而低字节数据放置在高地址中。
小端格式是指字数据的高字节放置在高地址中,而低字节数据放置在地地址中。ARM中一个字数据是4个字节即32位的数据.。在存储器中每个地址存放一个字节。
例如:在内存中双字0x01020304(DWORD)的存储方式。 内存地址 4000 4001 4002 4003 小端格式是: 04 03 02 01 大端格式是: 01 02 03 04
微机原理讲的一般是8086/8088体系结构,x86系列的CPU都是小端格式的字节排序
Linux 开源开发工具链包含哪些工具,STM32 开发工具 Keil
对于嵌入式Linux开发者,可以选用GUN开发工具,GUN gcc编译器不仅可以编译Linux操作系统下运行的应用程序、编译linux本身,还可以用于交叉编译。
GUN gcc工具链包括 C交叉编译器gcc、交叉汇编工具as、反汇编工具objdump、链接工具ld、调试工具gdb
GCC(GNU Compiler Collection)是编译器。对于C/C++语言的完整支持,需要支持glibc
objdump:可发编译二进制文件,也可以对对象文件进行反汇编,并查看机器代码。
链接工具ld:将汇编过的多个二进制文件进行链接,成为一个可执行的二进制文件
GDB是调试工具,可以读取可执行程序中的符号表,对程序进行源码调试。
Keil工具
uVersion4只支持Cortex-M4,Cortex-M7则需要安装uVersion5
异常概念及处理过程
异常是指程序运行过程中发生的一些不正常事件(如除0溢出,数组下标越界,所要读取的文件不存在)
异常处理机制
捕获机制:try-catch-finally
1. try{}语句块:里面是要检测的Java代码,可能会抛出异常,也可能会正常运行 2. catch(异常类型){}块:是当Java运行时,系统接收到try块中所抛出异常对象时,会寻找能处理这一异常catch块来进行处理,注意异常类型需要与try{}语句块可能抛出的异常要匹配。可以有多个catch块。不同的异常类型对应不同的处理代码。 3. finally{}语句块:不管系统有没有抛出异常,都会去执行,一般用来释放资源。除了在之前执行了 System.exit(0)
抛出机制:throw,throws
抛出的异常交给调用方法的人来捕获:异常处理和异常清理的解耦
ARM的异常的种类,各进入何种模式(个人补充,非考试)
复位异常,(管理模式);
未定义指令异常,(未定义模式);
软件中断(SWI)异常,(管理模式);
指令预取中止异常,(中止模式);
数据访问中止(Data Abort)(中止模式);
外部中断请求(IRQ)(IRQ模式);
快速中断请求(FIQ)(FIQ模式)
交叉开发的概念(宿主机、目标机)、交叉开发工具
交叉开环境由宿主机和目标机组成,宿主机与目标机之间在物理连接的基础上建立起逻辑连接
- 宿主机:用于开发嵌入式系统的计算机,一般为PC机(或者工作站),具备丰富的软硬件资源,为嵌入式软件的开发提供全过程支持;
- 目标机(Target ) : 所开发的嵌入式系统,是嵌入式软件的运行环境,其硬件软件是为特定应用定制的;
在开发过程中,目标机端需接收和执行宿主机发出的各种命令。如设置断点、读内存、写内存等,将结果返回给宿主机,配合宿主机各方面的工作
交叉开发工具
源程序编辑器、交叉编辑器、交叉调试器、仿真器、下载程序
裁剪与移植概念、Linux 下配置内核和编译内核的基本命令,如 make menuconfig 、
make xconfig、make zImage 等命令的含义
Linux的程序源码全部公开,任何人都可以根据自己的需要裁剪内核,以适应自己的系统
make menuconfig:基于文本选择的配置界面,字符终端下推荐使用
make xconfig:基于图形窗口模式的配置界面,Xwindow下推荐使用
make oldconfig,使用已有的配置文件,但是会询问新增的配置选项;
make oldconfig,使用已有的配置文件,但是会询问新增的配置选项;
make zlmage:编译内核
make modules_install:安装内核
串口在调试开发板时的作用,用串口调试时,输入是来自哪里,输出是由什么产生的
串口在调试开发板的作用
- 向开发板下载程序
- 监控程序运行
- 执行交互命令
GCC、Make 的基本用法,重点掌握 gcc 命令的常用基本编译选项,如-c -o 等等。
GCC 命令参数
-c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
gcc -c hello.c
-S 只激活预处理和编译,就是指把文件编译成为汇编代码。
-o 制定目标名称, 默认的时候, gcc 编译出来的文件是 a.out
-E 只激活预处理,这个不生成文件, 你需要把它重定向到一个输出文件里面。
gcc -E hello.c > pianoapan.txt gcc -E hello.c | more
-W,在编译中开启一些额外的警告(warning)信息。-Wall,打开所有的警告信息。
什么是系统调用,什么是中断。
系统调用是通向***操作系统***本身的接口,是面向底层硬件的。通过系统调用,可以使得用户态运行的进程与硬件设备(如CPU、磁盘、打印机等)进行交互,是操作系统留给应用程序的一个接口。下面适用于访问设备驱动程序的系统调用:
open: 打开文件或设备
read: 从打开的文件或设备中读取数据
write: 向打开的文件或设备中写入数据
close: 关闭文件或设备
ioctl: 把控制信息传递给设备驱动文件用户进程需要发生系统调用时,内核将调用内核相关函数来实现(sys_read(),sys_write(),sys_fork())
用户程序不能直接调用这些函数,这些函数运行在内核态,CPU 通过软中断切换到内核态开始执行内核系统调用函数。
用户态–>系统调用–>内核态–>返回用户态
中断:中断是指来自CPU执行指令以外的事件发生后,处理机暂停正在运行的程序,转去执行处理该事件的程序的过程。
**异常:**异常是指源自CPU执行指令内部的事件发生后,处理机暂停正在运行的程序,转去执行该事件的过程。
进程间通信有哪些形式,多机间呢?
管道:通常指无名管道,是 UNIX 系统IPC最古老的形式。
- 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
- 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
- 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
消息队列:是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
- 面向记录的,其中的消息具有特定的格式以及特定的优先级
- 独立于发送与接收进程。进程终止时,消息队列及内容并不会被删除
- 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
信号量:信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
共享内存:共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。
套接字:也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
多主机间通信用套接字
接口含义、功能、信息、接口寄存器的分类,每类寄存器的作用
接口:微处理器与外部设备的连接电路
功能:
- 数据缓冲功能
- 执行CPU命令功能
- 提供信息交换的握手信号
- 设备选择功能
- 信号转换功能
- 中断管理功能
- 数据宽度和数据格式转换功能
接口信息:
- 数据信息:8位,16位,32位
- 状态信息:ready,empty,busy,ack
- 控制信息:启动、停止
接口分类:串口,IIC总线,SPI总线,CAN总线,USB总线
GPIO寄存器:
- 端口配置寄存器:由于部分I/O引脚有第二功能,所以需要通过设置端口配置寄存器来选择GPx口I/O的功能
- 端口数据寄存器:当I/O设置为GPIO输出模式时,端口数据寄存器控制相应I/O口输出高电平或低电平。当I/O设置为GPIO输入模式时,读取端口数据寄存器即取得I/O口线上的电平状态。
- 端口上拉寄存器:可以通过设置端口上拉寄存器使能或禁止S3C2410的I/O内部上拉电阻
中断的基本概念、中断处理过程框图、与中断相关的各个寄存器作用
中断:中断是指来自CPU执行指令以外的事件发生后,处理机暂停正在运行的程序,转去执行处理该事件的程序的过程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3bdAMyvb-1624176173081)(file:///E:\desktop\file\Tencent Files\1551969058\Image\C2C\HUD_MLLZC33ZEGBW8{3P6RR.png)]
与中断相关的寄存器
- 中断挂起寄存器:表明一个中断请求是否为挂起
- 中断模式寄存器:如果指定为0为IRQ模式中断处理,若指定为1为FIQ模式
- 中断屏蔽寄存器:表明如果中断相应的屏蔽被置位为0,则禁止该中断
- 中断优先级寄存器:中断优先级寄存器在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高位)分别是B8H~BFH,IP用来设定各个中断源属于两级中断的哪一级。该寄存器可以进行位寻址,即可对该寄存器的每一位进行单独操作。单片机复位时IP全部被清零。
- 中断偏移寄存器:表明了是哪个IRQ模式的中断请求在INTPND寄存器中。
- 次级源挂起寄存器:可以通过写入数据到此寄存器来清除SUBSRCPND寄存器的指定位
- 中断次级屏蔽寄存器:此寄存器有15位,每一位都与一个中断源相联系。
设备驱动程序的作用与功能,Linux 下设备驱动程序的分类。
设备驱动充当了硬件和应用软件之间的纽带,它使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。
linux设备驱动程序分类
- 字符设备:所有能够像字节流一样访问的设备,他们被映射为文件系统中的节点,通常在/dev/目录下面;包含open,read,write,close等系统调用的实现。鼠标,键盘,串行口
- 块设备:可以通过文件系统来访问,可一次传递任意多的字节。硬盘软盘设备,CD-ROM
- 网络设备:由内核中网络子系统驱动构成,负责发送和接收数据包。它们的数据传送往往是面向流的,因此很难将他们映射到一个文件系统的节点上。
模块驱动程序、框架驱动程序的理解,模块化驱动程序的编译、加载、卸载命令,对驱
动程序进行测试的应用程序的基本写法。
armv4l-unknown-linux-gcc -Wall -C -0 \ -DMODULE -D KERNEL \ -l/kernel/include demo.c -0 demo.o //编译驱动模块 insmod module_name //插入模块 lsmod //查看模块 cat /proc/devices //查看设备 ls /dev //查看设备 rmmod module_name //卸载驱动
调用驱动 #include
#include #include < stdlib.h> int main() { int fd; fd=open("/dev/demo", 0 RDWR); if(fd < 0) { exit(fd); } read(fd, buffer, size); write(fd, buffer, size); close(fd); return 0; } 测试程序 #include #include #include < stdlib.h> char *device=“/dev/skeleton” int skeleton_fd; char cBuffer[100]; char readchar[100];
引导程序 (boot loader) 的两种模式、两个阶段
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境
Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行
两种模式:
启动加载模式、下载模式
两个阶段
第一阶段主要包含依赖于CPU的体系结构硬件初始化的代码,通常都用汇编语言来实现。
这个阶段的任务有:
基本的硬件设备初始化(屏蔽所有的中断、关闭处理器内部指令/数据Cache等)
为第二阶段准备RAM空间
如果是从某个固态存储媒质中,则复制Bootloader的第二阶段代码到RAM 。
设置堆栈。
第二阶段通常用C语言完成,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。
这个阶段的任务有 :
初始化本阶段要使用到的硬件设备。
检测系统内存映射。
将内核映像和根文件系统映像从Flash读到RAM。
为内核设置启动参数。
调用内核 。
,C 程序能在 Boot 程序中调用的前提是什么
为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。
在C程序中不需要使用任何关键字来声明将被汇编语言调用的C程序
但是在汇编程序调用该C程序之前需要在汇编语言程序中使用IMPORT伪操作来声明该C程序。在汇编程序中通过BL 指令来调用子程序。
在C语言程序如何调用汇编语言程序?
为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。
在汇编程序中需要使用EXPORT伪操作来声明,使得本程序可以被其它程序调用。
同时,在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。