2018年3月16日,3月24日即要考试!一周的紧促复习时间,是时候来个总结了!加油!!!
嵌入式系统
嵌入式系统上的软件具有结构精简,代码轻量化,占用存储资源少的特点。
嵌入式系统和计算机操作系统的共同特征是:引导加载程序、外设驱动程序、操作系统、文件系统、网络协议栈、图形用户界面、数据库。
嵌入式系统应用开发工具的主要目的:提高开发质量,缩短开发周期,降低开发成本。
按照软硬件技术的复杂程度进行分类,可以把嵌入式系统分为:高端系统、终端系统和低端系统三大类。
仿真平台指嵌入式系统开发中使用的虚拟机管理软件、仿真软件或者指令集模式器
对应内存容量而言1KB = 1024B,对应外存(磁盘、U盘)等容量而言,1KB=1000B
OS装载方式:串口、以太网和USB装载。
嵌入式应用程序经过交叉工具链生成映像文件后,需要下载到目标机进行调试。
调试完毕后映像文件必须有专用工具烧写到ROM中去,这种烧写工具俗称编程器!
文本根据排版格式可分为:纯文本和丰富文本。windows环境下,txt就是纯文本
。相对于线性文本,超文本按着网状结构组织信息。WWW网页
是最为常见超文本。
当前速度最快的CPU已经超过10GHz。
嵌套向量中断控制器缩写为NVIC
GCC是GNU套件的编译链接器,能编译C语言,汇编语言。
GDB调试下,file命令
是装入需要调试的可执行文件,run命令
执行当前被调试的程序。
源文件到可执行文件的步骤:预处理->编译->汇编->连接。
前向通道和后向通道
AX88796芯片内部寄存器的地址范围:0x10000000 ~ 0x100003FF
嵌入式系统硬件的逻辑组成
嵌入式系统的特点
嵌入式系统的CPU特点
CPU
嵌入式开发流程
0x1000 0000
嵌入式开发特点
嵌入式系统开发调试工具
GPIO
UART
UART由发生器、接收器、控制单元以及波特率发生器等组成。
可实现全双工
通信!
RAM芯片中的UART收发信息时,可以采用FIFO,也可以采用普通模式
一般接收和发送缓冲区的FIFO字节数一样的,长度可编程选择4B、8B、16B、64B。
UART传送消息的格式是以起始位开始以停止位结束
UART传送信息时,一次可传输的数据位可以是5,6,7,8位,由编程决定
基于UART可组成RS-232接口
RS232 - 最远15m
RS485 - 最远1.2k
RAM实现485总线的功能,需要采用S3C2410
芯片内部的UART部件外加转换芯片等来实现。在软件设计时,初始化波特率9600bps,数据格式格式为:8位数据位,无数据检验位,1位停止位
。那么1s时间内最多传输960
个字节。(注意计算还得加上起始位和停止位)
CAN
键盘
8个GPIO脚最多构成64个按键的键盘
矩阵键盘通常有行扫描法和反转法读取按键的特征值(还有一种方法叫做中断方式
)
嵌入式处理器内核的分类
SOC片上系统
集成电路
嵌入式最小系统组成
嵌入式系统一般包括嵌入式处理器
、时钟电路
、电源电路
、复位电路
、存储器
和调试测试接口
。
JTAG调试技术
JTAG标准中规定的TAP接口具有5根
信号线
构建一个宿主机 - 目标机的开发环境,若目标机是裸机,那么为了调试和下载软件需要将调试仿真器连接到目标机的JTAG
接口!
JATG是一种嵌入式测试技术,大多数嵌入式CPU、DSP、FPGA器件都支持JTAG
JTAG允许多个芯片的边界扫描寄存器BSR通过JTAG接口串联在一起,实现对多个器件的测试
通过JTAG可以实现在线编程功能
主频时钟
41250
板级升级包(BSP)
引导加载程序、初始化程序、设备驱动程序、配置文件
含有电路板的初始化程序
所有与特定电路板上硬件相关的功能都集成在板级支持包的库里
操作系统的上层代码通过板级支持包访问底层硬件
ARM
RAM异常
ADS
RVDS
工程管理器
、编译连接器
、调试器
和指令集仿真器
。调试器支持硬件在线调试和软件仿真调试。电源管理模块
正常模式下,电源管理模式为内核及RAM芯片内部所有硬件组成提供时钟源,用户可以通过软件控制暂时不用的内置硬件组件处于关闭状态降低功耗。
硬件抽象层HAL
AMBA总线
AMBA1.0
到目前的AMBA4.0
共四个版本!MMU
TLB
,查不到再到内存中查整个页表
。ARM7 ≠ ARMv7
RAM7 - 冯诺依曼的结构。 RAM9~RAM11 采用哈佛结构!
ARMv7是一种构架。ARM7是一种处理器型号,ARM7(冯诺依曼结构)是在ARMv4构架上设计出来的处理器。**RAM11(ARMv6架构)之后便是以Cortex(ARMv7架构)**来命名了!
ARM7没有MMU(内存管理单元),只能叫做MCU(微控制器),不能运行诸如Linux、WinCE(大型嵌入式操作系统)等这些现代的多用户多进程操作系统,因为运行这些系统需要MMU,才能给每个用户进程分配进程自己独立的地址空间。ucOS、ucLinux这些精简实时的RTOS不需要MMU,当然可以在ARM7上运行。
ARM9、ARM11,是嵌入式CPU(处理器),带有MMU,可以运行诸如Linux等多用户多进程的操作系统,应用场合也不同于ARM7。
此外,Cortex-M系列还细分为M0、M3、M4和超低功耗的M0+,用户依据成本、性能、功耗等因素来选择芯片。
Cortex-M系列(ARMv7架构)的指令集只有Thumb-2。
ARM处理器 ≠ ARM处理器核
RAM常考寄存器
SP寄存器
CPSR寄存器
状态位T
的作用是在RAM状态与Thumb状态间进行切换,当T = 1
时处理器处于的状态是Thumb状态。N
为符号标志位 - N=1
表示运算结果为负,否则运算结果为正F
为禁止快读中断为 - F=1
表示禁止快速中断控制位,否则允许!V
为溢出标志位,等于1
表示溢出Z
为全0标志,运算结果为0
SPSR寄存器
控制寄存器和数据寄存器
rGPECON = 0x00005555
关于赋值,也写一个小例子
rGPDCON = ((rGPDCON | 0x00005555) & 0xFFFF5555);//GPD0~GPD7配置为输出模式
先置位,然后再清零。
ARM微处理器的七种运行模式
经典RAM的七种异常
IRQ
0x00000018
4
个字节复位异常
的异常向量地址是0x00000000
。系统上电复位后,将从该地址处执行程序,RAM9的体系结构规定的各异常向量地址间隔通常是4个字节,以此复位异常向量地址处通常存储一条分支指令
S3C2410必备知识
矩阵按键代码
#define KEYOUTPUT (*(VOLATILE int8u *)0X56000044)
#define KEYINPUT (*(VOLATILE int8u *)0X56000044)
INT16U ScanKey()
{
INT16U key = 0xFFFF;
INT16U i;
INT8U temp=0xFF, output;
rGPECON = ((rGPECON & 0xFFFFFF00) | 0x00000055); //初始化GPE0~GPE3为输出
rGPECON = rGPECON & 0xFFFFFF0F; //初始化GPE4~GPE7为输入
//判断键盘中是否有键按下
for(i=1; ((i<=8) && (i>0)); i<<=1)
{
output |= 0xFF;
output &= (~i);
KEYOUTPUT = output;
temp = KEYINPUT;
if((temp & 0xF0) != 0xF0)//判断列信号是否全部为1
{
key = (~i);
key <<= 8;
key |= ((temp & 0xF0)|0x0F);
return key;
}
}
return 0xFFFF;
}
//key返回判断哪个按键的方法:最高4位和最低四位都是1,
//即 1111 ---- ---- 1111,然后次高字节是行,再次高是列,
//比如第2行第3个按键按下, 对应为 1111 1101 1011 1111 - 0xFDBF
网络
IP
A类
B类
C类
以太网数据帧(里面不包括IP地址)
路由器
无线接入点
,它实际上是一个无线交换机或无线路由器。局域网
指令集
ARM处理器的三种工作状态
Thumb状态和ARM状态的切换
RAM复位后的状态
BootLoader
U-BOOT
作用
操作系统
内核的概念
内核提供任务调度、任务间通信与同步、任务管理、时间管理和存储管理。
典型的单片机程序在程序指针复位后,首先进行堆栈、中断、中断向量、定时器、串行口等接口设置、初始化数据存储区和显示内容,然后就来到了一个监测、等待或空循环,在这个循环中,CPU可以监视外设、响应中断或用户输入。 这段主程序可以看作是一个内核,内核负责系统的初始化和开放、调度其它任务,相当于C语言中的主函数。
现代操作系统设计中,为减少系统本身的开销,往往将一些与硬件紧密相关的(如中断处理程序、设备驱动程序等)、基本的、公共的、运行频率较高的模块(如时钟管理、进程调度等)以及关键性数据结构独立开来,使之常驻内存,并对他们进行保护。通常把这一部分称之为操作系统的内核。
Linux
Linux和Unix
Linux命令
arm - linux - gcc
交叉编译器来编译应用程序g参数
对它进行编译
Linux内核主要由5个子系统组成
进程调度模块负责控制进程对CPU资源的使用,所采取的调度策略是使得各个进程能够平均访问CPU,同时保证内核能及时地执行硬件操作。
内存管理模块的功能之一是屏蔽各种硬件接口内存结构的差异并向上返回一个统一的访问接口
网络接口模块包含网络接口驱动程序
支持进程之间的各种通信机制,其通信机制包括:信号、管道、消息队列、信号量、共享内存、套接字(socket)
微内核和宏内核
微内核特征
属于微内核的典型嵌入式操作系统有:Symbian、VxWorks、QNX、uC/OS - II、IOS,而Symbian是普通实时操作系统
VxWorks收取授权费和版权费。
VxWokrs用于尖端科技中
宏内核
Android OS是典型的宏内核操作系统
宏内核又称为单内核!
Tiny OS
QNX
uC/OS-II
抢占式实时操作系统
抢占式实时操作系统且每个任务都有自用栈
使用它的栈空间校验函数,可以确定每个任务到底需要多少栈空间
该系统不包含设备驱动程序,只是一个纯内核
不支持时间片轮转调度,所以赋给每个任务的优先级是不相同的
允许每个任务之间有不同的栈空间
升级版的UC/OS - III是商用操作系统
II 具有良好的可剪裁性和可移植性
能够支持的任务数最多是64(保留8个给系统,实际剩下56个)
最多允许的中断嵌套层数可以达到255层
软件结构一般具有:应用软件层,API层,内核层和设备驱动层
该系统能提供周期性时钟信号(时钟节拍),用于实现任务的正确延时和超时确认,节拍率在10~100Hz之间
用户必须在多任务调度启动以后再使能时钟节拍中断
在中断返回之前,必须调用退出中断函数 voidIntExit(void)
互斥信号量可以解决优先级反转的问题
事件控制块用以对信号的管理
任务管理中空闲任务是系统创建的第一个任务(空闲任务永远不会处于挂起态,还可能运行态,即使优先级最低,一旦其他任务都被堵塞他就可以执行了!)
中断服务子程序的伪码结构:保存全部CPU寄存器到栈,调用OSIntEnter()或者OSIntNesting变量加1,执行中断服务代码或发出IPC信息通知特定任务去执行中断服务,调用OSIntExit()函数,恢复所有CPU寄存器,执行中断返回指令。
uC/OS-II 移植到一个 嵌入式系统电路板上正常运行,必须具备的条件
uC/OS-II 保护任务之间的共享数据和提供任务之间的通信,可达到保护目的方法通常有
OS_ENTER_CRITICAL()
和OS_EXIT_CRITCAL
来打开和关闭中断。OSSchedLock()
和OSSchedUnlock()
对任务调度函数上锁和开锁。系统启动过程中,Bootloader
执行完毕后,调用应用程序主文件(通常是main.c)里的main函数。main函数在执行过程中除了用户函数和硬件初始化函数之外,需要执行下面三个重要函数:OSInit() -> OSTaskCreate() -> OSStart()
(注意先后顺序)
OSInit()
函数先建立最初的任务就绪表,然后建立4个空白的数据链表
,即:任务控制块链表,事件控制块链表、标志链表、内存控制块链表。
系统中任务的五种状态
一些系统函数
OSTaskCreate()
- 任务创建相关OSCtxSw()
- 真正实现任务切换的函数OSIntExit()
- 中断级的调度OSTickISR()
- 时钟节拍中断服务子程序,与时间管理相关OSSched()
- 任务前导函数,任务级的调度函数
OSIntExit()
- 中断级的调度函数OSSemCreate()
(信号量创建)OSMutexCreate()
(创建互斥体)OSMboxCreate()
(建立一个邮箱)OSQCreate()
(创建事件控制块)OSRdyTbl[ ]
是就绪表的位图映像矩阵,每一位代表了一个优先级任务的就绪状态,成为就绪位,该矩阵最多有64位。一些系统文件
OS_CPU_C.C
- 创建任务的自用栈空间、定义用户接口的hook原型OS_CORE.C
- 核心调度代码,包括系统初始化、启动多任务调度开始运行、任务创建管理与调度、TCB初始化、就绪表初始化、ECB初始化、任务事件就绪表、空闲任务OS_MEM.C
- 内存管理,包括创建分区,获得存储块OS_TASK.C
- 任务管理,包括改变一个任务的优先级、创建或者删除一个任务,恢复一个被挂起的任务uC/OS系统时钟内核的基本功能(通过GLIBC
调用通用函数和内核的内部功能)
实时操作系统与非实时操作系统
实时系统
非实时
实时操作系统
中断服务子函数
的时间非常快!精细衡量这个时间一致性变化的术语是抖动!RTOS特征(主要特征是能够及时响应外部发生的随机任务请求并且能够在规定的时限内完成任务。)(不包括轮转调度)
RTOS的实时性能主要由三个指标衡量
响应时间(包括中断延迟时间和任务切换时间)(任务切换时间又包括人物抢占时间)
吞吐量
生存时间
响应时间有两个指标 - 中断延迟时间和任务切换时间
实时系统对时间约束要求的严格性,使可预测性成为实时系统的一项重要性能要求,它是指RTOS能够对外部事件的响应时间和实时任务的执行时间进行判断,以确定被时间触发的实时任务能否在规定的时间内完成。
一般按照相应时间能将实时系统分为三类:强实时系统,其相应时间一般在ms级或us级;普通实时操作系统一般在s级,弱实时系统一般在数十s级。
任务时限有两种
截止时间:任务开始执行时间到任务必须完成的时间间隔。
任务执行预设:又叫任务最快完成时间,这是在无中断响应情况下的任务最快执行时间。
硬实时操作系统和软实时操作系统
存储器
分类
RAM
FLASH
DDR
USB
USB2.0 的速度可达到 480Mb/s
USB3.0的速度可达到 5Gb/s, 即640MB/s
半双工差分方式通信
编码
ASCII
汉字编码
Unicode
Linux
常用。JAVA
.NET
常用。同步IO和异步IO
CPU的速度远远快于磁盘、网络等IO。在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件、发送网络数据时,就需要等待IO操作完成,才能继续进行下一步操作。这种情况称为同步IO。
在IO操作的过程中,当前线程被挂起,而其他需要CPU执行的代码就无法被当前线程执行了。因为一个IO操作就阻塞了当前线程,导致其他代码无法执行,所以我们必须使用多线程或者多进程来并发执行代码,为多个用户服务。每个用户都会分配一个线程,如果遇到IO导致线程被挂起,其他用户的线程不受影响。
多线程和多进程的模型虽然解决了并发问题,但是系统不能无上限地增加线程。由于系统切换线程的开销也很大,所以,一旦线程数量过多,CPU的时间就花在线程切换上了,真正运行代码的时间就少了,结果导致性能严重下降。
另一种解决IO问题的方法是异步IO。当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了。一段时间后,当IO返回结果时,再通知CPU进行处理。
指令相关
MOV PC, LR
。还可以MOV R15, LR
BL My
子程序返回调用程序的指令为:MOV PC, LR
。CPSID I
。开外部中断的指令为:CPSIE I
。EQ
表示相等,NE
表示不等B
BL
BX
CMP、ADD、SUB
等BX
来实现。[ ]
括起来Test EQU 50
定义 标号 Test
的值为50
!CPSR
中的状态,条件如果是相等,要求指令执行R1+R2
,结果放入R3中,则这条指令ADDCEQ R3, R1, R2
。如果条件是大于,要求执行R1 - R2
,结果放入R3,则该指令是SUBHIS R3, R1, R2
指令的条件码总结
EQ
- 相等NE
- 不等MI
- minus
负数PL
- plus
正数或0vs
- overflow set
溢出vc
- overflow clear
未溢出GT
- greater than
带符号数大于GE
- greater and equal
带符号数大于或等于LT
- lower than
带符号数小于LE
- lower equal
带符号数小于或等于HI
- high
无符号数大于CS
- carry same
无符号数大于或等于CC
- carry clear
无符号数小于LS
- low and same
无符号数小于或等于常考指令
LDR 字数据加载指令(存储器到寄存器的数据传送指令)
LDRB 字节数据加载指令
LDRH 半字数据加载指令
STR 字数据存储指令
STRB 字节数据存储指令
STRH 半字数据存储指令
STR R0, [R1]
- 将R0中一个字的数据,存入以R1的值为地址的存储器中。LDR R0, [R1]
- 以R1的值为地址的存储器中的字数据(为32位)读入寄存器R0LDRH R0, [R1]
-以R1的值为地址的存储器中的半字数据(为16位)读入寄存器R0LDRB R0, [R1]
-以R1的值为地址的存储器的字节数据(为8位)读入寄存器R0LDR R1, #0x12345678
LDR是加载存储指令,表示存储器到寄存器的数据传送,而#是立即数符号,表示立即数寻址**。所以这样写是不正确的!**ADC R1, R2, R3
表示 R1 = R2+R3+C
(C表示进位)(ADD表示加法)(ADC表示)
置1清0的操作
or
可实现置1,and
可实现清0。比如ORR R0,R0,#00000003
该指令设置R0的0、1位,其余位保持不变。再比如AND R0,R0,#FFFFFFFE
实现R0的最低位清零。还有一个是用ARM的指令进行位清0,BIC R1, R1 #0X00000088
立即数
ADD AL,06H
中的06H
即为立即数。大小端存储
计算机存储结构
音频图像
音频
码率 = 取样频率×量化位数×声道数
,压缩后的码率和压缩前的码率也就差一个压缩比。图像
屏幕
触摸屏
LCD显示屏
其他