嵌入式——ARM体系结构

嵌入式:以应用为中心,以计算机技术为基础,软硬件可剪裁的专用计算机系统。根据用户需求(功耗,体积,环境,稳定性,可靠性等等)

计算机系统:

1,软件系统:应用软件+系统软件

2,硬件系统

1)运算器

2)控制器(和运算器组成CPU)

3)存储器

4)输入设备

5)输出设备

注:五个基本组成中最基本的设备是运算器、控制器和存储器

SOC(片上系统):kearnal(内核),UART,GPIO,PWM,磁盘控制器...

以下为嵌入式核心架构示意图

kearnal架构:X86,ARM等等

CISC(complex instraction set computer):复杂指令集计算机(X86)

RISC(reduce instraction set computer):精简指令集计算机(ARM)

ARM

发展:ARM1---ARM11---Cotex-A(APP),Cotex-R(Real-time实时),Cotex-M(MCU)

指令集:ARM V1---V9

RAM读取数据

RAM是外部器件,那RAM如何从内核中读取、写入数据的操作呢?

内核连有数据总线、地址总线、控制总线,前两种总线数量和机器字长有关,所以有32根,最后一种若干,有时钟线等信号线。而内核就通过各种总线和RAM进行连接,一次可以读取4个字节(这也是为什么int型称为基本整型,因为其跟底层单次数据读取能力有关),数据总线传输普通数据,地址总线用来定位内存上特定的位置,然后RAM就可以读取该4个字节的数据

架构(内核以Cotex-A7为例)

Cotex-A7:32bit(4字长)

在其CPU中还含有ALU(算数逻辑单元,进行算术运算)、MMU等其他设备

寄存器

有的寄存器可以用指针直接访问(例如RAM),有的就不行(内部寄存器),因为内核通过地址总线进行访问时,有挂载在地址总线上的寄存器,才支持用指针确定要访问的位置,所以内部寄存器这些内核里的,需要用汇编语言进行操作,直接用其寄存器名称访问即可

ARM七个模式一共有37个32-bits寄存器,而Cortex体系结构下多了3个寄存器(r13_mon,r14_mon,spsr_mon)

内部寄存器

16个内核内部通用寄存器:R0,R1,......,R15,主要作用是缓存数据。一个寄存器内部也有32个bit位

R13(sp):stack pointer栈顶指针寄存器,用于记录栈顶生长的位置

R14(lr):linked register链接寄存器,用于保护现场,备份pc内部返回位置的值

R15(pc):program conter程序寄存器,用来指向当前程序即将预取的指令

外部寄存器

像是GPIO、UART这些之中不属于系统内核内部的寄存器,也会同RAM一样挂接在总线上

Cache(高速缓存)

位于内核内部,分为i Cache(instruction指令)和d Cache(data数据),以下图为例,把i和sum缓存在数据Cache中,而for这个指令缓存在指令Cache中,算法算完后,将数据回写会RAM中,否则反反复复从总线传过来,CPU访问和回写数据的时间会大幅增加

在裸机阶段,i要打开,d要关闭,这是因为在操作硬件时,要更改例如UART一类的寄存器,为了使其立刻发生,直达硬件,而非存入缓存,所以d要关闭

MMU

memory management unit,内存管理单元,位于内核内部,用于分配虚拟内存空间,实现虚拟地址到物理地址的映射

CPSR,SPSR

Current Program Status Register,保存当前程序状态寄存器

Saved Program Status Register,备份程序状态寄存器

错误:右下Mode位的User mode应该是10000

N:表示上一次ALU最近的一次算数逻辑运算是否是负数(符号位)

Z:ALU最近的一次运算是否为0

C:是否产生进位或者借位操作

V:ALU操作是否溢出

E位:默认小端存储

Mode位,占了5个bit位

内核处理模式

注:还有hyp调试模式

寄存器组

注:

深灰色块:表示该模式和 User 模式共享这些寄存器。

浅色块(浅蓝、浅紫等):表示该模式独有的私有寄存器。

底部的spsr:只有特权模式才有,User 模式没有spsr

异常处理

异常向量表,都是些跳转指令,可以跳转到异常处理程序中

偏移量:可以理解为位置的地址值0

ARM态:当前内核正在执行ARM指令集

三级流水线

pc寄存器将指令读到内核内部之后,经过预取,译码,执行三个阶段才可以执行,所以在进行译码时,预取会进一步执行下一行代码,以此类推,为了防止硬件空闲

相关推荐
17(无规则自律)5 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞18 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠1 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember2 天前
Linux网络基础
linux·网络·arm开发
代码游侠2 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟2 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows
wkm9562 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
unicrom_深圳市由你创科技2 天前
基于ARM+DSP+FPGA异构计算架构的高速ADC采集卡定制方案
arm开发·fpga开发
松涛和鸣2 天前
DAY69 Practical Guide to Linux Character Device Drivers
linux·服务器·arm开发·数据库·单片机·嵌入式硬件
松涛和鸣2 天前
69、Linux字符设备驱动实战
linux·服务器·网络·arm开发·数据库·驱动开发