ARM基础(1) 基本概念

主要用于嵌入式产品里面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ARM 交叉工具链 : 代码编译过后, 要放在板子上运行, 在CPU上运行, ARM cpu, ARM芯片肯定不能用gcc编译器, 我们要用ARM对应的编译工具链 , 针对ARM芯片的

Keil工具主要针对单片机开发的 ,ARM指令这些就在这个上面进行调试
交叉编译工具链 : 在Keil开发中是可以不按的 但是学到后面之后都会用到linux下编译源码,那个时候会对应用到这个交叉编译工具链
要把两个统一起来, 所以我们没有用kill自带的这个工具,
交叉编译工具链 : 我们代码的一个编译后,要放在板子上运行,我们在cpu里面运行,而cpu的话在电脑里面是x86芯片,在板子上的话是ARM芯片,
我们在ARM芯片肯定不能用gcc编译器, 我们用对应ARM里的 编译源码的工具, 针对ARM芯片的
在这里插入图片描述
在这里插入图片描述
安装成功之后, 安装真正调试ARM的工具
做单片机开发都是用keil 来做
链接脚本 :

在这里插入图片描述

ARM的工作模式及寄存器

我们知道手机内部它有CPU, CPU运行它主要有7种工作模式, 工作模式 就像一个人 它有几种生活状态一样, 比如 : 上班是一种状态, 在家是一种状态,

1.User 模式 : 应用程序运行的时候就处于这种模式 , 可以理解为正常模式 ,通常情况下运行的时候,比如手机运行中, 应用程序运行状态就是User模式
2.FIQ 模式 : 高优先级的中断, 中断模式,快速中断,也就是说我们在处理中断模式的时候, 如果说我们有更高优先级的中断怎么办 ? 也就是说中断不止有一个, 比如它接入了很多设备, 有很多设备进来,你怎么处理它之间的关系呢 ? 我们整个优先级, 就像VIP客户是一样的, 有了这个模式之后,这个cpu相应的时候,能响应更加重要的事情,
3.IRQ 模式 : 中断模式 ,有中断产生的时候,能够马上请求, 马上响应。也就是说,当外部设备有中断请求的时候,它就会触发该模式, 中断就是我们的硬件能够应对
我们CPU可以读入程序来运行,但是CPU并不是闭门造句,会考虑到如果外面的设备有突发事情发生的时候怎么办?假设在运行过程种,你的外部设备接到一个传感器家里发生火灾了,这个传感器接收到信号要给CPU,它要进行相关处理啊, 比如发出报警啊,信息呼救等等,这个时候CPU就要应对突发事情,应对突发事情,CPU设计的时候专门设计了一个模式叫做中断模式 (考虑的是 一个实时性,效率)
4.Supervisor 超级 用户模式,在运行过程中如果要访问一些系统的资源, 要通过linux内核,而我们的操作系统运行Supervisor模式。 这个模式就是说我们CPU运行过程中我们要考虑一个系统运行软件它有 一个架构 , 一个是通用用户执行的时候他的权限是受限的,并不是什么都能访问的,当我们要访问对应资源的时候必须要切换用户模式, 获得更高级的权限, windows有个普通用户和一个根用户或者叫超级用户,管理员, 管理员的权限是很高的, 它能访问大部分的资源,而普通用户访问的资源是受限的 。 CPU在设计的时候 也考虑了一种情况 。 两种模式, 一种是通用模式,一种是超级用户模式, 在超级 用户模式的时候,它的权限更高你访问更多的资源, 这是处于安全的考虑
5.Abort 模式 : 叫做异常模式 ,比如你 要存储数据的 时候,比如说 数据存在很多类型,当你把数据存到了错误的类型里面,出现了异常, cpu怎么办 ? 它会进入到这个模式。
6.Undef 模式 : 在运行过程种当执行了未定义的指令,识别不出来识别不了怎么办 ? 他会进入这个模式, 像我们有些浮点数运算这些指令都输入Undef模式进行执行的
7.System 模式 : 和User模式几乎是一样的,唯一不一样就是权限比User模式更高而已
为什么要设计这7大工作模式 ? 它的初衷是干嘛?其实就是应对 特殊情况,就是特殊情况,特殊处理。从安全和效率考虑,从安全的角度有 User模式和Supervisor 模式,从一个实时性和效率的角度它有IRQ模式, 在应对异常的时候它提供了Abort模式, IRQ除了不同的工作模式以外,它还 有一系列的寄存器,

寄存器 :
存储数据的场所 。 除了存储以外,还有其他特殊的功能 。

