目录
嵌入式系统概述
嵌入式硬件
嵌入式软件
ARM寄存器
ARM硬件结构
计算机体系结构分类
ARM处理器结构
ARM储存器管理单元
ARM编程模式
汇编语言
汇编语言的构成
汇编语言示例
嵌入式操作系统
ARM技术接口
JTAG
键盘接口
通信接口
S3C2410相关知识
常考知识点
嵌入式系统的定义
嵌入式系统是指以应用为中心和以计算机技术为基础的,并且软硬件是可裁剪的,能满足应用系统对功能、可靠性、成本、体积、功耗等指标严格要求的专用计算机系统
嵌入式系统的组成
嵌入式系统一般由硬件、软件和嵌入式系统的开发工具和开发系统三部分组成
嵌入式处理器的分类
嵌入式处理器可分为以下四种:
嵌入式最小系统
电源电路、复位电路、时钟电路、存储器、调试测试接口
嵌入式系统的硬件由嵌入式最小硬件系统及相关的通道或接口组成
嵌入式核心芯片
嵌入式系统硬件的核心是嵌入式微处理器,有时为了提高系统的信息处理能力,通常外接DSP和DSP协处理器,以微处理器为核心的集成多功能的SoC系统芯片已成为嵌入式系统的核心
嵌入式系统存储器
ROM(Read Only Memory)只读存储器,一次写入,多次读取
RAM(Random Access Memory)随机存取寄存器
Flash存储器包括了两种存储器的优点,主要分为以下两种:
嵌入式系统的相关通道
嵌入式系统软件的特点
嵌入式系统上的软件具有结构精简、代码轻量化、占用存储资源少的特点
嵌入式软件主要有以下层次
驱动层程序
驱动层程序一般包括硬件抽象层(HAL)、板级支持包(BSP)以及设备驱动程序
硬件抽象层(HAL):硬件抽象层位于硬件电路板和操作系统之间,改善了PC机操作系统的稳定性且隐藏了硬件的差异性,使操作系统在硬件平台上运行时,内核代码不需要改动,提高可移植性
板级支持包(BSP):板级支持包是一些汇编程序和C语言代码相结合的操作系统底层的软件,包括初始化程序、设备驱动程序、配置文件和引导加载程序
实时操作系统(RTOS)
嵌入式操作系统大多数是实时系统
ROTS有三个实时指标:响应时间、吞吐量、生存时间,响应时间的具体标准:中断延迟时间和任务切换时间
RTOS中任务开始到任务必须完成的时间间隔为截至时间,任务预期最快完成时间为任务执行预设
R0~R7 |
低位寄存器 |
R8~R12 |
高位寄存器 |
SP(R13) |
堆栈寄存器 |
LR(R14) |
链接寄存器(调用一个子程序时,该寄存器返回存储地址) |
PC(R15) |
计数寄存器(指向当前程序地址) |
CPSR |
程序状态寄存器 |
PRIMASK |
中断屏蔽寄存器 |
CONTROL |
控制寄存器 |
CPSR寄存器
条件标志位
N |
N=1表示结果为负数,N=0表示结果为正数或零 |
Z |
当Z=1表示运算结果为零,Z=0表示结果不为零 |
C |
加法运算时,运算结果产生了进位,C=1,否则C=0 减法运算时,运算结果产生了借位,C=1,否则C=0 对于包含移位操作的非法加/减运算指令,C为移出值的最后一位 |
V |
V=1表示符号位溢出 |
Q |
在ARM V5及以上版本的E系列处理器中国,用Q标志位是否发生了溢出 |
控制位
I=1,表示禁止IRQ中断,否则表示允许IRQ中断
F=1,表示禁止FIQ中断,否则表示允许FIQ中断
冯·诺依曼结构和哈佛结构是两种典型的计算机体系结构
程序存储器和数据存储器通过一套总线相连的结构称为冯·诺依曼结构
程序存储器和数据存储器通过两套总线相连的结构称为哈佛结构
ARM处理器系列
ARM7~ARM9为经典ARM处理器
ARM11之后则以Cortex命名,分为-A、-R、-M三个系列,分别面向高端应用,实时控制和微控制器,且Cortex系列均采用ARMv7处理器架构
需要注意的是:ARM7不支持Thumb指令集,ARM9不支持Thumb2指令集
ARM Cortex-A系列全部基于ARMv7-A体系结构
ARM处理器命名中TDMI的含义
T |
支持16位压缩指令集Thumb |
D |
支持片上Debug |
M |
内嵌硬件乘法器 |
I |
嵌入式ICE,支持片上断点和调试点 |
ARM处理器具有单周期、指令流水线的特点
所有的ARM处理器采用RISC(精简指令集)技术,大多数ARM处理器采用哈佛结构
嵌入式系统的硬件部分主体为处理器和存储器,通过输入/输出接口与外界联系
低端嵌入式系统由监控程序对系统进行控制,不使用操作系统
驻留监控软件是固话在目标机ROM上的,不需要专门的硬件调试和仿真设备
U-Boot是一种通用的引导加载程序,对PowerPC系列支持最丰富,对Linux支持最完善
储存管理端元用于在CPU和物理内存之间进行地址转换,它是将地址从逻辑空间映射到物理空间,因此这个转换过程一般称为内存映射
MMU控制了存储器的访问顺序,控制存储器的访问权限,在每次访问内存时MMU先查询TLB,如果查不到则查询整个页表以得到物理地址
处理器模式
ARM处理器有七种工作模式,除用户模式外其余六种都被称为特权模式或非用户模式;在特权模式中,除系统模式之外的其余五种又被称为异常模式
用户模式 |
正常的程序运行状态 |
快速中断模式 |
用于高速数据传输或通道处理,用以处理FIQ高速中断 |
外部中断模式 |
用于通用的中断处理 |
管理模式 |
操作系统的保护模式 |
中止模式 |
用于虚拟存储及存储保护 |
未定义指令模式 |
用于支持硬件协处理器的软件仿真 |
系统模式 |
运行特权级的操作系统任务 |
不同工作模式之间的切换方式有两种:
寄存器组织
ARM处理器中共有37个寄存器,寄存器全部为32位寄存器(31个通用寄存器包括PC,6个状态寄存器)
状态寄存器包括寄存器CPSR和寄存器SPSR,当前程序状态寄存器CPSR可以在任意工作状态下被访问,程序状态备份寄存器SPSR只有在异常情况下才能被访问,各种异常模式都有自己的SPSR(五个)
异常中断
异常中断是指处理器由于外部或内部的原因,停止执行当前任务,转而处理特定的事件,处理完后返回原程序,继续执行
当异常发生时,处理器首先自动保存当前工作状态,即返回地址存入寄存器R14,当前程序状态寄存器CPSR存入SPSR中,接着进入相应的工作模式,并执行特定的指令
复位中断的优先级最高
ARM的异常类型
复位异常、数据访问终止异常、快速中断请求异常、一般中断请求、预取指令异常、软件中断异常、未定义异常
每个异常中断向量占四个字节,其中复位异常级别最高
复位异常后PC指针无条件指向0x00000000
嵌入式系统加电和复位时,所有微处理器都从生产商预留的位置取指令,CPU执行的第一个指令为Bootloader中的第一条指令
[标签] 指令/伪指令/伪操作 操作数 [;语句的注释]
其中,[ ]中的内容为可选内容
标签:标签是一个符号,可以代表指令的地址、变量、数据的地址和变量
指令/伪指令/伪操作:指令的助记符或定义符,它告诉ARM的处理器应该执行什么操作或者告诉汇编程序伪指令语句的伪操作功能
汇编语言语言源文件后缀名为.s
实例汇编程序
CODE32 ;32位的ARM指令段
AREA codesec,CODE,READONLY ;代码段,名称为codesec,属性为只读
main PROC ;函数main
STMFD sp!,{lr} ;保存必要的寄存器和返回地址到数据栈
ADR r0,strhello ;取标签strhello代表的地址值
BL _printf ;调用c运行时库的_printf函数打印“hello world”
BL welcomefun ;调用子程序welcomfun
LDMFD sp!,{pc} ;恢复寄存器的值
strhello ;strhello代表本地字符串的地址
DCB "hello world!\n\0" ;定义一段字节空间
ENDP ;main函数结束
welcomefun ;子函数welcomefun
STMED sp!,{lr} ;保存必要的寄存器和返回值到数据栈
ADR r0,adrstram ;取adrstrarm的值放到寄存器R0中
LDR r0,[r0,#0] ;将stram的值放到R0中
BL _printf ;调用C运行时的库_printf函数打印“hello world”
LDMFD sp!,{pc} ;恢复寄存器的值
adrstrarm ;addstrarm标签
DCD strarm ;保存strarm的值
AREA constdatasec,DATA,READONLY,ALIGN=0 ;数据段,名称为constdatasec,属性为只读
strarm
DCB "Welcome to ARM world!\n\0" ;存放字符串
EXPORT main ;导出main函数供外部调用
;引入三个C运行时库函数和ARM库
IMPORT _main
IMPORT __main
IMPORT _printf
IMPORT || Lib$$Request$$armlib||,WEAK
END ;程序结束
嵌入式系统的特点
微内核和宏内核的区别
微内核的设计思想更好一些,它将系统分为各个小的功能模块,把设计难度大大降低。因此,系统的维护与修改也方便进行,但是微内核的通信失效率很高,是一个大问题
宏内核的功能模块之间的耦合度太高,将修改与维护的代价提高宏内核因为是直接调用的,所以效率比较高
微内核采用服务器方式实现,所有的进程请求使用统一的接口,进程不区分内核模式和用户模式
常见的操作系统分类
微内核 |
IOS、Windows NT 、Symbian、VxWorks、QNX、μC/OC-Ⅱ |
宏内核 |
Linux、UNIX、WinCE、Android,DOS |
TinyOS
TinyOS专为嵌入式无线传感网络设计,其技术特点为轻线程、主动消息、事件驱动和组件化编程
μOC/OS-Ⅱ
μOC/OS-Ⅱ操作系统各任务间不共享堆栈
μOC/OS-Ⅱ是一种基于优先级的硬实时内核,内核几乎没有驱动
μOC/OS-Ⅱ绝大部分是C语言编写的,而CPU硬件部分是用汇编语言写的,总量约为200行代码
μOC/OS-Ⅱ最多支持64个任务(8个系统保留任务),0为最高优先级,63为最低优先级
μOC/OS-Ⅱ具有执行效率高、占用空间小、实时性和可扩展性强等特点
μOC/OS-Ⅱ允许中断嵌套,层数最多为255层
μOC/OS-Ⅱ任务管理中的空闲任务为系统创建的第一个任务,它是必不可少的任务,也是优先级最低的任务,且其工作状态是可变化的
μOC/OS-Ⅱ操作系统自上而下的顺序为:应用软件层、应用程序接口层、μOC/OS-Ⅱ内核层、设备驱动程序层
系统启动过程中,Bootloader执行完毕后,调用应用程序主文件(通常是main.c)里的main函数。main函数在执行过程中除了用户函数和硬件初始化函数之外,需要执行下面三个重要函数:OSInit() -> OSTaskCreate() -> OSStart()(注意先后顺序)
任务管理
OSTaskCreate() |
创建一个新的任务 |
OSTaskSuspend() |
无条件挂起一个任务 |
信号量
OSSemCreate() |
创建一个信号量 |
OSSemPend() |
用于任务试图取得设备的使用权、任务需要和其他任务或中断同步、任务需要等待特定事件的发生的场合 |
OSSemPost() |
用于设置指定的信号量 |
时间管理
OSTimeDly() |
用于将一个任务延时若干个时钟节拍 |
OSTimeDlyHMSM() |
用于将一个任务延时若干时间 |
内存管理
OSMemCreate() |
创建并初始化一个用于动态分配的内存空间 |
OSMemGet() |
用于从内存区域分配一个内存块 |
OSMemPut() |
用于从内存区域释放一个内存块 |
OSMenQuery() |
用于得到内存区域的信息 |
消息队列
OSQCreate() |
用于创建一个消息队列 |
OSQpend() |
用于任务等待消息 |
OSQPostFront() |
用于向消息对列发送消息(插到消息对列的最前端) |
OSQPost() |
用于向消息对列发送消息 |
OSQFlush() |
用于清空消息对列 |
OSQQuery() |
用于获取消息队列的内容 |
QSQDel() |
用于删除消息队列 |
Vxworks
Vxworks操作系统具有良好的持续发展能力,在嵌入式实时操作系统领域十分重要,其应用范围如:卫星通讯、军事、航空航天等高精度技术以及强实时性领域,甚至登陆火星的探测器也使用了该操作系统
VxWorks是一种实时嵌入式商用操作系统,支持基于优先级抢占式调度的任务管理
QNX
QNX是分布式实时操作系统,符合POSIX基本标准和实时标准,使其应用能方便的移植
Linux
Linux内核由进程调度、内存管理、虚拟文件系统、网络接口和进程间的通信五个子系统组成
JTAG是片上调试技术的统称,是一种嵌入式测试技术,大多数ARM都支持,可实现在线编程
JTAG的典型信号
TMS:测试模式选择(Test Mode Select),通过TMS信号控制JTAG状态机的状态
TCK:JTAG的时钟信号
TDI:数据输入信号
TDO:数据输出信号
nTRST:JTAG的复位信号,复位JTAG的状态机和内部的宏单元
定义
计算机键盘中的键实际上就是一种开关,主要分为以下类型:机械式按键、电容式按键、薄膜式按键、霍尔效应按键
识别方式
为了识别键盘上的闭合键,通常采用行扫描法和行反转法
行扫描法:使键盘上某一行为低电平,而其余为高电平,然后读取列值,如果列值中有某位为低电平,那么行列交点的键被按下;否则扫描下一行,直到所有的行线扫描完毕
PF0~PF3为输入口、PF4~PF7为输出口
串行通信
串行通信就是数据一位一位进行传输而实现的通信,其中又包含了单工、半双工、全双工
单工:数据传输为单向操作,例如:终端1---->终端2
半双工:数据传输允许双向操作,但同一时刻只能进行一种操作,例如:终端1<---->终端2
全双工:数据传输分别采用两根独立的传输线进行发送信号和接收信号,例如:终端1<====>终端2
(UART使用全双工串行异步通信)
串行通信在信息格式的约定上分为两种:同步通信、异步通信
同步通信就是双方有一个共同的时钟,当发送时,接收方同时准备接收。
异步通信双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,结束时有停止位
同步通信与异步通信区别:
UART模块
UART模块中包括以下部件:波特率发生器、发送器、接收器和控制单元
UART0、UART1、UART2三个线路控制寄存器决定了传输帧格式
UART传送消息的格式是以起始位开始以停止位结束
UART传输数据时,一次传输的数据位可以是5,6,7,8位,由编程决定
RS232传输距离最远为15m
RS485传输距离最远为1200m
CAN
CAN即控制局域网,采用差分传输,利用CAN可构成多主多从系统,其数据由七个不同的域组成,分别为:帧起始、仲裁域、控制域、数据域、数据域、CRC校验域、应答域、帧结尾
USB
USB全称为通用串行总线
USB2.0的速度最高为480Mb/s
USB3.0的速度最高为5Gb/s,即640Mb/s
usb2.0和usb1.1采用半双工通信
Ⅰ2C
两线式串行总线,用于连接微处理器和外围设备(数据线SDA、时钟线SCL)
Ⅰ2C属于多主总线,即允许多个总线上的器件同时竞争主线,总线仲裁确定其控制权
SPI
串行外设(SPI)接口是一种同步串行外设接口,允许嵌入式处理器与各种外围设备以串行方式进行通信、数据交换。一般使用4跳线:SCK、MISO、MOSI和SSEL。将数据写到SPI发送缓冲区后,一个时钟信号SCK对应一位数据的发送(MISO)和另一位数据的接收(MOSI);在主机中数据从移位寄存器中自左向右发出送到从机(MOSI),同时从机中的数据自右向左发到主机(MISO),经过8个时钟周期完成1字节的发送
像素数据量 = 分辨率长*分辨率宽*色深/8/压缩比
内存容量1Mb = 1024Kb,外存容量1Mb = 1000Kb
调频广播使用短波和超短波进行通信,不属于微波通信
DDR2 SDRAM双倍数据速率同步DRAM)、DDR3 SDRAM和DDR4 SDRAM均采用双倍速率数据技术
采用差分信号传输方式,具有很强的抗共模干扰能力;USB、RS-485、CAN采用差分传输但RS-232不是
内核对任务的管理通过任务控制块OS_TCB进行,是一个数据结构。包括任务的优先级、任务的状态字、指向任务堆栈栈顶的指针等,当任务切换时,任务的工作现场被保存到任务的自用栈
Bootloader的实现依赖于CPU的体系结构,因此大多数Bootloader都分为两个阶段。依赖于CPU的体系结构的代码通常都放在阶段1中;阶段2通常用C语言来实现;其通常支持启动加载模式和下载模式;系统加电后,CPU执行的第一条指令就是Bootloader程序中的第一条指令,这条指令一般会存储在某种类型的固态存储设备上,比如ROM、EEPROM或者Flash ROM等
C语言编写的应用程序中可以没有main函数
使用异步串行通信每个信息都包含一个起始位和一个终止位
颜色数据格式为Y·U·V=8:4:4代表一个像素表示两个字节
设置波特率:(PCLK/波特率)+0.5-1
ADS 1.2是ARM公司推出的一套ARM汇编、C、C++的集成开发环境
它采用工程项目的形式来管理应用程序中涉及的源文件、库文件、头文件等
工程项目按照一定的逻辑关系来分组管理文件
工程项目中必须包含一个生成目标(Debug、Release或DebugRel)