gpt4 book ai didi

arm - 补偿ARM中断的延迟?

转载 作者:行者123 更新时间:2023-12-03 19:10:16 26 4
gpt4 key购买 nike

我正在 STM32F4 CPU 上进行一个项目,生成信号。

我在 STM32 上的 CPU 时钟上有一个通用定时器(无预分频器),在溢出时触发中断,然后用 GPIO 生成周期性信号。

我需要在非常精确的时间触发 thr GPIO(基本上低至一个 CPU 周期精度)。我已经通过设置优先级和 al 设法将这种抖动减少到 +-5 个周期,但是这种抖动存在,这取决于 CPU 正在做什么。

我需要补偿这几个周期抖动。只要我在精确的时间切换 GPIO,增加几个周期的延迟就不是问题。

我的想法是读取计数器的当前值,并有一个 FIXED_NUMBER-CURRENT_VALUE 时间的事件循环,确保我会在精确的时间退出循环。

然而,在 C 中做一个简单的循环 - 作为一个 FOR 循环,或者 while(counter->value < TARGET) 不起作用,因为它增加了抖动而不是减少它。

我做错了什么/天真吗?我应该在组装时这样做吗?这与 C 有什么不同(我用 GCC 检查了反汇编以检查循环没有被优化,也没有达到内存?)

(我确保使用空的,未优化但未命中内存循环体)

编辑:在 AVR 上查看此示例(我知道更稳定) 查看示例 http://lucidscience.com/pro-vga%20video%20generator-7.aspx (搜索“抖动”)

edit2:我在汇编中尝试了一个简单的循环,例如(r0 是我的计数器,要等待的周期数,在寄存器中)

loop : SUBS r0,#1 ; tried with 2 also
BGE loop

同样,没有它,抖动会更好。

总而言之,我已经知道我应该延迟多少。我只需要一种方法,让一个代码分支在一个案例中可靠地消耗 N 个周期,而在另一个案例中消耗 M 个周期。不幸的是,单独的分支似乎不起作用,因为管道重新填充似乎并不需要可靠数量的周期,而条件表达式也不会,因为它们总是采用相同数量的周期(有时什么都不做)。

从 RAM 而不是闪存运行会提高一致性吗? (NB stm32f4 有一个闪存预取..)

最佳答案

(讽刺的是,一个关于减少响应延迟的问题花了三年时间才得到答案。)

+/- 5 个周期听起来非常熟悉。在中断调度期间,您可能会遇到访问 Flash Controller 的等待状态。

CPU在中断调度期间需要做三件事:

  • 加载向量表条目。
  • 加载中断例程的初始代码。
  • 将一些寄存器写入堆栈。

  • 如果您的向量表和/或中断例程代码在 Flash 中,则第 1 项和第 2 项中的提取将转到 Flash。当 CPU 以最高额定速度(高达 168MHz)运行时,对闪存的访问需要五个等待状态。这意味着对 Flash 的访问可能需要 1 或 6 个周期,具体取决于所请求的数据是否在 Flash 缓存中。如果您恰好看到 0 或 5 个周期的延迟,这可能是罪魁祸首。通过将 ISR 代码和向量表移动到 RAM 中,最容易解决这个问题。您还可以通过禁用 Flash 缓存来“修复”它,这将导致 Flash 访问速度缓慢。

    还有一个更狡猾的因素也可能会困扰您:如果被中断的代码也在使用 Flash,则中断调度可能必须等待其 Flash 访问完成,假设它错过了缓存。您也可以通过将中断的代码移动到 RAM 中来解决这个问题,但此时它开始听起来好像没有任何东西存在于 Flash 中。有一种方法可以将代码保存在我下面提到的 Flash 中。

    最后,还有一件更狡猾的事情:如果您在延迟敏感中断之前可能发生其他中断,由于 tail chaining,该中断有可能获得 -5 个周期的延迟。 .

    我列出的后两个问题的解决方案有点奇怪:确保处理器处于空闲状态,即当您的中断发生时,不接受另一个中断或从 Flash 中获取。我这样做的方法是配置一个较低优先级的中断,使其在我的延迟敏感中断之前到达(使用计时器); ISR 只是执行一条等待中断指令, wfi .

    这些都是可以克服的问题。我不同意评论者说你需要放弃 C 并用汇编语言编写;我的 m4vgalib系统几乎不含汇编语言,抖动非常低。

    我在 one section of an article on my blog 中更详细地讨论了这些非常相同的问题和我的解决方案。 .

    关于arm - 补偿ARM中断的延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12371064/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com