首页 嵌入式学习笔记1
文章
取消

嵌入式学习笔记1

2022.7.27

ARM汇编指令与伪指令

基本概念

指令:是CPU机器指令的助记符,经过编译后可以得到一串10组成的机器码,由CPU读取执行。

伪指令:本质上不是指令,由编译环境提供,用来指导编译过程,不生成机器码。

两种不同风格的ARM指令

  • ARM官方汇编风格:指令一般用大写(Windows中IDE开发环境),如LDR R0, [R1]

  • GNU风格:指令一般用小写(Linux中常用),如ldr r0, [r1]

ARM汇编特点

  • LDR/STR架构

ARM采用RISC架构,CPU不能直接读取内存,要先将内存中的文件存储到寄存器中读取。

LDR:将内存内容加载入寄存器;STR:将寄存器内容存入存储空间。

  • 8种寻址方式
1
2
3
4
5
6
7
8
9
mov r1,r2              //寄存器寻址,r2运送到r1
mov r0,#0xFF00         //立即(数)寻址,#是数字的标识
mov r0,r1,lsl #3       //寄存器移位寻址,左移三位(每一次左移*2,等于*8)
ldr r1,[r2]            //寄存器间接寻址,[]表示内存地址,将r2的内存地址赋给r1
ldr r1,[r2,#4]         //基址变址寻址,将r2+4的内存地址赋给r1
ldmia r1!,{r2-r7,r12}  //多寄存器寻址,r1从起始地址,依次读八个数读出来放在后面的寄存器中
stmfd sp!,{r2-r7,lr}   //堆栈寻址,访问的是堆栈,连续访问x个字节放入后面的寄存器中
beq flag               //相对寻址,即跳转到flag运行
flag:                 //:表示标号
  • 指令后缀

指令后面常带后缀,变成不同的指令,指令族

  1. B(Byte):功能不变,操作长度变为8位

  2. H(Half word):功能不变,操作长度变为16位

  3. S(Signed):功能不变,操作数变为有符号

  4. S(S标识):影响CPSR标志位,如mov、movs

ldr–>ldrb,ldrh,ldrs,ldrsb,ldrsh

  • 条件执行后缀(特有特性)

条件后缀执行的注意点:

  1. 条件后缀是否成立,不取决于本句代码,而是取决于这句代码之前的代码运行后的结果。

  2. 条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句的运行。

条件执行后缀 条件执行后缀条件码表

  • 多级指令流水线

S5PV210使用13条流水线,允许多个操作同时处理。

取指(PC、PC)->解码(PC-4、PC-2)->执行(PC-8、PC-4)

PC指向正在取指的指令,而不是正在运行的指令。(括号内左侧为ARM模式地址,右侧为Thumb模式地址)

2022.7.26

ARM的编程模式和7种模式

32位ARM的CPU

约定:

  • Byte:8bits

  • Halfword:16bits(2byte)

  • Word:32bits(4byte)

提供:

  • ARM指令集(32-bit)

  • Thumb指令集(16-bit)

  • Thumb2指令集(16 & 32bit)

Jazelle Cores支持Java Bytecode

ARM的工作模式

  1. User:非特权,用户模式

  2. FIQ:特权,快速中断模式

  3. IRQ:特权,中断模式

  4. Supervisor(SVC):特权,复位模式

  5. Abort:特权,存取异常模式

  6. Undef:特权,未定义模式

  7. System:特权,系统模式

1个非特权模式+6个特权模式;1个普通模式+5个异常模式+1个系统模式

可以通过代码修改模式,或CPU自动切换

各个模式下的权限和可以访问的寄存器不同

ARM的37个寄存器

寄存器的种类

  • User模式: r0-r15、cpsr(程序状态寄存器)

  • Abort、FIQ、IRQ、SVC、Undef模式:r0-r15、cpsr、spsr(用来保存cpsr状态)

r13又称sp(栈指针),r14又称lr(返回),r15又称pc;system模式与user模式一致

ARM共有31个寄存器,但每个模式下最多能看到18个寄存器,其他名字虽然相同但是在当前模式不可见。影子寄存器:虽有多个r14(lr)寄存器,但当前模式只有一个。

  • User的影子寄存器:r13、r14

  • FIQ的影子寄存器:r8-r14、spsr

  • Abort、IRQ、SVC、Undef的影子寄存器:r13、r14、spsr

共37个寄存器,其中30个完全“通用”,1个固定用作PC,1个固定用作cpsr,5个固定用作spsr

CPSR中各个bit位含义

  • Mode位:处理器模式位

  • T bit位:1(Thumb)、0(ARM)

  • 中断禁止位:I(1:禁止IRQ)、F(1:禁止FIQ)

  • J位、Q位

  • 条件位:N(ALU负结果)、Z(ALU结果0)、C(进位标识位有进位)、V(进位标识位溢出)

PC(r15)寄存器的意义

PC为程序指针,pc指向哪里,cpu就会执行哪条指令

ARM的异常处理方式

异步:非同步,无法预料的操作,靠中断(一种特殊的异常)来实现

同步:同步时钟要完全同步

异常向量表

所有的CPU都有异常向量表,由硬件决定的。

异常发生时,CPU会自动动作。(pc指针跳转到向量处处理异常,时而伴有一些辅助动作)

异常向量表是硬件向软件提供的处理异常的支持。

ARM的异常处理机制

  1. 拷贝cpsr到spsr_

  2. 设置适当的cpsr位:改变处理器状态进入ARM态(重置T位为0),改变处理器模式进入相应模式(mode位),设置中断禁止位禁止相应中断(按需)

  3. 保存返回地址到r14(lr)

  4. 设置PC为响应的异常向量

返回时,从spsr_恢复cpsr,从LR_恢复PC

2022.7.25

S5PV210启动方式

使用iROM启动的好处

  • 降低BOM成本

  • 支持各种校验的nand

  • 可以在不使用编程器的情况下使用一种外部存储器进行编程烧录

优先从通道0启动,通道0启动失败后从通道2(SD卡)启动

BL0代码所做的事情

  1. 关闭看门狗

  2. 初始化指令cache、栈、堆

  3. 初始化块设备复制函数(device copy function)

  4. 设置SoC时钟系统

  5. 复制BL1到内部IRAM(16kb)并检查BL1的校验和

  6. 跳转到BL1并执行

S5PV210的所有启动

先1st启动(OMpin选择启动介质),在2nd启动(SD2),再Uart启动,再USB启动。

1:ON/VCC/内,0:OFF/GND/外

  • SD0的eMMC启动:101100

  • SD2启动:OMpin设置与SD0一样

  • USB调试优先:1xxxx1(OM0与OM1为1即可)

  • 区别仅在于OM5位置不同

2022.7.22

CPU和外部存储器的接口

内存:内部存储器,用来运行程序的。RAM(DRAM DDR)

内存的连接方式:利用地址总线&数据总线的总线式访问方式连接

外存:外部存储器,用来存储东西的。ROM(硬盘,光盘,Flash)

外存的连接方式:利用CPU的外存接口来连接

  • 常用外存

    • NorFlash:接到SROM Bank,可以总线式访问,一般用来启动。

    • NandFlash:分为SLC、MLC、TLC等,不能总线式访问,需CPU运行初始化软件后通过时序接口读写。

    • eMMC/iNand/moviNand:embeded MMC,iNand为SanDisk出产,moviNand为三星出产

    • oneNand:三星自有的一种标准。

    • SD卡/TF卡/MMC卡

    • eSSD:embeded SSD

    • SATA硬盘

总结

  1. 外部存储器基本用来存储文件,现代SoC基本上都支持多种外部存储器。

  2. 各种不同的外部存储器原理不同,性价比不同;外部存储器一般都是通过专门的接口来连接的。

启动过程详解

SRAM和DRAM的区别

  1. SRAM静态内存容量小、价格高,但是不需要软件初始化;

  2. DRAM动态内存容量大、价格低,但是需软件初始化后才可使用。

  3. 单片机中内存需求量小、开发简单,适合全部使用SRAM;PC机内存需求量大、软件复杂,不在乎DRAM的初始化开销。

  4. 嵌入式系统内存需求量大,并且没有NorFlash等可启动介质。

  • PC机一般为小容量BIOS(NorFlash)+大容量硬盘(NandFlash)+大容量DRAM;

  • 单片机一般为小容量NorFlash+小容量SRAM;

  • 嵌入式系统:因为NorFlash价格贵,所以一般用大容量Nand+大容量DRAM+SoC内置SRAM;

S5PV210的启动方式

内置了96k大小的SRAM(iRAM),同时还有一个内置的64k大小的NorFlash(iROM)

因为启动代码大小不确定,所以SRAM的96k不一定合适,所以要拆分第二次读取的代码

  1. CPU上电后从内部iROM中读取预置的代码(BL0)执行,做好了基本的初始化(CPU时钟、关看门狗等),此段代码由CPU厂商设置,仅能初始化SoC内部的东西;然后在判断选择的启动模式(通过硬件跳线更改),然后再读相应外部存储器的启动代码,将部分代码(BL1,16k)读取到内部的SRAM;

  2. 从iRAM读取刚刚的BL1启动代码,执行。BL1负责初始化NandFlash,然后将BL2读取到IRAM,运行。

  3. 从iRAM运行BL2,BL2初始化DRAM,然后将OS读取到DRAM中,启动OS系统,结束启动过程。

2022.7.21

统一编址和独立编址

IO:外部设备与CPU之间的通信,一般用来指CPU的各种内部或外部外设。

内存:程序的运行场所,基本单位为字节,CPU通过一定的地址来访问具体内存单元。

CPU的地址总线的位置由CPU设计时确定,CPU的寻址范围是一定的,内存是需要占用CPU的寻址空间的。

内存的访问方式:

内存和CPU的总线式连接方式为直接连接,优点是效率高访问快,缺点是资源有限、拓展性差。

  • IO的访问方式:

    • 一种是类似于访问内存的方式,把外设的寄存器当作一个内存地址来读写,即IO与内存统一编址方式(RISC);

    • 另一种是使用专用的CPU指令来访问某种特定外设,即IO与内存独立编址(CISC)。

统一编址方式:编程简单,但占用CPU地址空间;

独立编址方式:不占用CPU地址空间,但CPU设计变复杂。

程序运行时的两大核心元素:程序(只读)、数据(可读写)

程序存在的原因就是将原数据经过计算生成新的值

冯诺依曼结构和哈佛结构

冯诺依曼结构:程序和数据都放在内存中,彼此不分离。

哈佛结构:程序和数据在内存中分开存储。

优势对比:

冯诺依曼结构安全和稳定性较低,但软件处理简单。

哈佛结构安全和稳定性较高,但软件处理复杂。

寄存器

软件编程控制硬件的关键,属于CPU外设的硬件组成部分,留作外设被编程控制的“活动开关”。

寄存器时外设硬件的软件编程结构API,通过编程来控制寄存器,进而控制硬件。

编程操作寄存器类似于访问内存,其中的每个bit位都有他的意义,因此编程操作时需要位操作

单个寄存器的位宽一般与CPU的位宽一样,以实现最佳访问效率。

  • 寄存器的分类

    • 通用寄存器:是CPU的组成部分,功能未确定,但可读可写,可以自定义。

    • SFR 特殊功能寄存器:在CPU的外设中,每个bit位的意义已确定。

1
2
3
4
5
6
ldr r1, =0xE0200280
str r0, [r1]
mov r0, #0

int *p = (int *)0x30008000;    //C语言访问内存地址的方法
*p = 16;

编程访问寄存器的方法

  • ARM体系的要点

    • ARM是RISC架构,常用的汇编指令只有二三十条,低功耗,适合嵌入式领域。

    • ARM是统一编址的,大部分都是32位和64位的架构,32位的ARM CPU少于4G,SoC中的各种外部设备通过各自的SFR编程访问。

    • ARM是哈佛结构,保证了运行时的稳定性和安全性,但也同时导致了裸机程序(实地址)链接比较麻烦。

地址映射(内存映射)

S5PV210属于ARM Cortex-A8架构,32位,设计时有32根地址线和32根数据线。

32根地址线决定了CPU的地址空间为4G,内存的分配使用的问题就是地址映射问题。

ROM:Read-Only memory 只读存储器(不能直接通过地址总线写)

RAM:Random Access Memory 随机访存储器

IROM:Internal ROM 内部ROM,集成到SoC内部的ROM

IRAM:Internal RAM 内部RAM,集成到SoC内部的RAM

DRAM:Dynamic RAM 动态RAM

SRAM:Static RAM 静态RAM

SROM:Static ROM

ONENAND/NAND:NAND Flash

SFR:Special Function Register 特殊功能寄存器

2022.7.20

今天学习了三节课,可编程器件的编程原理、指令集对CPU的意义,RISC与CISC的区别。

可编程器件的编程原理

目前电子器件交给用户的选择权在不断放宽,可自定义化程度也越来越高,进而催生出了各种编程。 可编程器件的编程,基于CPU在固定频率的始终控制运行。 效率越高的语言可移植性越弱,反之亦然。

指令集对CPU的意义

指令集及CPU设计者在设计的时候对CPU的各种基础操作所预置的各种指令集合,基本上由CPU头部设计者制定(ARM,Intel等),本质上是一串字符编码。

汇编指令本质上就是机器指令的助记码。

RISC与CISC的区别

 RISCCISC
名称精简指令集复杂指令集
CPU设计复杂程度复杂简单
特性功耗低、灵活功耗高,性能高

未来趋势:往平衡性能与功耗方向努力,介于RISC与CISC之间的指令集架构新形式。

今日学习总结

今天的学习进度整体来说还是比较少的,只学习了一个小时左右,而且学习的也是基础部分的内容,基础知识的了解。

本文由作者按照 CC BY 4.0 进行授权

博客重构后的第一篇文章

嵌入式学习笔记2