ARM体系架构

1. 计算机组成

交叉开发:  程序的编写 编译 在 PC机上(宿主机)  但 运行在 开发板(目标机)

嵌入式开的的特点:

开发环境的不同:  交叉开发环境 

以应用为中心, 围绕实际功能设计 软件和硬件   量体裁衣

1.1 计算机的基本组成部分: 

输入设备 

输出设备

存储器 

运算器

控制器

总线 

计算机  X64(64位)  x86(32位) stm32   8位(C51,STM8)  16位

1.2 控制器

CPU: 中央处理器  一般不能独立运行程序 只有寄存器 运算器 控制器 总线 

MCU: 微控制器    可以独立运行程序  即 有CPU + RAM + ROM 构成 

FPU: 硬件浮点运算单元   专门用于 进行浮点运算  

GPU: 多个FPU + 多控制器构成   核心多  128 256 

APU: (AI核心)  硬件神经网络  

1.2.1 CPU中:

运算器: ALU 做运算 + - ... 

控制器: 统筹整个系统的 工作, 仲裁  

cpu运行程序逻辑: 

CPU在时钟系统的 驱动下, 不断从ARM中 取出预先编译好的 程序指令  然后 执行

机器指令: 有汇编或其他高级语言编译 得到的 二进制指令 CPU只能识别这个 

总线: 专门用于 CPU与各个设备间通信  

单总线: 

多总线: 

1.3 存储器:

用于存储程序运行过程中的一些数据  缓存

金字塔结构   按照速度排序 

寄存器 : 速度最快  成本最高的 存储器  通常以"个"计  在CPU中 相当于CPU的"手"

高速缓存: cache    速度 等同与CPU    成本高  通常以 KB或M计 

内存(RAM):  内存条  运行内存     程序需要RAM(代码,数据段)  成本一般   G 

外存(ROM):  硬盘  U盘  光盘      网盘 

硬盘:   成本低     T  

机械硬盘: 转速  5400  7200    硬盘接口:  STAT(600m)  M.2(固态)  SCACS 

固态硬盘: 使用FLASH 存储   读写有限次数   写操作要 复杂与写操作 

  通常 写入数据前  需要擦除  且 是按块擦除的 

  访问 读 通常也按块读取 

负载均衡:     

2. ARM知识点

2.1 ARM公司: 

提出ARM架构  使用精简处理器指令集 

整体上, ARM架构芯片 功耗低,成本低 

嵌入式应用中,大部分CPU使用ARM架构 

ARM架构: ARM公司开发的 一种CPU处理器结构 

ARM CPU 架构发展和性能变化

ARM7

ARM9

...

cortex系列:

Cortex-A :   高性能型  多用于 多媒体 图形图像 UI 

Cortex-R :   实时性能强  多用于汽车 运动控制等 

Cortex-M :   低功耗或 低成本  场景  多作为单片机使用 

stm32 - Cortex-M3 

2.2 ARM生态链: 

ARM公司: 做CPU架构设计 ARM  出解决方案的 

芯片公司:  三星,华为,...   设计制造芯片  

开发板设计公司: 做开发板  以及基本驱动程序  

产品开发公司:   大量中小型嵌入式企业  

使用开发板或自己设计硬件开发板  做  应用

软件层面:

Linux系统: 开源免费  GPL协议 

智能手机: 嵌入式崛起  安卓系统 

2.3 ARM环境搭建: 

使用KEIL 调试功能,模拟ARMCPU运行情况 

1. 安装交叉编译工具  即编译器 

该编译器在 Windows下运行 但编译的程序在ARM架构下运行 

2.4 armCPU寄存器:

 是cpu留给程序的接口  类似于人的双手 

2.4.1 CPU中 主要的寄存器

R0—R12  13个通用寄存器    没有专用的特定功能 

R13  sp  栈指针寄存器         专用于存储程序栈指针  

R14  lr    链接寄存器         用于程序跳转返回的实现 

R15  pc  程序计数器         用于存储下一条将要执行的指令的地址(取址的指令的地址) ,修改该寄存器中的值 ,实现程序跳转  

CPSR: 程序状态寄存器        用于存储程序状态(ZNCV位 ...)

