对于德州仪器(TI)制造的CC3220S,我开发了一种使用C编程语言的函数,该函数使用内联汇编等待1秒(不包括循环之前和循环外部的指令)。根据ARMv7-M reference manual,针对PC的MOV指令占用1 + P指令周期,其中P在1和3之间,取决于流水线的重新填充。最坏的情况意味着循环将在6个时钟周期内执行。
CC3220S的时钟速度为80 MHz。但是,执行1000万次循环会产生所需的1秒延迟(已通过逻辑分析仪验证)。这意味着该循环使用8个时钟周期。我对该指令使用的时钟周期数量感到怀疑。因此,我的问题是,从ARM购买IP的半导体制造商是否应满足参考手册中描述的指令的时钟周期?
void delay_1sec(void)
{
__asm(" PUSH {r4-r5,lr}");
__asm(" LDR r4, [pc, #12]");
__asm(" MOV r5, pc");
__asm(" NOP");
__asm(" SUBS r4, #1"); /* 1 instruction cycle */
__asm(" ITE NEQ"); /* 1 instruction cycle */
__asm(" MOV pc, r5"); /* 1 + P instructions (where P is between 1 and 3 depending on pipeline refill) */
__asm(" POP {r4-r5,pc}");
__asm(" .word 10000000");
}
根据您的参考,
周期计数基于等待状态为零的系统。
从您的来源看,循环是,
SUBS r4, #1 /* 1 cycle */
ITE NEQ /* 1 cycle */
MOV pc, r5 /* 4 cycles */
假设编译器未插入其他代码,则在重新填充指令管道时,您的内存可以处于2个等待状态。另外,供应商可以修改内核,而无需满足此时序要求。一些供应商许可“架构”并设计用于实现指令集的逻辑。其他人则购买实现Cortex-M4的逻辑块。我想TI会晚一些,而内存等待状态就是您的问题。您没有注意到代码位于哪个存储设备中。如果您的系统使用“串行闪存”,则两个等待状态的额外延迟根本就不足为奇。这会将周期数增加到8,这就是您观察到的。
因此,我的问题是,从ARM购买IP的半导体制造商是否应满足参考手册中描述的指令的时钟周期?
从上面的答案是否定的。如果它们是体系结构被许可方,则周期数可能会有所不同。它们需要是二进制兼容的(但并非总是如此)。但是,对于您而言,我认为他们正在满足文档,只需通过计算内存等待状态即可将其完全应用于用例。板载SRAM也可能具有等待状态。通常只有TCM为零等待状态。