Arm 重复一条指令一定次数,但不带“";循环“;?

Arm 重复一条指令一定次数,但不带“";循环“;?,arm,embedded,stm32,stm32f4,Arm,Embedded,Stm32,Stm32f4,我以前用过图片,现在用的是STM32F415。 在我的代码中的一个时间关键部分,我需要放置一个非常精确的延迟来调整DAC-DMA的周期,这些DAC-DMA一起工作以创建周期性模拟信号 我想增加的延迟是从0到63个时钟周期(如果我能做10到63个时钟周期,也可以)。在PIC24F汇编中,有一条指令“REPEAT”,允许我将下一条指令重复一定次数。这对我来说非常有用,因为我可以做到: REPEAT #0xNUMBER NOP 我试图找到与STM32F4类似的东西,但我没有在说明集、参考手册和互联网

我以前用过图片,现在用的是STM32F415。 在我的代码中的一个时间关键部分,我需要放置一个非常精确的延迟来调整DAC-DMA的周期,这些DAC-DMA一起工作以创建周期性模拟信号

我想增加的延迟是从0到63个时钟周期(如果我能做10到63个时钟周期,也可以)。在PIC24F汇编中,有一条指令“REPEAT”,允许我将下一条指令重复一定次数。这对我来说非常有用,因为我可以做到:

REPEAT #0xNUMBER
NOP
我试图找到与STM32F4类似的东西,但我没有在说明集、参考手册和互联网上找到

我已经尝试使用C中的for/while循环和专用于它的计时器,但是额外的指令OSN需要消耗太多的时间(40-50个周期,取决于我的编程方式)

如果有人有一个想法或者知道如何去做,这对我来说是非常有用的

非常感谢

英语不是我的母语,所以我为可能出现的错误感到抱歉。让我知道,我会努力改进:)

编辑1(2017年7月23日)

感谢大家的回答,我一直很忙,无法单独回答你们每个人。 我将尝试门控时钟的@berendi解决方案,它似乎最适合我的应用。
我学到了很多关于STM32的东西,我不知道,谢谢大家

NOP不是一个很好的延迟解决方案。使用barrier指令,因为执行时间与ARM文档中的规定完全相同(3、4或5个周期,取决于指令和核心版本)。您可以放置n个连续的屏障来归档所需的延迟

对于延迟,NOP不是一个很好的解决方案。使用barrier指令,因为执行时间与ARM文档中的规定完全相同(3、4或5个周期,取决于指令和核心版本)。您可以连续放置n个屏障来归档所需的延迟

我停止使de DMA-DAC工作的计时器,进行延迟,然后 再次启用它

所以,如果我理解正确的话,你有一个定时器控制你的DAC,在每个计数器溢出时触发一个转换,你想把它延迟一个可变的时钟周期

STM32F4的大多数(如果不是全部)计时器支持门控模式从操作,您可以选择另一个计时器(计时器B)作为主计时器,并且计时器a仅在计时器B的触发输出低时计数。换句话说,计时器A将停止从计时器B开始的上升沿计数,并在下降沿继续计数。现在,将定时器B配置为在启用时输出一个单脉冲,其中脉冲宽度是您想要的延迟,然后定时器a将延迟脉冲的确切持续时间

请参阅参考手册中有关单脉冲模式、定时器和外部触发同步的章节,以及CR1、CR2和SMCR寄存器的说明

我停止使de DMA-DAC工作的计时器,进行延迟,然后 再次启用它

所以,如果我理解正确的话,你有一个定时器控制你的DAC,在每个计数器溢出时触发一个转换,你想把它延迟一个可变的时钟周期

STM32F4的大多数(如果不是全部)计时器支持门控模式从操作,您可以选择另一个计时器(计时器B)作为主计时器,并且计时器a仅在计时器B的触发输出低时计数。换句话说,计时器A将停止从计时器B开始的上升沿计数,并在下降沿继续计数。现在,将定时器B配置为在启用时输出一个单脉冲,其中脉冲宽度是您想要的延迟,然后定时器a将延迟脉冲的确切持续时间


请参阅参考手册中关于单脉冲模式、定时器和外部触发同步的章节,以及CR1、CR2和SMCR寄存器的说明。

在PIC上,您可以这样做,这是一种非常常见的解决方案,执行时间是确定的。像这样的外部架构,以及同样具有确定性(克隆出现之前)的旧芯片也可以。但一般来说,延迟不是这样的,它不是确定性的,你可以得到一个“至少这么长”的调谐循环,但你不能得到“正好这么长”甚至调谐,或者永远不应该期望。这就是为什么在mcu设计中有计时器,通常是多个,这就是你用来测量时间的原因。对于您试图解决的问题,这就是这里的解决方案,一个计时器或级联计时器(如果您确实需要)

Arm没有类似x86的重复指令最小的循环将是两条指令,我已经无数次地证明,在同一个芯片上,这个循环的速度会有所不同,所以调整它,添加一行代码,这个循环的延迟特性就会改变

here:
  sub r0,#1
  bne here
对于经典(gas)语法,对于统一语法,使用sub而不是sub


您也在stm32上,在指令端有一个隐藏的缓存,您无法关闭或控制,它通常不会给您任何等待状态性能,当然对于这样的事情,但显然他们没有闪存大小的缓存,因此必须在某个地方进行预取周期,当你跳入这个循环时,有时你会感觉到预回迁。在PIC上你可以这样做,这是一个非常常见的解决方案,执行时间是确定的。像这样的外部架构,以及同样具有确定性(克隆出现之前)的旧芯片也可以。但一般来说,延迟不是这样的,它不是确定性的,你可以得到一个“至少这么长”的调谐循环,但你不能得到“正好这么长”甚至调谐,或者永远不应该期望。Tha