Assembly 从ARM购买IP的半导体制造商是否应满足参考手册中所述说明的时钟周期?
对于Texas Instruments制造的CC3220,我用C编程语言开发了一个函数,它使用内联汇编等待1秒,不包括循环前和循环外的指令。 根据,针对PC的MOV指令采用1+P指令周期,其中P介于1和3之间,具体取决于管道重新填充。 最坏的情况是,这意味着循环以6个时钟周期执行 CC3220的时钟速度为80 MHz。但是,执行循环1000万次会产生1秒的期望延迟,并通过逻辑分析仪进行验证。 这意味着循环使用8个时钟周期。 我对指令使用的时钟周期量有疑问。 因此,我的问题是,从ARM购买IP的半导体制造商是否应该满足参考手册中描述的指令的时钟周期Assembly 从ARM购买IP的半导体制造商是否应满足参考手册中所述说明的时钟周期?,assembly,arm,instruction-set,Assembly,Arm,Instruction Set,对于Texas Instruments制造的CC3220,我用C编程语言开发了一个函数,它使用内联汇编等待1秒,不包括循环前和循环外的指令。 根据,针对PC的MOV指令采用1+P指令周期,其中P介于1和3之间,具体取决于管道重新填充。 最坏的情况是,这意味着循环以6个时钟周期执行 CC3220的时钟速度为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 */
假设编译器不插入其他代码,则在重新填充指令管道时,内存可能处于两种等待状态。此外,供应商可以修改核心,不需要满足此时间要求。一些供应商授权“架构”并设计实现指令集的逻辑。其他人则购买实现Cortex-M4的逻辑块。我猜TI是较晚的,内存等待状态是您的问题。您没有注意到代码所在的内存设备。如果您的系统使用“串行闪存”,两个等待状态的额外延迟将毫不奇怪。这将使循环计数达到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");
}
从上面看,答案是否定的。如果他们是架构许可证持有人,则周期计数可能不同。它们需要二进制兼容,但即使这样也不总是如此。然而,在您的情况下,我相信它们满足了文档的要求,它只需要通过计算内存等待状态来完全应用于用例。车载SRAM也可能具有等待状态。通常只有TCM处于零等待状态。根据您的参考
循环计数基于具有零等待状态的系统
从你的来源来看,循环是
SUBS r4, #1 /* 1 cycle */
ITE NEQ /* 1 cycle */
MOV pc, r5 /* 4 cycles */
假设编译器不插入其他代码,则在重新填充指令管道时,内存可能处于两种等待状态。此外,供应商可以修改核心,不需要满足此时间要求。一些供应商授权“架构”并设计实现指令集的逻辑。其他人则购买实现Cortex-M4的逻辑块。我猜TI是较晚的,内存等待状态是您的问题。您没有注意到代码所在的内存设备。如果您的系统使用“串行闪存”,两个等待状态的额外延迟将毫不奇怪。这将使循环计数达到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");
}
从上面看,答案是否定的。如果他们是架构许可证持有人,则周期计数可能不同。它们需要二进制兼容,但即使这样也不总是如此。然而,在您的情况下,我相信它们满足了文档的要求,它只需要通过计算内存等待状态来完全应用于用例。车载SRAM也可能具有等待状态。通常只有TCM处于零等待状态。IDK是否期望所有ARMv7-M CPU具有相同的性能;似乎不太可能。但与此不同的是:如果要在内联asm中编写整个函数体,包括弹出到PC中的返回指令,请将其_属性_裸体,这样它就不能内联到其他函数中并将其破坏。另外,更喜欢一个大的asm语句。虽然在裸函数中,这是安全的。但事实上,这完全是矫枉过正;只要让编译器在+r var寄存器中输入10000000,在GNU C扩展asm语句中输入另一个=r伪输出即可。Gah,不要像这样使用内联程序集。只需使用一个单独的程序集源文件,这样您就不必拥有所有这些(asm…)。。。;胡说八道,不必担心编译器插入它想要的任何指令。谢谢你的建议,但这与原来的问题太离题了。这不是任何生产代码,而是一种概念证明。@Xhendos很难排除编译器以您编写代码的方式自行插入指令。ARMv7-M是一种体系结构,我在其中找不到任何循环计数。您链接的页面是关于Cortex-M4的,它实现了ARMv7-M,并作为IP销售。我可以这么说
所有基于ARMv7-M的纯ARM Cortex-M将共享相同的核心实现,因此具有相同的循环计数。然而,这并不一定在任何地方都是正确的。您还需要一个80MHz的时钟才能让代码正常工作,这进一步限制了一组处理器。ARMv7-M支持单周期或低计数周期指令,因此完全不同的IMPL之间的差异不应该很大,但仍然很明显。IDK是否期望所有ARMv7-M CPU都具有相同的性能;似乎不太可能。但与此不同的是:如果要在内联asm中编写整个函数体,包括弹出到PC中的返回指令,请将其_属性_裸体,这样它就不能内联到其他函数中并将其破坏。另外,更喜欢一个大的asm语句。虽然在裸函数中,这是安全的。但事实上,这完全是矫枉过正;只要让编译器在+r var寄存器中输入10000000,在GNU C扩展asm语句中输入另一个=r伪输出即可。Gah,不要像这样使用内联程序集。只需使用一个单独的程序集源文件,这样您就不必拥有所有这些(asm…)。。。;胡说八道,不必担心编译器插入它想要的任何指令。谢谢你的建议,但这与原来的问题太离题了。这不是任何生产代码,而是一种概念证明。@Xhendos很难排除编译器以您编写代码的方式自行插入指令。ARMv7-M是一种体系结构,我在其中找不到任何循环计数。您链接的页面是关于Cortex-M4的,它实现了ARMv7-M,并作为IP销售。我要说的是,所有基于ARMv7-M的纯ARM Cortex-M将共享相同的核心实现,因此具有相同的循环计数。然而,这并不一定在任何地方都是正确的。您还需要一个80MHz的时钟才能让代码正常工作,这进一步限制了一组处理器。ARMv7-M支持单个或低计数周期指令,因此完全不同的IMPL之间的差异应该不会很大,但仍然很明显。