30个通用寄存器, 临时存放数据的场所。
还有一些相对功能比较特殊的一些寄存器, 比如我们CPU运行,
PC寄存器 : 运行过程中我要知道这个指令,执行到哪里了,执行的位置在哪里 ? 我们要有一个地方去知道这个信息,执行到哪个位置了,专门有寄存器PC , 程序计数器, 程序假设有100条指令的话, 你运行到哪一条指令了,第三十二个 ?三十二条 ? 还是第五十六条, 通过PC这个指令去指向我们的程序运行到哪里了,
CPSR 寄存器 : 当前程序状态寄存器, 也就是说,我们程序运行到哪里, 程序运行到这里的时候它的工作模式 ,例如ARM有七种工作模式, 当你运行的程序中它处于那种工作模式, 这是存储在CPSR里面 ,这里面它有信息去描述
SPSR 寄存器 5个 : 备用的程序状态寄存器, 它主要的作用就是对CPSR的一个保存, CPSR记录了当前的一个工作模式状态, 但是有可能我们的工作模式有可能进行切换, 切换过去之后,还有切换回来,那肯定要有个地方保存以前的那个状态,通过SPSR进行保存 ,

ARM的几种工作模式, 以及它的寄存器的一个总的一个框图,这个框图相对比较重要, 通过这个框图我们要知道一下CPU内部它的工作模式,和寄存器之间的 一个关系 ,
我们的指令是在CPU里面运行的,我们肯定要知道一下这个CPU它大概的工作模式是怎样的, 数据放在哪里 ? 怎么存储?这都是要跟寄存器打交道的, 我们必须要知道ARM的工作模式和寄存器, 否则的话你在读ARM的汇编指令的时候就会出问题。

在这里插入图片描述
Systerm and User : r0 – r7 是寄存器, 相当于箱子, 专门存放我们的数据的, 我们把我们的数据看做一个货物的话, 货物都放在这个箱子里面, 这一个箱子有多大, 以32位机来说, 我们操作的一个单位 是4个字节 , 一个字节是8位, 总共32位, 我们的一个寄存器就占四个字节,总共32位 . 我可以把数据放在里面, 也可以把它读出去.
ARM的CPU内部的寄存器是有限的, 如果你数量很大, 就放在flash里面 或内存里面去做,r0 - r7 这些都是我们普通的一些寄存器,
r8 – r20 做一些特殊用途, 如果在User模式下面 r0 - r12 都是类似的功能都一样. 就是数据存储, 这里面有几个相对比较特殊的,
有一个PC的寄存器 , 它是指明当前程序运行到哪里了, 就是记录运行的位置的,
r15也就是PC, r14 我们执行过程中肯定要调用函数, 调用完函数之后, 还要回来继续执行, 这个记录继续执行的地址就放在这个LR里面. r13 这个寄存器,SP,栈顶指针, 因为程序运行过程中我们用到栈 , 进栈和出栈, 比如说一个APP 它按顺序往下执行, 执行过程中, 突然来了一个中断 , 中断的作用就是随机打断 当前程序, 打断过后,跳到执行对应的程序, 执行完过后, 再回来接着执行, 这是中断的特点, 中断目的应对突发事件 , 突发事件来了就可以打断你. 比如你正在上课,突然间来了一个电话,你出去接一下电话, 接完电话就要接着回来听课, 这样就存在一个问题, 就是对现场要进行一个保护, 保护现场, 等你回来接着往下执行, 恢复现场, 保护现场恢复现场就需要一个进栈,在栈里面. 把数据放到栈里面, 出来的时候 再把数据还回来. 先进后出. . 而这个栈只能通过r13 , SP 来去指向,
还有一个寄存器比较特殊,叫CPSR , 当前程序状态寄存器, 就知道当前这个产品这个系统它运行状态很多状态信息都在这里面, 比如说你当前处于哪个工作模式, 是User模式还是FIQ模式, 通过它可以知道,

在这里插入图片描述
一共七种工作模式 : 那么对应的r0是不是有7个呢 ? 注意, 这个图里面有带三角的地方
什么意思 ? 就是它有7种工作模式,但它寄存器的话并不是就 乘以7 没有小三角的寄存器就是共用寄存器, 就是这里r0 – r7这几个寄存器 不同的工作模式,无论你怎么切换 模式 这个r0-r7都是同一个, 只有一份, 也就是说在User模式里面 r0 里面写个3 ,那么切换到FIQ模式这个r0里面的这个3还在, 它只有一份, CPSR也是一样的 , 无论切换到哪个模式,
这个小型的三角的地方代表的就是多出来一份 ,就是说 r13 和 r14 在不同的模式下面都有额外的一份, 这里还有相对特殊的FIQ模式 它多了r8 – r12 , 是 用来干嘛的 ? FIQ模式的时候 快速中断模式, 快速中断的话, 最终目的是尽量的快的解决问题,那么中断涉及到一个现场的保护, 去处理中断程序,处理完之后回来接着执行,那么涉及到一个现场的 一个保护,保护当前运行的一些数据, 那保护的时候数据 就要进到栈里面,进栈的话 , 进栈出栈的效率是比较耗时的, 我们这里有没有办法可以尽量节省进栈数据的速度呢 ?从User模式切换到FIQ模式因为 r0–r7是共用的, 你FIQ模式不能再操作这几个寄存器了, 要把这些寄存器的值进行一个保护,那如果说我们寄存器另外有一份 两个是独立的像r8 - r12 ,不是同 一个东西, 既然不是同 一个东西那你的数据就不需要进栈了,从而节省它的一个时间,这里是牺牲了空间去换取时间, 这里面的SPSR是一样的 ,、
在这里插入图片描述
CPSR 寄存器 当前程序状态寄存器 ,通过它我们可以知道当CPU运行的 一些状态
ARM是一个32位机, 它内部它的寄存器一般都在32位左右,