nzcv为: 符号位 存储计算过程中的一些特定情况 

模式位: [4:0] 存储CPU的模式  修改模式位 可以主动让CPU进入指定模式

SPSR: 程序状态备份寄存器 

3. CPU的状态和模式

3.1 CPU状态:

ARM状态:   在该状态下  运行ARM指令   4字节对齐   运行速度快  指令更耗费空间 

thumb状态: 在该状态下  运行thumb指令 2字节对齐      指令密度更高  运行效率会有所降低

3.2 CPU模式:   

目的

1 为了安全 

 2 为了处理异常 

3.2.1     7中模式

ARMCPU 提供了 7种模式  每一种模式 都有 R0-R15 CPSR  SPSR(usr,sys模式没有)

usr              sys      abort      svc       irq       fiq          undef 

用户模式    系统      终止      管理员    中断      快速中断    未定义

模式位       10000        11111      10111        10011      10010   10001         11011  

寄存器个数  17个         0        3              3           3          8        3    sys因为和usr公用所以没有独立的寄存器,后面从abort开始写的寄存器个数是每个模式下独有的寄存器个数

ARMcpu 一共有 37 个寄存器    有7中模式 通常 

3.2.2 模式的细分

非特权模式 : usr 

特权模式(可以主动修改cpsr): ( 除usr模式外  sys    abort     svc      irq      fiq       undef 

非异常模式:  sys  

异常模式 :   (除sys和usr外)   指在CPU发生异常情况时 会主动进入的模式  

3.2.3 ARM寄存器组织

这里注意sys和usr两种模式公用一套寄存器且没有SPSR(因为他俩都成为正常模式(因为usr为非特权模式和sys为非异常模式),只有不正常才需要SPSR)

注意每种模式的栈区不是在一起的

4. 什么叫异常?  

CPU中的异常是指,CPU遇到的一些特定情况   将这些特定情况 统称为异常 

4.1 ARMCPU有哪些异常? 

复位异常:  复位键被点击了 产生了复位信号     CPU将 自动进入svc模式 

未定义指令异常:  CPU从内存中得到了一条不识别的指令    undef  用于扩展指令 

软中断异常 :    触发了软中断    svc    用于实现系统调用

指令预取异常:    CPU从内存中取一条指令失败了                   abort  用于虚拟内存的刷新 

数据异常 :       a/0 (比如除数为零) abort  处理非法运算

中断异常 :       触发了中断   irq   处理中断事件

快速中断异常     触发了快速中断   fiq   处理快速中断事件

4.2 异常处理流程: 

硬件处理和软件处理

4.2.1 硬件处理: 

由CPU在触发异常时 自动完成的动作  

1. 备份 CPSR 到对应模式的 SPSR  为了恢复程序状态做准备 

2. 备份 PC到LR  为了处理完毕异常后 可以返回到异常打断处理继续 

3. 修改 CPSR 

1) 设置CPU 为ARM状态           因为异常的处理 都是ARM指令 

2) 设置CPSR 中模式位 为异常模式

3) 若有必要 禁止某些中断(f/i)    例如 fiq触发时 irq中断位设置为1 屏蔽 

4. 设置PC 到对应异常向量的入口  即程序入口(软件处理)

4.2.2 软件处理: 

 由编程者解决具体的问题 

1保存现场   公用寄存器入栈  r0-r12, lr 

2 处理异常   

3 恢复现场   从栈中取出 R0-R12, lr--> PC , 从 SPSR中 恢复CPSR

4.3 异常向量的入口?

CPU 规定的 对应异常的处理程序的入口 地址

入口:

0x00 复位异常:  复位键被点击了 产生了复位信号    CPU将 自动进入svc模式 

0x04 未定义指令异常:  CPU从内存中得到了一条不识别的指令    undef  用于扩展指令 

0x08 软中断异常 :    触发了软中断    svc    用于实现系统调用

0x0c 指令预取异常:    CPU从内存中取一条指令失败了            abort  用于虚拟内存的刷新 

0x10 数据异常 :       a/0    abort  处理非法运算

0x14 保留     为了后续可以 扩展异常 

0x18 中断异常 :       触发了中断     irq   处理中断事件

0x1c   快速中断异常     触发了快速中断   fiq   处理快速中断事件

