我试图了解 STM8 流水线,以便能够预测我的代码需要多少周期。
我有这个例子,我在每个 GPIO 引脚上切换 4 个周期。IFFloop
在 4 字节边界 + 3 处对齐,引脚保持活动 5 个周期(即比它应该多一个)。我想知道为什么?
// Switches port D2, 5 cycles high, 4 cycles low
void main(void)
{
__asm
bset 0x5011, #2 ; output mode
bset 0x5012, #2 ; push-pull
bset 0x5013, #2 ; fast switching
jra _loop
.bndry 4
nop
nop
nop
_loop:
nop
bset 0x500f, #2
nop
nop
nop
bres 0x500f, #2
jra _loop
__endasm;
}
更多上下文:
bset
/bres
是4字节指令,nop
1字节。nop
//指令每个需要 1bset
个bres
周期。- 该
jra
指令需要两个周期。我认为在第一个周期中,指令缓存被下一个 32 位值填充,即在这种情况下nop
只有指令。第二个周期实际上只是 CPU 在解码下一条指令时被停止。
所以在循环中:
bres
清除引脚jra
,管道刷新,nop
获取nop
解码,bset
获取nop
执行、bset
解码、下一次nop
获取bset
执行设置引脚nop
,bres
取nop
nop
,bres
解码bres
执行清除引脚
据此,该引脚应在 4 个周期内保持低电平,在 4 个周期内保持高电平,但在 5 个周期内保持高电平。
在任何其他对齐情况下,引脚按预期为低/高 4 个周期。
我认为,如果 PIN 在一个额外的周期内保持高电平,那一定意味着执行管道在bset
指令之后停止(nop
此后的 s 提供了足够的时间来确保bres
稍后可以立即执行)。但根据我的理解nop
(对于 6.)已经在 4 中获取。
知道如何解释这种行为吗?我在手册中找不到任何提示。