ARM-流水线
AMBA(片上高速总线)
ARM内核
跳转指令:
b : goto ±32M add pc , n
bl: 子函数调用 lr = pc_old mov pc,lr
最佳流水线:
-1
f: add
d:*
e:*
0:
f:sub
d:add
e:*
1:
f:orr
d:sub
e:add
2:
f:and
d:orr
e:sub
…
ldr:
-1:
f:add
d:*
e:*
0:
f:sub
d:add
e:*
1:
f:ldr
d:sub
e:add
2:
f:and
d:ldr
e:sub
3:
f:orr
d:and
e:ldr
4:
f:wait
d:wait
e:m 从内存加载一个值到cpu的一个位置
5:
f:wait
d:wait
e:w 将该值写回到 指定的通用寄存器
6:
f:eor
d:orr
e:and
….
分支流水线:(当程序发送 需要返回的跳转,cpu将会将lr自己调整 -4)
-1:
f:bl
d:*
e:*
0:
f:sub
d:bl
1:
f:orr
d:sub
e:bl pc = 0x8fec
2:
f:and (0x8fec)
d:— 本周期地址 于 上一周期地址不连续,数据被丢弃
e:l lr = 上一个周期的pc值 == 0x8008
3:
f:orr
d:and
e:a lr = lr - 4 = 0x8004
4:
f:eor
d:orr
e:and
…….
//mov pc,lr
IRQ中断流水线:
-1
f:add
d:*
e:*
0:
f:sub
d:add
e:&
1: (IRQ产生)
f:mov
d: IRQ
e:add
2: pc == 0x800c
f:* (800c)
d:wait
e:irq spsr_irq = cpsr cpsr = [irq] ; pc = 0x18
3: pc == 0x18
f:b 0xaf00
d:wait
e:L lr = pc_old = 0x800c
4:pc == 0x1c
f:* (0x1c)
d:b 0xaf00
e:a lr = lr - 4 = 0x8008 返回地址跑偏4字节 ,需要后期手动减4
5: pc == 0x20
f:* (0x20)
d:* (0x1c)
e:b 0xaf00 pc = 0xaf00
6:pc == 0xaf00
f:stmfd
d:–
e:–
7:
f:mov
d:stmfd
e:–
8:
f:ldr
d:mov
e:stmfd
ldmfd
// subs pc,lr,#4
//sub lr,lr,#4
//movs pc,lr