4.4 异常的优先级问题? 

1. reset 复位异常

2. Data ABort

3. FIQ

4. IRQ

5. Prefetch Abort

6. SWI   软中断

7. Undefined instruction

5. 中断

中断: 指事件(中断源) 打断CPU当前正在 执行的程序, 转而去 处理中断事件  处理完毕后,回到打断位置 继续向后执行 

中断源: 系统中能够产生中断信号的来源  

外部中断:  中断信号来自芯片外部 通过GPIO 传入的 

内部中断:  芯片内部的一些设备 产生的  timer  uart  wdt ....

5.1 问 快速中断为何比中断快 ,快在什么地方 

fiq 快速中断    irq 中断  

1.fiq 优先级高于irq 

2.fiq 独立寄存器多  保存现场 与 恢复现场 快 

3.fiq 位于异常向量表 末尾, 可以不必要跳转 直接开始处理 

6. 流水线 

目的 提高指令执行的效率 

一条ARM指令的执行  主要有3个步骤   

取址: 从内存中 加载 指令到 CPU 

译码: 解锁执行需要的寄存器 

执行: 指令执行对应操作 

多级流水线:  3级   5级  9级  11级    

指令执行的周期 并非一致   多周期指令 将 阻塞流水线 

流水线的打断  ----->例如   执行了 跳转指令  异常触发了

6.1 举例

6.1.2 使用3级流水线

不使用流水线

假设 取址  5周期   译码  3周期    执行  1周期 ,执行一条指令 9周期 

有100条执行 需要顺序执行   900周期

3级流水线

若为3级流水线  问 100条指令 需要多少周期可以完成?  

515个周期 

解释

上图可知,载第4个5周期结束后,我们的指令1刚好全部执行完毕

那么可以推断出,在下一个5周期执行完毕后,指令2也执行完毕,再下一个5周期执行完毕后,指令3执行完成,由此可以得出再第4个5周期后,每5个周期都会有一个指令执行完毕,所以100条指令需要500周期,但是前面还有3个5周期(称之为流水线的建立周期)要计算,总共515周期

7. ARM指令集

RISC:精简指令集处理器   追求的是 结构的简化 功耗的降低 ,指令长度是固定  舍弃了一些复杂指令 转而由多个简单指令取完成复杂指令的工作,嵌入式应用场合, 低功耗, 对成本敏感的 场景 

CISC (x86 架构):复杂指令集处理器    追求的是 运行效率 指令集长度不固定  所有指令都追求硬件实现   结构复杂 功耗高 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么 HTTPS 协议能保障数据传输的安全性?

HTTP 协议 在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念。 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议,它位于 OSI 网络模型中的应用层。 HTTP 协议是通过客户端和服务器的请求应答来进行通讯,目前协议由之前的 RFC 2616 拆…

SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例

文章目录 SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例Dubbo定义其核心部分包含: 工作原理为什么要用dubbo各个节点角色说明:调用关系说明: dubbo为什么需要和zookeeper结合使用,zookeeper在dubbo体系中起到什么作用&…

谷歌浏览器通过network模拟HTTP中的GET/POST请求获取response

