标签:
作者:郭孝星
微博:郭孝星的新浪微博
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells
存储单元,32存储单元,4个字节的存储单元临时存放ALU运算结果的存储单元
Cortex-A R0到R15 为寄存器的编号
ARM一共有40寄存器,这些寄存器有8种工作模式和4种状态,如下所示:
4种状态
8种模式
同名寄存器访问的问题
当前模式处在irq
mov r13,#0 (irq的r13 )
切换模式到fiq
mov r13,#1 (fiq的r13)
切换模式到undef
mov r13,#2 (undef的r13)
切换模式到abort
mov r13,#3 (abort的r13)
4大步与3小步,由cpu内核自动完成,不需要用户写程序。
举例1
当前系统发生了irq中断10
举例2
发生了一个软件中断
异常返回
movs pc,lr
s: spsr-> cpsr
每一个协处理器里面有16个寄存器C0 ~ C15 mcr p15,0,r0,c1,c0,0
第一周期
pc = 0x8000
pc与fetch之间的关系 Fetch = *pc
F : mov
D : x
E : x
第二周期
pc = 0x8004
F : add
D : mov
E : x
第三周期
pc = 0x8008
F : sub 0x8008
D : add
E : mov 0x8000
第四周期
pc = 0x800c
F : and 0x800c
D : sub
E : add 0x8004
第一周期
pc = 0x8008
F : orr
D : sub
E : bl 0x8fec
第二周期
L相当于E单元的子单元
E :L pc -> lr = 0x8008
pc = 0x8fec
F : and
D : x
第三周期
E : lr -4 -> lr = 0x8004
pc = 0x8ff0
F : orr
D : and
第四周期
pc = 0x8ff4
F : eor
D : orr
E : and
返回指令:
mov pc,lr (lr = 0x8004)
第一个周期(发生一个IRQ中断)
pc = 0x8008 -> 不变
F : mov -> 不变
D : sub -> 改变 DI(中断译码指令)
E : add -> 不变
第二周期
pc = 0x800c
F : x
D : mov
E : EI(中断指令)
第三周期
E : L (异常处理)
pc -> lr_irq = 0x800c
pc = 异常向量(0x18)
cpsr -> spsr_irq
cpsr <- TJ I F [4:0] = 10010
F : B 0xaf00
D : x
第四周期
E : A(lr -4 -> lr_irq = 0x8008)
pc = 0x1c
F : x
D : b 0xaf00
第五周期
pc = 0x20
F : x
D : x
E : b 0xaf00
第六周期
pc = 0xaf00
F :stmfd
D : x
E : x
第七周期
pc = 0xaf04
F : mov
D : stmfd
E : x
第八周期
pc = 0xaf08
F: ldr
D : mov
E : stmfd
stmfd是中断处理函数的第一条指令
中断返回: subs pc,lr,#4 (lr = 0x8008)
M和W 是属于E单元的子单元,在M和W过程会占用E单元,占用E单元流水线阻隔
LDR互锁发生的条件
ldr指令中当前指令目的寄存器和下一条指令的源寄存器重名时会发生ldr互锁
LDM互锁:
LDMIA R13!, {R0-R3}
这条指令执行需要连续计算4次地址,所以需要占用E单元,占用4个周期
ATPCS:函数参数要求:
int func (int a,int b,int c ,int d ,int e)
参数的返回:
一个字节的数,循环右移(ROR)0到30之间的偶数位得来的一个数就是立即数
判断规则:
0x1234,0x138,0x345,0xffffffff,0xf00012,0x12345678,0xf000000f,0x12,0x8
x y x x x x y y y
如下所示:
0x123
00 |01 0010 0011 |
0x348
00 | 11 0100 10 | 00
00 | 11 0100 0101 |
版权声明:当我们认真的去做一件事的时候,就能发现其中的无穷乐趣,丰富多彩的技术宛如路上的风景,边走边欣赏。
标签:
原文地址:http://blog.csdn.net/allenwells/article/details/47418017