• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

ARM知识学习

武飞扬头像
qq_38296162
帮助1

一、ARM简介

1、ARM:ARM是一个公司名,该公司主要业务是设计处理器内核。

处理器内核:又叫处理器架构,由控制时序电路 ARM指令集/thumb指令集组成,

处理器内核 外围组件=处理器芯片

ARM内核有两种工作状态:ARM态与thumb态

当处于ARM态时,该内核有7或8种工作模式

User:用户模式,大多数任务执行时处于这种状态

FIQ:高优先级中断产生时将会进入这种模式

IRQ:低优先级中断产生时将会进入这种状态

SVC:特权模式,当复位或软中断指令执行时将会进入这种状态

ABT:存取异常

UND:执行未定义指令时进入这种状态

SYS:系统模式,与user类似,但具有直接切换到其他模式的特权

Cortex-A特有模式:

Monitor : 是为了安全而扩展出的用于执行安全监控代码的模式;

也是一种特权模式

二、寄存器:

contex的内核有40个寄存器:r0~r15,cpsr,spsr

r13(sp):存放sp栈指针

r14(lr):用来存放中断的下一条指令地址或函数调用的返回地址

r15(pc): Pc程序的取址位置

cpsr:程序状态寄存器,保存当前处理器的状态信息

spsr:是cpsr的备份寄存器,通常发生中断时被使用

高四位:

31bit:N=1表示运算结果为负,N=0运算结果为正

30bit Z=1表示运算结果为0, Z=0表示为非零

29bit C,加法C=1表示有进位,C=0表示没有进位

28bit V=1ALU运算溢出,A=0ALU运算未溢出

低5位:处理器模式

处理器模式

1、psr操作指令--------msr、mrs

复制一个寄存器到 PSR 中

MSR CPSR, R0 ; 复制 R0 到 CPSR 中

复制 PSR 到一个寄存器中

MRS R0, CPSR ; 复制 CPSR 到 R0 中

处理器模式切换:

  1.  
    mrs r0,cpsr
  2.  
    bic r0,#0x1F
  3.  
    orr r0,#0x10
  4.  
    msr cpsr,r0

三、汇编指令

1、数据处理指令:

算数指令:

  1.  
    ADD r0,r1 @r0=r0 r1 //adds 影响标志位
  2.  
    ADC r0,r1 @r0=r0 r1 C
  3.  
    SUB r0,r1 @r0=r0-r1
  4.  
    SBC r0,r1 @r0=r0-r1-!C
  5.  
    RSB r0,r1 @r0=r1-r0
  6.  
    RSC r0,r1 @r0=r1-r0-!C

逻辑指令:

  1.  
    AND r0,r1 @ r0=r0&r1
  2.  
    ORR r0,r1 @r0=r0|r1
  3.  
    EOR r0,r1 @r0=r0^r1
  4.  
    BIC r0,#0xFF @位清零,r0低8位被清零

比较指令:

  1.  
    CMP r0,r1 @r0与r1比较
  2.  
    CMN r0,r1 @反值比较 r0与~r1
  3.  
    TST r0,#0x3 @Z=1,第3bit为空,Z=0,第3bit不为空
  4.  
    TEQ r0,r1 @r0r1 比较

数据搬移指令

  1.  
    MOV  r0,0x1f @将0x1f存入ro寄存器中
  2.  
    MVN r1,r0 @传送取反的值r1=~r0

2、ldr伪指令

[]:取地址中的内容

在ldr r3,[pc,#-0x0004]指令中,数据0x12345678放到哪里了?

放在了数据池中,数据池=pc 偏移=0x00000008 8 (-0x0004)=0x0000000C

[数据池]=[0x0000000C]=0x12345678

注意:指令从取指到执行,经历了两个指令周期,两个指令周期可以执行两条指令

所以,指令从取指到执行跨越了两条指令的宽度,所有要加2*4=8个地址单元

3、b/bl指令

b:无条件跳转

bl:保存下一条指令地址到lr中,程序返回mov pc, lr

4、移位指令

lsl:逻辑左移,低位补零

lsr:逻辑右移,高位补零

asr:右移,高位补原数符号位

ror:循环右移 ,高位用移出的数填充

rrx:右移一位,高位补上条指令结束后的C值

5、单寄存器传送指令

ldr/ldrb/ldrh:内存---->寄存器

str/strb/strh: 寄存器---->内存

str r1,[r2,#4]! @前索引赋值法 i

str r1,[r2],#4 @后索引赋值法i

6、块传送指令

ldm 内存----->寄存器 出栈ldmia=ldmfd

ia i

ib i

da i--

db --i

stm 寄存器----->内存 入栈 stmdb = stmfd

四、软中断

中断:是一个过程,是指CPU在执行当前程序的过程中插入了另外一段程序的执行过程。

当SWI 88执行时,ARM core:

1 拷贝cpsr的值到spsr

2 设置cpsr=0x000000d3

3 保存swi 88的下一条指令地址到lr=0x00000044

4 设置pc=0x00000008(异常向量表的第三条异常地址)

stmfd sp!,{r0-r12,lr}

当处理完中断,恢复现场时,ARM core:

1 将spsr的值拷贝到cpsr中

2 将swi 88 的下一条指令地址(lr)恢复给pc(ldmfd sp!,{r0-r12,pc}^ )

五、硬件中断

目标:通过k2按键触发硬件中断

第一阶段:连线

K2--》con4-->con3-->u1a(gpx1_1)--》能发出XEINT9中断--》57号中断

1 配置GPX1_1为外部中断模式

6.2.3.198 GPX1CON 0x11000C20 (4-7)0xF

2 配置中断的触发方式-->下降沿触发

6.2.3.211 EXT_INT41CON 0x11000E04 (4-6)0x2

3 取消中断掩码

6.2.3.223 EXT_INT41_MASK 0x11000F04 (1)0

第二阶段:gic

1 使能57号中断

9.5.1.16 ICDISER_CPU 0x10490104 (25)1

2 把57号中断交给cpu0处理

9.5.1.22 ICDIPTR14_CPU0 0x10490838 (8-15)0x1

3 设置中断优先级

9.5.1.21 ICDIPR_CPU 0x10490438 (8-15) 优先级范围0~255 例如 12

4 使能CPU0中断

9.5.1.1 ICCICR_CPU0 0x10480000 (0)1

5 设置cpu0的中断优先级阈值

9.5.1.2 ICCPMR_CPU0 0x10480004 (0-7)0xFF

6 使能GIC总开关

9.5.1.12 ICDDCR 0x10490000 (0)1

第三阶段:中断处理

1 得到中断号--》寄存器

9.5.1.4 ICCIAR_CPU0 0x1048000C (0-9)获取中断号

处理中断--》led uart

2 清除管脚中断标志

6.2.3.227 EXT_INT41_PEND 0x11000F44 (1)1

3 清除GIC控制器的57号中断标志

9.5.1.19 ICDICPR_CPU 0x10490284 (25)1

4 结束中断

9.5.1.5 ICCEOIR_CPU0 0x10480010 (0-9)中断号

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgaafge
系列文章
更多 icon
同类精品
更多 icon
继续加载