我试图了解 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字节指令,nop1字节。nop//指令每个需要 1bset个bres周期。- 该
jra指令需要两个周期。我认为在第一个周期中,指令缓存被下一个 32 位值填充,即在这种情况下nop只有指令。第二个周期实际上只是 CPU 在解码下一条指令时被停止。
所以在循环中:
bres清除引脚jra,管道刷新,nop获取nop解码,bset获取nop执行、bset解码、下一次nop获取bset执行设置引脚nop,bres取nopnop,bres解码bres执行清除引脚
据此,该引脚应在 4 个周期内保持低电平,在 4 个周期内保持高电平,但在 5 个周期内保持高电平。
在任何其他对齐情况下,引脚按预期为低/高 4 个周期。
我认为,如果 PIN 在一个额外的周期内保持高电平,那一定意味着执行管道在bset指令之后停止(nop此后的 s 提供了足够的时间来确保bres稍后可以立即执行)。但根据我的理解nop(对于 6.)已经在 4 中获取。
知道如何解释这种行为吗?我在手册中找不到任何提示。