Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 从ARM购买IP的半导体制造商是否应满足参考手册中所述说明的时钟周期?_Assembly_Arm_Instruction Set - Fatal编程技术网

Assembly 从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的半

对于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之间的差异应该不会很大,但仍然很明显。