Xhe*_*dos 1 assembly arm instruction-set
对于德州仪器的CC3220S,我用C语言开发了一个函数,使用内联汇编等待1秒(不包括循环前和循环外的指令)。根据ARMv7-M 参考手册,针对 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");
}
Run Code Online (Sandbox Code Playgroud)
从你的参考,
周期计数基于具有零等待状态的系统。
从你的来源来看,循环是,
SUBS r4, #1 /* 1 cycle */
ITE NEQ /* 1 cycle */
MOV pc, r5 /* 4 cycles */
Run Code Online (Sandbox Code Playgroud)
假设编译器没有插入额外的代码,当重新填充指令管道时,你的内存可以是 2 个等待状态。此外,供应商可以修改内核并且不需要满足此时序要求。一些供应商许可“架构”并设计实现指令集的逻辑。其他购买实现 Cortex-M4 的逻辑块。我猜 TI 是后者,内存等待状态是你的问题。您没有注意您的代码位于哪个存储设备中。如果您的系统使用“串行闪存”,那么两个等待状态的额外延迟一点也不奇怪。这将使循环计数达到 8,这就是您观察到的。
因此我的问题是,从 ARM 购买 IP 的半导体制造商是否应该满足参考手册中描述的指令的时钟周期?
上面的答案是否定的。如果他们是架构许可证持有者,则周期计数可能会有所不同。它们需要是二进制兼容的(但即使情况并非总是如此)。但是,在您的情况下,我相信他们正在满足文档,只需通过计算内存等待状态将其完全应用于用例即可。板载 SRAM 也可以具有等待状态。通常只有 TCM 处于零等待状态。