第一节
soc ------ 片上系统
计算机系统的硬件组成:
1, 输入设备: 键盘,鼠标,
2, 输出设备: 显示器, 打印机,
3, 存贮设备: 硬盘(保存文件,保存数据), 光盘, 内存(程序运行), u盘
4, 运算器: alu
5, 控制器: controller
6, 总线: apb(硬件接口总线), ahb (高速总线), dma(直接内存存取)
使用dma总线:
设置dma: dma 的源, dma 的目的, 源的地址变化,目的的地址变化, 一次最大多少字节
使用dma:
三级存贮系统:
硬盘---- ddr内存— cache 高速缓存
cache— 保存程序运行的时候的活跃部分 , cpu可以直接访问cache, cache 存取速度比ddr更快, 所以程序运行的会更快
usb 转串口: ch340(usb信号转串口信号的芯片) pl2303(usb信号转串口信号的芯片)
max232 芯片: ttl电平 转换为rs232电平
usb接口: vbus 电 gnd 地 d+、d- 一对差分信号线
norflash 和 nandflash
Nor flash nand flash:
容量小 容量大
稳定性好 稳定性稍差
可以执行程序 不能执行程序
寿命短 寿命长
价格高 价格低
存取速度慢 存取速度快
arm处理器:
arm7-- arm9 — arm10 — arm11 之后, arm处理器分支:
cortex-m: mcu ------- 进入单片机市场
cortex-r: real time — 实时性, 军工, 汽车电子,
cortex-a: application — 应用型产品,
编程模型:
ARM 采用的是32位架构.
ARM 约定:
Byte : 8 bits
Halfword : 16 bits (2 byte)
Word : 32 bits (4 byte)
Doubleword 64-bits(8byte)(Cortex-A处理器)
大部分ARM core 提供:
ARM 指令集(32-bit)
Thumb 指令集(16-bit )
arm处理器工作模式:
正常模式:
supervisor 模式: 管理模式 , 上电复位, reset 复位, wdt 复位, swi 软中断, 特权模式
user 模式: 用户模式, 一般情况下就工作在user模式
system模式: 和user模式使用的寄存器完全相同, 特权模式, 主要用在异常的处理函数里
中断模式:
irq 模式: 中断模式, 特权模式
fiq模式: 快中断模式, 特权模式
异常模式:
undef 模式: 未定义指令异常模式, 特权模式
abort模式: 存取异常模式, 特权模式
cotex-a 系列:
多了一个模式, monitor模式
cortex-a 寄存器组织:
共有40个寄存器, user/system模式下 使用的寄存器最少, 是17个
r13 ----------栈指针, 栈寄存器 , 不同的处理器模式下, 栈指针r13 都是独立的。
r14 --------- 链接寄存器 ,保存的是函数调用应该返回的地址, 不同的处理器模式下, r14 都是独立的。
r15 ------ pc, program counter, 程序计数器, 永远指向的下一条要抓取的指令 , 不同的处理器模式下, r15 都是唯一的
cpsr : current program status register 当前的程序状态寄存器 , 不同的处理器模式下, cpsr 都是唯一的
spsr: 保存的程序状态寄存器 , 不同的处理器模式下, spsr 都是独立的
arm 指令集特点:
所有ARM指令均为32-bits长
大部分为单周期指令
所有指令都可以条件执行
采用 Load/Store 架构
arm 7 指令流水线:
arm7 冯.诺依曼 架构, 三级流水线
fetch 抓取 decode 译码 exe 执行
pc 永远指向的是正在抓取的指令 pc-4 -------- decode pc-8------- execute
arm 9 :
哈佛架构, 五级流水线
增加了可用的存储器宽度
指令存储器接口
数据存储器接口
可以实现对指令和数据存储器的同时访问
三级流水线,五级流水线对比:
第2节
arm 指令集:
risc – 精简指令集计算机, arm
cisc— 复杂指令集计算机 , x86
add r0,r1 ----------- r0 + r1 —> r0
程序状态寄存器:
条件码:
arm 的每条指令都可以有条件的运行, 指令: 31*15 == 465
默认情况下, 比较指令可以改变cpsr 的n,z,c,v
每条指令后跟‘s’,都可以改变cpsr 的n,z,c,v
mov r1,r2,lsl #2 该条指令的编码格式如下:
cond ---- 条件码 1110
指令识别码 0001101
s 0
bit19–bit16 0000
rd 目的寄存器: 0001
imm5: 00010
bit6—bit4 000
rm 第二操作数寄存器 0010
该条指令的机器码: 1110 0001 1010 0000 0001 0001 0000 0010
e1 a0 11 02
学习指令:分支指令:
Branch : B{} label
Branch with Link : BL{} subroutine_label
数据处理指令:
算术指令: ADD ADC SUB SBC RSB RSC
逻辑指令: AND ORR EOR BIC
比较指令: CMP CMN TST TEQ
数据搬移: MOV MVN加法指令 ADD R1,R2,R3 R1=R2+R3
带进位加法 ADC R1,R2,R3 R1=R2+R3+C
减法指令 SUB R1,R2,R3 R1=R2-R3
逆向减法 RSB R1,R2,R3 R1=R3-R2
带借位减法 SBC R1,R2,R3 R1=R2-R3-!C
带借位逆减法 RSC R1,R2,R3 R1=R3-R2-!C
逻辑与指令 AND R0,R0,#0X0F
逻辑或指令 ORR R0,R0,#0X0F
逻辑异或 EOR R0,R0,#0X0F
位清除 BIC R0,R0,#9
比较指令 CMP R1,#10 cpsr = R1-10
反值比较指令 CMN R1,R2 cpsr =R1+R2
位测试指令 TST R1,#3 cpsr = R1 AND 3
相等测试 TEQ R1,R2 cpsr = R1 EOR R2
数据传输指令 MOV R1,R2 R1=R2
取反传送指令 MVN R1,R2 R1= ~R2指令格式:
语法:
<指令>{}{S} Rd, Rn, Operand2
每条指令都可以带条件cond 的运行, 后跟s 影响cpsr的n,z,c,v
Rd ---- 目的寄存器,
Rn ---- 第一操作寄存器
Operand2 ---- 第二操作数(可以数立即数, 可以数寄存器, 可以是移位的寄存器)比较指令没有目的寄存器的
数据传输指令mov 没有第一操作寄存器的,处理器里一般没有减法器, 减法都是通过加法器完成的,
逆向减法---- 主要就是第二操作数可以是立即数, 第一操作数永远是寄存器位清除指令:把第二操作数为1 的位, 将对应的第一操作寄存器相应的位清零
BIC R0,#9 // 0000 1001反值比较指令
cmp r1,r2 cpsr ==== r1-r2
CMN R1,R2 cpsr =R1+R2
位测试指令
TST R1,#3 cpsr = R1 AND 3
相等测试
TEQ R1,R2 cpsr = R1 EOR R2第3节
合法的立即数:
1, 有效位一定是小于或等于 8
2, 对有效位进行偶数个移位,可以表达该数字下面哪些立即数是数据处理指令中有效的数据?
a) 0x00AB0000 ok b) 0x0000FFFF ng c) 0xF000000F ok
d) 0x08000012 ng e) 0x00001f80 ok f) 0xFFFFFFFF ok数据池:
ldr r0,=0x1234 一定是”=”, 这是伪指令
对不合法的立即数, 采用的ldr 伪指令, 具体的数值实际存放在数据池 里, 依赖pc 和偏差地址, 去数据池抓取数据赋值给寄存器内存访问: 单寄存器传送 load/store
ldr — load reigister
str ---- store registerLDR STR 4个字节 Word
LDRB STRB 1个字节 Byte
LDRH STRH 2个字节 Halfword存储器系统必须支持所有访问宽度
语法:
LDR{}{} Rd,
STR{}{} Rd,
内存访问: 变址寻址
ldr r0,=str1ldr r1,[r0]
ldr r1,[r0,#4] x = *(p+1)
ldr r1,[r0],#4 x = *p++;
ldr r1,[r0,#4]! x = *(++p)块数据传送:
语法:
<LDM|STM>{}<addressing_mode> Rb{!}, <寄存器 list>
load多个寄存器
store 多个寄存器
cond — 条件码
addressing_mode ---- 基址指针的变化方式
addressing_mode : ia ----------先访问 , 地址再增加
ib ---------地址先增加, 再访问
da----------先访问 , 地址再减小
db----地址先减小, 再访问LDM / STM指令允许一次传送1到16个寄存器到/从存储器中。
寄存器传送顺序是固定的,不能被改变
最小数字的寄存器总是被对应到存储器的最低地址上。满降栈: full descending
压栈 : stmfd ------------- stmdb
出栈: ldmfd ------------- ldmiastmfd sp!,{寄存器列表}
ldmfd sp!,{寄存器列表}PSR 传送指令: 程序状态寄存器传送指令
MRS和MSR允许传送CPSR / SPSR中的内容到/从一个通用寄存器中。
语法:
MRS{} Rd, ; Rd =
MSR{} <psr[_fields]>,Rm ; <psr[_fields]> = Rm