最低的是0 – 4 五位 : 叫做模式位,通过它我们可以知道当前的CPU的工作模式是User模式还是System模式, 我们把它转成二进制数,如果值是 :
10000 的话就是User mode模式
10010 IRQ模式
10011 SVC mode模式
10001 FIQ mode模式
10111 Abort mode 模式
11011 Undfined mode模式
11111 System mode模式
不同的模式有不同的值, 如果执行过程中想知道当前运行的状态, 把CPSR的值读出来, 读出来之后呢, 根据它的值我就知道当前是什么工作模式,是这样来实现的。

ARM公司在设计芯片的时候, 有两种状态 一种是ARM状态, 一种是Thumb状态,
在这里插入图片描述
中断禁止位 :
第6位(0开始数的话是第7位) F 禁止 FIQ 快速中断禁止位
第7位(0开始数的话是第8位) I 禁止 IRQ 也就是当这个位是禁止的时候,CPU可以不响应外面设定的一个中断请求,我们只要把这个位设置为1 ,就表示禁止掉了,

条件位 :
就是指令过程中有加法 1 + 2 = 3 5 * 8 = 40 乘法加法减法 , 都可以用汇编语言来写, 运算过程中, 还有比较两个数相对等待, 都需要状态去记录,这里面在CPSR里面 最高的四位 NZCV这四位, 组合来表示, 运算的状态 , 做减法如果两个值相等的话会把Z位置为1, 加减乘除的时候有一个进位 通过C来表示, 这几个位会结合去运算, 得到结果,

CPSR / SPSR 操作指令
mrs r0,CPSR 意思是把CPSR这个指读到r0寄存器里面
mrs CPSR,r0 意思是把CPSR值写到r0里面去

结合keil工具看一下, 工作模式和寄存器是怎么运行的 :
在这里插入图片描述
通过mov指令可以操作寄存器,
那要怎样切换工作模式呢 ?

CPSR 最后的5位就表示它的工作模式
在这里插入图片描述
所以我们可以通过读这个值知道当前处于什么工作模式
注意: 读的时候是有特殊指令的, 通用寄存器可以用mov来操作,如果你要操作CPSR的话我们就不能用mov指令了,
mov r0,cpsr 是不支持这个语法的,
那么在读这个寄存器的时候,从安全性的方面考虑,特殊寄存器需要特殊的指令去操作,如果要读cpsr 寄存器的话需要用 mrs 指令去读这个寄存器,
mrs r0,cpsr 表示把cpsr的值读到r0里面去 mrs是读
msr CPSR,r0 表示把r0的值写到CPSR里面去 msr是写

假设我们想去改变 从SVC模式切换成普通的用户User模式, 我写这个值就可以了, 不能直接写, 要有一个寄存器作为中转
常数前面一般是个#号,

mov r3,#0xD0
msr cpsr,r3 注意不能 msr cpsr,#0xD0这样写, 必须通过一个寄存器进行中转

CPSR 即可以读取到当前的工作模式, 还可以通过这个CPSR改变寄存器的状态 ,切换工作模式
通过这种方式可以改变ARM的工作模式,

注意User和System模式权限是不一样的, User是没有权限写CPSR这个寄存器的,你要写必须在Super模式下

那如何切换后Super模式呢 ? 通过中断,通过触发中断就可以再切换回去,
我们通过ARM的一个软件模拟一下中断产生可以切换到Super模式 。
swi 1 通过这个指令也可以切换到Super模式 (软中断指令)可以自动切换到Super模式

通过寄存器实现 数据的读写和寄存器工作模式的切换
通过指令的方式我们可以操作寄存器,切换工作模式,
要是我们想做一个加法运算怎么做 ?

add r1 ,r0 , #5 意思是 r0里面的值 + 5 然后再赋值给 r1

CPU : 控制器, 运算器,寄存器
mov r0 , #3
add r1 ,r0 , #5
假如代码放在这里FLASH 里面 CPU运行的时候会通过控制器去找 ,通过控制器去把这个指令读出来, 通过加法的运算ALU运算器, + - * / 肯定要操作数据, 数据存在寄存器里面,

CPSR除了后五位是确定工作模式的, 其他数是做辅助运算的

mov r0 , #3
cmp r0 , #3 比较两个数的值 CPSR里的Z位 当两个数字相减或比较的时候如果是相等它 置为1 .
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值