1、F12打开network选中需要模拟的方法Copy->Copy as fetch 2、通过AI帮你进行转换一下调用格式 原代码 fetch("https://mp.amap.com/api/forward/aggregate?mtop.alsc.kbt.intergration.toolkit.call.queryCallBlockInfo", {"headers": {"acce…

Django开发_14_后台管理及分页器

一、后台管理 (一)登录 http://127.0.0.1:8000/admin/ (二)创建超级用户 manage.py createsuperuser (三)注册模型 admin.py: models [model1,model2,model3 ]ad…

浅析Java中volatile关键字

认识volatile关键字 Java中的volatile关键字用于修饰一个变量,当这个变量被多个线程共享时,这个变量的值如果发生更新,每个线程都能获取到最新的值。volatile关键字在多线程环境下还会禁止指令重排序,确保变量的赋值操作按照代码的…

VS Code + Python + Selenium 自动化测试基础-01

VS Code Python Selenium 自动化测试基础-01 让我们来讲一个故事为什么要写自动化开发前的准备工作牛刀小试开常用的web DriverAPI-定位元素id定位:find_element_by_id()name 定位:find_element_by_name()class 定位:find_element_by_class…

机器视觉技术与应用实战(平均、高斯、水平prewitt、垂直prewitt、水平Sobel、垂直Sobel、拉普拉斯算子、锐化、中值滤波)

扯一点题外话,这一个月经历了太多,接连感染了甲流、乙流,人都快烧没了,乙流最为严重,烧了一个星期的38-39度,咳嗽咳到虚脱。还是需要保护好身体,感觉身体扛不住几次连续发烧!&#x…

MySQL---多表查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

对#多种编程语言 性能的研究和思考 go/c++/rust java js ruby python

对#多种编程语言 性能的研究和思考 打算学习一下rust 借着这个契机 简单的写了计算圆周率代码的各种语言的版本 比较了一下性能 只比拼单线程简单计算能力 计算十亿次循环 不考虑多线程 go/c/rust java js ruby python 耗时秒数 1:1:1:22:3:250:450 注:能启用则启…

web蓝桥杯真题--11、蓝桥知识网

介绍 蓝桥为了帮助大家学习,开发了一个知识汇总网站,现在想设计一个简单美观的首页。本题请根据要求来完成一个首页布局。 准备 开始答题前,需要先打开本题的项目代码文件夹,目录结构如下: ├── css │ └──…

Stream toList不能滥用以及与collect(Collectors.toList())的区别

Stream toList()返回的是只读List原则上不可修改,collect(Collectors.toList())默认返回的是ArrayList,可以增删改查 1. 背景 在公司看到开发环境突然发现了UnsupportedOperationException 报错,想到了不是自己throw的应该就是操作collection不当。 发…

spawn_group | spawn_group_template | linked_respawn

字段介绍 spawn_group | spawn_group_template 用来记录与脚本事件或boss战斗有关的 creatures | gameobjects 的刷新数据linked_respawn 用来将 creatures | gameobjects 和 boss 联系起来,这样如果你杀死boss, creatures | gameobjects 在副本重置之前…

测试覆盖与矩阵

4. Coverage - 衡量测试的覆盖率 我们已经掌握了如何进行单元测试。接下来,一个很自然的问题浮现出来,我们如何知道单元测试的质量呢?这就提出了测试覆盖率的概念。覆盖率测量通常用于衡量测试的有效性。它可以显示您的代码的哪些部分已被测…

【网络安全】【密码学】【北京航空航天大学】实验五、古典密码(中)【C语言实现】

实验五、古典密码(中) 实验目的和原理简介参见博客:古典密码(上) 一、实验内容 1、弗纳姆密码(Vernam Cipher) (1)、算法原理 加密原理: 加密过程可以用…

【跳槽面试】Redis中分布式锁的实现

分布式锁常见的三种实现方式: 数据库乐观锁;基于Redis的分布式锁;基于ZooKeeper的分布式锁。 本地面试考点是,你对Redis使用熟悉吗?Redis中是如何实现分布式锁的。 在Redis中,分布式锁的实现主要依赖于R…

对比一下HelpLook和Bloomfire知识库软件:谁更胜一筹?

在当今知识经济的浪潮中,知识库工具作为企业不可或缺的利器,对于提高工作效率、加强团队协作和优化员工培训等方面起着至关重要的作用。HelpLook和Bloomfire是众多知识库工具中的两款佼佼者,它们各自拥有独特的优势和特点。 一、HelpLook&…

解决 java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader 报错

在使用POI导出Excel表格的时候&#xff0c;本地运行导出没问题&#xff0c;但是发布到服务器后提示 “java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader” 下面是pom.xml中的配置 <dependency><groupId>org.apache.poi</groupId><art…

【算法详解】力扣162.寻找峰值

​ 目录 一、题目描述二、思路分析 一、题目描述 力扣链接&#xff1a;力扣162.寻找峰值 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个…

大创项目推荐 深度学习验证码识别 - 机器视觉 python opencv

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x…

gin介绍及helloworld

1. 介绍 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有快速灵活&#xff0c;容错方便等特点 对于golang而言&#xff0c;web框架的依赖要远比Python&#xff0c;Java之类的要小。自身的net/http足够简单&…