《朱老师物联网大讲堂》学习笔记
学习地址:www.zhulaoshi.org
(1).
ASIC专用芯片 到 可编程器件,
CPU在固定频率下,读取/解析/执行指令,
二进制文件被CPU读取进去,CPU内部电路对二进制文件解码,
其中二进制指令集是在CPU设计的时候确定的,
(2).
指令集对CPU的意义,
汇编语言:机器指令助记符,
机器指令是CPU设计者制定的,CPU内部电路设计就是为了实现这些指令集的功能,机器指令就好像CPU的API接口一样,
不同CPU的机器指令集设计不同,
(3).
RISC和CISC的区别,
CISC:complex instruction set computer,提供各种指令,一般由300条左右,
RISC:ruduced instruction set computer, 仅提供最基本的指令,ARM CPU常用指令30条左右,
(4).
CPU的地址总线的位数是CPU设计时确定的,
CPU与内存的连接是直接连接,效率高,速度快,
与CPU连接的IO外设,
1.IO与内存统一编址,
2.独立编址,使用专用的CPU指令来访问某特定外设,
冯诺伊曼:PC,简单,安全和稳定是问题!
哈佛结构;ARM,复杂(需要统一规划链接地址等),安全稳定,程序一般放在ROM、flash中,数据一般放在RAM中,
(5).
寄存器属于CPU外设的硬件组成部分,是CPU的硬件设计者制定的,是编程控制的开关,是一种“API”,
通用寄存器:是CPU的组成部分,
特殊功能寄存器:SFR,存在于CPU的外设中,
访问寄存器的方法:
1.汇编方式,
ldr r1,=0xE0200280
str r0,[r1]
mov r0, #0
2.C语言方式,
int *p = (int *)0x30008000;
*p = 16;
(6).
服务器等高性能领域目前主导还是Intel,
ARM架构适合嵌入式,
哈佛结构也决定了ARM裸机程序(使用实地址即物理地址)的链接比较麻烦,必须使用复杂的链接脚本告知链接器如何组织程序;对于OS之上的应用(工作在虚拟地址之中)则不需考虑这么多
(7).
S5PV210属于ARM Cortex-A8架构,32位CPU,设计时有32根地址线和32根数据线,
地址分配,地址映射,见下图,
ROM,在嵌入式中,就是FLASH,相当于PC中的硬盘,
RAM,你就可以理解为内存,
最好记住IROM,IRAM,DRAM0,DRAM1的地址,
DRAM0: 0x2000_0000~0x3FFF_FFFF
DRAM1: 0x4000_0000~0x7FFF_FFFF
IROM: 0xD000_0000~0xD000_FFFF
IRAM: 0xD002_0000~0xD003_7FFF
(8).
外部存储器,用于存储数据,ROM举例,FLASH就有Nand,iNand,U盘,SSD,
内存通过地址总线直接相连,外存不是,外存是通过一些外存接口来连接的,比如SD卡接口,eMMC接口,其中涉及一些时序的处理,复杂!
要不是上节的地址映射图中,我们4G的NAND,岂不是要把4G的地址空间全部占用了,
NorFlash,可以总线访问,接到SROM bank,
NandFlash
eMMC/iNand/moviNand,e代表embeded,
oneNAND,三星公司的,
SD卡/TF卡/MMC卡
eSSD
SATA硬盘
以上外部存储器,除了最后的硬盘,都是FLASH,
我们的板子,支持4个通道,其中SD0内部连着inand,SD1没有外接出来,SD2我们插SD卡即可食用,SD3没用,
(9).
内存,
SRAM,上电直接用,
DRAM,需要初始化才能用,
外存,
NorFlash:一般用启动介质,
NandFlash:同硬盘一样,需要初始化,然后通过时序接口来读写,
PC:BIOS(NorFlash)+硬盘(类似NandFlash)+DRAM,
嵌入式:Nand+DRAM+内置SRAM
S5PV210中;Nand+DRAM+内置SRAM+内置iROM,
启动过程;
1.CPU读取并执行iROM中代码(BL0),做一些基本初始化,然后判断并进入某种启动方式,从其中读取启动代码(BL1)到内部SRAM,
2.从SRAM运行上步读取的启动代码,然后执行,BL1这一段代码会初始化Nand,然后将BL2读取到iRAM,然后运行,
3.在iRAM中运行BL2,初始化DRAM,然后将OS从Nand读取到DRAM,然后启动OS,
见图,
(10).
主要看iROM文档介绍,
BL0做了什么?
1.关看门狗,
2.初始化指令cache,
3.初始化栈,
4.初始化堆,
5.初始化块设备复制函数,有多个函数从而支持多种启动,
6.设置SOC时钟系统,
7.复制BL1到内部iRAM
8.检查BL1的校验和,
9.跳转到BL1去执行,
不同级别的休眠,图4,
不同启动,图5
(11).
OMpin选择,可以不看,
(12).
ARM约定,字节Byte永远是8bits,而Halfword在这里是2Byte,word是4Byte,与VC中的有所不同,因此一定要弄清楚,你是在哪个环境下编程,
Thumb2,你可以理解为Thumb & ARM,即16位&32位,
ARM的7种模式,
用户模式:user
异常模式,特权模式;FIQ,IRQ,Supervisor(SVC,复位或者软中断),Abort(存取异常),Undef,System,
特权模式:system,
记忆方法:user是非特权模式,其它都是特权模式,特权模式中system模式和其它几个(即异常模式)不同,
模式的切换和寄存器的不同,自动切换或者通过操作CPSR,
软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级要求,
(13).
ARM的37个寄存器,
图6,寄存器,影子寄存器(banked register),不同模式下,有名字看起来一样的寄存器,实际不是同一个,
图7,CPSR,
(14).
中断时异常的一种,
异常向量表,CPU设计时定好的,硬件决定的,为软件处理异常提供支持,
图8,
(15)~(16).
指令,
伪指令;指导编译过程,编译后不生成机器码,
ARM汇编风格;LDR R0,[R1]
GNU汇编风格:ldr r0,[r1]
LDR/STR架构,RISC架构CPU本身不直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器才能被CPU处理,
ldr(load register)指令将内存内容加载入通用寄存器,
str(store register)指令将寄存器内容存入内存空间中,
8种寻址方式;
寄存器寻址: mov r1,r2
立即寻址: mov r0,#0xFF00
寄存器移位寻址 mov r0,r1,lsl#3
寄存器间接寻址 ldr r1,[r2]
基址变址寻址 ldr r1,[r2,#4]
多寄存器寻址 ldmia r1!,{r2——r7,r12} //往r1中加载,r1可以理解为数组,
堆栈寻址 stmfd sp!,{r2-r7,lr}
相对寻址: beq flag //flag是一个标号,
指令后缀:
B(Byte),功能不变,操作长度变为8位,
H(half word),功能不变,操作长度变为16位,
S(signed),功能不变,操作数变为有符号数,
S(S标志,放心和上面没重复),功能不变,影响CRSR标志位,比如mov和movs,
moveq r1,r2
条件执行后缀:
1.条件执行后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果,
2.条件后缀决定了本句代码是否执行,不会影响上一句和下一句是否被执行,
流水线:3级(取指,解码,执行)流水线,PC与正在执行指令相差(3-1=2)个周期,
(17).
mov r1,r0 @在两个寄存器之间传递数据
mov r1,#0xff @将立即数赋值给寄存器
mov,mvn区别是按位取反,
eor 逻辑异或,
bit 位清除,
bic r0,r1,#0x1f@将r1中的数bit0到bit4清零后赋值给r0,
mrs(读),msr(写),cpsr访问指令,
mrs r0,cpsr
@...
@对r0中值进行处理
@...
msr cpsr,r0
b 直接跳转,
bl 跳转并保存返回地址到lr,
多字批量访问,
ldm/stm
立即数,前面加#,
合法立即数:经过移位后非0不超过8位,
swi,software interrupt,
(18).
mcr(写),mrc(读),读写协处理器,
协处理器和MMU,cache,TLB等处理有关,功能上和操作系统的虚拟地址映射,cache管理等有关,
用法张得好奇怪,
/*
* disable MMU stuff and caches
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
orr r0, r0, #0x00000800 @ set bit 12 (Z---) BTB
mcr p15, 0, r0, c1, c0, 0
(19).
ldr/str每周期只能访问4字节内存,
于是,出现
ldm(load register mutiple),
stm(store register mutiple),
又是好多后缀,烦躁~ia啊,ib啊,
空栈/满栈,
增栈/减栈,
ldmfd sp!,{r0-r6,pc}
ldmfd sp!,{r0-r6,pc}^
!作用,sp中的值在变化中是否保存,
^作用,在目标寄存器中有pc时,会同时将spsr写入cpsr,一般用于从异常模式返回,
我们常用就stmia和stmfd,
(20).
@这里是注释,下面是标号,
flag:b flag
或者
b .
.代表当前地址,
#0x1f @这是个立即数
.globl _start @添加外部链接属性,
.word @可以当作unsigned int
.align 4 @2^4=16字节对齐,
.end @标识文件结束
.include @头文件包含
ldr 大范围地址加载指令
adr 小范围地址加载指令
adrl 中等范围地址加载指令
nop 空指令