一、概论
1.1 嵌入式系统的定义
以应用为中心,以计算机技术为基础,软硬件可裁剪。适应应用系统对功能、可靠性、成本、体积、重量、功耗严格要求的专用计算机系统。
简述:含有处理器的专用软硬件系统,具有自主的信息处理能力
1.2 嵌入式系统的体系结构
应用层
特点:
- 与应用密切相关
- 面向目标和客户
- 完成特定的功能
操作系统层
- 嵌入式操作系统(EOS)
- 文件子系统
- 图形子系统
- 网络子系统
- 其他模块
中间层
将系统软件和底层硬件相隔离
特点:
- 硬件相关性
- 操作系统相关性
硬件层
- 嵌入式处理器
- 存储器系统
- 中断控制器、DMAC、定时器/计数器
- UART、USB控制器、LCD控制器
- 其它I/O接口
FPGA和ASIC的区别:
- FPGA用于要求快速迭代的或小批量的产品,或作为ASIC的算法验证加速
- ASIC用于设计规模较大,复杂度较高的芯片,或成熟度高,产量较大的产品
1.3 嵌入式系统的特点
- 嵌入专用
嵌入在针对特定应用设计的系统中 - 综合性强
- 将计算机技术、半导体技术、电子技术与各行业的具体应用相结合后的产物
- 是一个技术密集、资金密集、知识高度分散、不断创新的知识集成系统
- 设计高效
嵌入式系统的软硬件都必须高效率的设计,避免冗余 - 程序固化
软件固化在硬件上,提高执行速度和可靠性 - 需要独立的开发系统
嵌入式系统本身不具备自举开发的能力, 必须有一套开发工具和环境才能进行开发 - 生命周期长
- 可靠性高、成本低、资源受限、功耗低
二、嵌入式系统的设计方法
2.1 传统设计方法
流程:
- 需求分析
- 规格说明、体系结构设计
- 硬件设计、软件设计,独立进行
- 系统集成、测试
特点:软硬件设计独立进行
优点:简单易行,分工明确
缺点:
- 排错困难
- 解决方案无法进行全系统优化设计
2.2 系统级设计方法
2.2.1 软硬件协同设计
步骤:
- 需求分析
- 软硬件协同设计
- 软硬件实现
- 软硬件协同测试
- 软硬件协同验证
特点:软硬件统一描述
优点:
- 软硬件统一描述
- 有利于优化设计
- 重点关注算法,而非实现
缺点:
- 不成熟,缺乏有效的统一描述工具
- 现有工具实现效率不高
2.2.2 设计重用技术
- 基于IP核的模块级重用
- 基于平台的系统级重用
2.3 嵌入式系统的设计过程
2.3.1 需求分析
作用:从用户处收集系统的非形式描述
分类:
- 功能性需求
- 非功能性需求
2.3.2 规格说明
- 对需求进行提炼,得到系统的规格说明
- 作为正式设计指导和验收的标准
- 起到用户和生产者之间合同的作用
2.3.3 体系结构设计
- 描述如何实现所需的功能和非功能需求。包括对硬件软件的功能划分,和系统的软硬件选型
- 说明需要什么样的构件
- 是设计成功与否的关键
* 2.3.4 软硬件构件设计
作用:对软硬件进行详细设计(并行的)
设计技术:
- 模块化设计
- 面向对象设计
- 组件设计
* 2.3.5 系统集成
- 把软件、硬件、执行装置、被控对象集成在一起。
- 进行调试
- 发现并改进单元设计过程中的错误
* 2.3.6 系统测试
- 看其是否满足规格说明书中给定的功能要求
- 是产品质量保证的坚实基础
三、ARM体系结构与指令集
3.1 ARM处理器的特点
- 体积小、低功耗、低成本、高性能
- 支持Thumb/ARM双指令集
- 大量使用寄存器,指令执行速度快
- 大多数的数据操作在寄存器中完成
- 寻址方式灵活,效率高
- 指令长度固定
小核处理器
A7、A53、A55
3.2 ARM体系结构的版本
- V1-V3:开发和实验阶段
- V4:第一个成熟版本
- V5-V8
3.3 体系架构分类
3.1.1 复杂指令集和精简指令集
- 复杂指令集架构(CISC):
- 采用庞大的指令集,可减少编程所需的代码量。
- 应用于桌面电脑和服务器
- 精简指令集架构(RISC):
- 包含了简单、基本的指令,通过这些可以组合为复杂的指令
- 用于嵌入式微处理器
3.2.2 普林斯顿结构和哈佛结构
- 普林斯顿结构也称冯诺依曼结构:将程序指令存储器和数据存储器合并在一起,程序指令和数据的宽度相同
- ARM7系列基于普林斯顿结构
- 哈佛结构:指令和数据分开存储,指令和数据可以有不同的宽度
- ARM9以后都基于哈佛结构
3.4 流水线技术
3.4.1 三级流水线技术
ARM7使用
- 取指:将指令从存储器中取出
- 译码:对指令进行解释,告诉CPU如何操作
- 执行
3.4.2 五级流水线技术
ARM9使用
把三级流水线中的执行单元进一步细化
- 取指
- 译码
- 执行
- 存储器访问
- 寄存器回写
3.5 ARM处理器模式
- 用户模式usr:正常的程序执行状态
- 系统模式sys:运行具有特权的操作系统任务
- 快速中断模式fiq::用于高速数据传输
- 外部中断模式irq:用于通用的中断处理
- 管理模式svc:操作系统使用的保护模式
- 数据访问终止模式abt:用于虚拟存储或存储保护
- 未定义指令终止模式und:当未定义的指令执行时进入
模式分类:
- 除用户模式外的6种称为特权模式
- 除用户模式和系统模式外的五种称为异常模式
3.6 ARM微处理器的工作状态
两种状态:
- ARM状态:执行32位的命令
- Thumb状态:执行16位指令
状态可以随时切换
3.7 寄存器
3.7.1 通用寄存器
包括R0 ~ R15,分类为:
- 未分组寄存器:0-7
- 分组寄存器:8-14
- R13的作用:作为堆栈指针SP
- R14的作用:
- 用于保存子程序返回地址
- 发生异常时,将R14对应的异常模式版本设置为异常返回地址
- 程序计数器PC(R15),指向正在取值的地址
3.7.2 程序状态寄存器
当前程序状态寄存器
R16是当前程序状态寄存器CPSR。
作用:
- 保存ALU中的当前操作信息
- 控制 允许/禁止 中断
- 设置处理器的运行模式
条件标志码-控制位
- 第5位T:反应处理器的运行状态
- 6、7位I、F:中断禁止位。I禁止IRQ中断,F禁止FIQ中断
3.8 ARM处理器的异常
3.8.1 异常的返回
复位异常处理程序不需要返回
异常处理完毕后:
- 将SPSR复制到CPSR中
- 将链接寄存器LR中的值减去相应的偏移量后送到PC中
3.8.2 异常向量
- 复位:0000
- IRQ(中断请求):0018
- FIQ(快速中断请求):001C
3.8.3 异常优先级
- 最高:复位
- 最低:未定义指令
- FIQ > IRQ
3.9 数据类型
- 字:长度为32位,4字节对齐,地址低两位为0
- 半字:长度为16位,2字节对齐,地址最低位为0
- 字节:长度为8位,任意地址对齐
3.10 指令条件码
- 相等:EQ
- 不相等:NE
- 有符号数:
- 大于或等于:GT
- 小于:LT
- 无符号数:
- 大于:HI
- 小于或等于:LS
3.11 寻址方式
立即寻址
操作数本身在指令中给出。
特征:立即数的表示以#为前缀
寄存器寻址
指令中给出寄存器的编号,寄存器中的内容作为操作数
寄存器间接寻址
将某个寄存器中的值作为地址
3.12 ARM指令集
3.12.1 加载/存储指令
LDR
内存 —> 寄存器
将地址为R1的存储器中的32位数据送到目的寄存器R0
LDR R0, =0x11223344
LDR R0, [R1]
LDRB
将地址R1中的8位的字节数据送到目的寄存器中
STR
寄存器 —> 内存
将R0中的一个32位数据传送到存储器R1中
STR R0, [R1]
STRB
传送低8位数据
3.12.2 指令
B
无条件跳转
BX
从ARM指令集跳转到Thumb指令集
BL
跳转前,会在寄存器R14中保存PC的当前内容
3.12.3 数据处理指令
MOV
将另一个寄存器中的值或一个立即数加载到目的寄存器中。
将R2中的内容左移两位后赋值给R1
MOV R1, R2, LSL #2
右移指令为LSR,用法同上
CMP
将两个寄存器中的值或立即数进行比较,会做一次减法,但不保存结果,只是更改标志位的值
四、存储系统
4.1 S5pv210
BL0固化代码完成的初始化功能
- 关闭看门狗
- 初始化icache
- 初始化堆栈
- 初始化块设备拷贝功能
- 设置系统时钟
- 拷贝BL1到IRAM
- 检查BL1的校验和
- 成功则跳转到BL1执行
- 失败则第二启动模式
校验
- 拷贝BL1到IRAM时,前16byte保存了校验和的值以及BL1的大小
- 拷贝过程中CPU计算当前bin文件中的校验和,与保存的校验和进行比较
启动过程
- 上电复位后将从IROM处执行已固化的启动代码(BL0内)
- 对启动设备进行判断,并从启动设备拷贝BL1到IRAM处
- 对BL1进行校验,校验成功转入BL1执行。
- BL1拷贝BL2到IRAM,并进行校验,通过后转入BL2
- BL2完成一些复杂的初始化。完成后将OS代码拷贝到DRAM中,并跳到DRAM中执行
4.2 Flash接口
4.2.1 概述
目的:替代EEPROM
优点:容量大、速度快、成本低、有保护机制
缺点:必须先擦出后写入;擦写速度较慢;必须以block方式写入
4.2.2 分类
- NAND Flash
- One NAND Flash
- NOR Flash
\ | NAND | OneNAND | NOR |
---|
五、系统总线
5.1 RS232C的引脚
- RXD:输入,接收数据
- TXD:输出,发送数据
- RTS:输出,请求发送
- CTS:输入,允许发送
- GND:信号地
5.2 最简情况下的双机互联
方法
- TXD和RXD分别交错相连
- GND直接相连
问题
通信不可靠,接收缓冲区容易溢出。
六、IO接口电路
6.1 volatile关键字
含义:阻止编译器优化。因为该变量可能会意想不到的改变,因此每次都必须重新读这个变量的值而不是使用cache里的备份
使用volatile变量的情况:
- IO接口电路的硬件寄存器
- 中断服务子程序中访问到的非自动变量
- 多任务中被几个任务共享的变量
6.2 通用IO接口:GPIO
6.2.1 GPIO编程
向寄存器写入内容,假设地址为 0xE0200240
(*(volatile unsign int*) 0xE0200240) = 0x11111111
eg:控制LED灯闪烁的流程:
- 找到控制LED灯的管脚
- 配置其为输出管脚(通过对CON寄存器整体赋值,将CON寄存器中对应的GPIO的4个bit设置为0001)
// 这里假设第3个GPIO对应控制LED灯的管脚
GPJ0CON = (1<<2); - 使该管脚输出相应的电平。GPJ0DAT有8bit,每个bit对应一个GPIO。使对应的bit位反复赋值为0和1,即可实现闪烁
6.2.2 两个常用寄存器
GPxxDAT
DAT有若干个bit,每个bit对应一个GPIO。若要让第n个GPIO输出高电平,则让这个bit为1
- 管脚配置为输出时,可以修改该寄存器来修改输出。
- 管脚配置为输入时,可读取该寄存器的值获取输入
GPxxCON
power down模式下的配置寄存器。
取值与状态的关系:
- 输入:0000
- 输出:0001
- 中断:1111
6.3 s5pv210的定时器
6.3.1 定时器的内部结构
s5pv10共有5个定时器。
- 定时器4是一个内部定时器,没有输出口线
- 定时器0具有死区发生器特征
计数特征:减1计数,减到0为止
6.3.2 定时器的基本操作
占空比
TCMPBn / TCNTBn
自动重装
当计时器计数到0后,定时器发出中断请求通知CPU定时器操作已经完成。在自动重装模式下,初值寄存器TCNTBn和TCMPBn的值会自动加载到当前寄存器TCNTn和TCMPn中
6.4 UART: 通用异步收发器
6.4.1 工作原理
协议规定:空闲位、停止位都是高电平;起始位是低电平。
数据发送过程:
- 发送起始位
- 先低位后高位发送数据位
- 最后发送停止位
6.4.2 操作步骤
- 设置所涉及引脚为URAT功能
- 设置波特率、传输格式
- 设置UART通道的工作模式
- 等待发送/接收数据的完成
附:部分题目整理
包括全局的中断禁止位的寄存器:CPSR
ARM7的异常中断中优先级最高的是:复位
能完成从ARM指令集跳转到Thumb指令集的指令是:BX指令
嵌入式系统不是必须要有OS
S3C44BOX的存储控制器对地址空间是如何划分的?每个地址空间多大?哪些地址空间可变用于SDRAM存储器?
包括8个地址空间,最大32M,Bank6和Bank7可用于SDRAM存储器
嵌入式处理器的类型:
- 嵌入式微处理器
- 微控制器(单片机)
适用于工业控制 - 数字信号处理器DSP
适用于做FFT(快速傅里叶变换)
异常向量表存放的是跳转指令,执行指令可以进入响应的中断服务子程序
嵌入式开发环境包括哪些组件
- 宿主机
- 目标机
- 嵌入式操作系统
- 运行于宿主机的编译器、链接器等软件环境
BootLoader的作用
在嵌入式系统复位启动时,操作系统内核运行前执行的程序。
作用:初始化硬件设备,建立内存和IO空间映射图,为加载操作系统内核调整好适当的环境