This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:困难的问题:从 DMA 中断例程调用的函数

Guru**** 2587365 points
Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/634482/compiler-difficult-question-functions-called-from-dma-interrupt-routine

Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI C/C++编译器

您好!

我注意到一个奇怪的问题:

如果我从 DMA_ISR 函数调用、程序运行缓慢。

为什么?

我知道答案并不简单、但我很好奇、我想准确了解 C5505的功能。

非常感谢您的参与

Paolo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是哪些 SDK 版本?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    C5505 eZdsp、TI 编译器 v4.4.1优化级别3
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    "程序运行缓慢"是什么意思? 您调用的函数是什么? 您是否在代码中使用 DSP/BIOS 或 SYSBIOS 等? DMA_ISR 具有非常高的优先级... 在 DMA_ISR 完成之前,从 DMA_ISR 返回的调用函数是否已完成? 建议不要用大量的处理来阻止 DMA_ISR、而是在另一个任务中执行所有必要的处理、并在可能的情况下使用信标发出该函数的信号。 然后、您的函数仅在 DMA_ISR 完成后激活。 如果您的函数需要在 DMA_ISR 内完成、那么您必须考虑添加到 DMA_ISR 的处理量、而这些处理量应该在较低优先级的任务中执行。 您的 DMA_ISR 可能只收集一些 I2S 数据或类似数据、这通常是超快的、因此您可以始终这样做并将收集的数据存储在缓冲区中、然后在发生另一个 DMA_ISR 中断之前(例如、在 DMA_ISR 完成后)在较低优先级任务中的函数中进行处理。
    我认为您需要更具体地说明在 DMA_ISR 中执行的操作、调用的函数以及是否可以在 DMA_ISR 外部执行该处理等... 否则,如果不了解更具体的情况,就很难说...
    希望这对您有所帮助。
    谢谢、MM
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 M MAR:

    我同意你的看法、我应该更具体一些。 我已经在 C5505 eZdsp 中实施了与 AIC3204编解码器进行 DMA 数据交换的三路缓冲方案,配置(正确)为以192kHz 的速率进行采样。

    我有三个缓冲器、例如 A、B 和 C。算法是:

    当 A 满(中断0x0004)时、我将 B 置于接收状态、将 C 置于传输状态、并详细说明 A 的内容

    当 B 满时、我将 C 置于接收中、将 A 置于传输中、并详细说明 B 的内容

    当 C 满时、我将 A 置于接收状态、将 B 置于传输状态、然后详细说明 C

    ...等等。

    我的问题是、在这些日子里进行调查、详细信息会溢出、并被 DMA 中断中断中断、从而中断我的算法。

    详细说明需要48毫秒(使用 CCS 时钟进行测量、计算周期并将其转换为时间、同时考虑120 MHz CPU 时钟)。 接收缓冲器的采样长度为384个样本、因此、当编解码器以192kHz 的频率交换数据时、填充缓冲器需要2ms。

    我正在尝试找到解决此问题的解决方案。

    如果您有任何想法、我非常感谢

    此致、

    Paolo  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    那么,您说的是每2ms 有 DMA_ISR()中断吗? 这需要是来自 AIC3204 (这是单声道还是立体声?)的连续、不间断的流,实时? 如果您的详细处理需要48ms (确实很长)、并且您需要在下一个中断发生之前完成此导通、那么它会使事情变得非常复杂。 乍一看(不确定)如果 DMA 中断之间只有2ms、您可能需要将"详细阐述"时间缩短到更短的时间。 更高的时钟速率会实现这一目的(或更好地进行阐述)、因为 DMA 中断是由连续编解码器流固定的。 您的编解码器 I2S 时钟是否驱动我假设的 DSP I2S 输入时钟? 它是单声道还是立体声、您没有提到过吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我的编解码器为单声道、仅使用左声道。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此详细说明实现了 Costas 循环 DSBSC 解调器、其中会发生很多非常浮点的运算。 我刚刚尝试减少使用的周期、但还不够。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、如果可能、您可能必须使用32位整数或更高的整数来实现它、以缩短周期时间、然后使用编译器选项进行优化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我尝试一下。
    谢谢
    Paolo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    m MAR、
    为了将浮点型转换为32位整数型计算、您是否有一些建议的示例/提示?

    谢谢
    Paolo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 MMAR、
    另一种解决方法是创建一个高速缓存缓冲器、以便在发生溢出时保持编解码器未详细说明的输入。
    DMA 能否访问外部存储器(EMIF)?
    您对此有何看法?

    提前感谢
    Paolo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Paolo Martinetti]M MAR、
    为了将浮点型转换为32位整数型计算、您是否有一些建议的示例/提示?

    谢谢
    Paolo

    [/报价]

    大家好、这取决于您需要转换多少行代码。 基本上、您必须重新编写基于浮点的计算、以便它们以32位(甚至64位)整数完成。 所有函数都需要转换,但您可能必须注意转换过程中引入的错误(量化等),因为整数不能像浮点那么精确(取决于它们的大小...)。

    如果您使用的是库、则可能会查找已使用整数计算编写的版本、避免将浮点组合在一起、并使它们更快地执行。

    另一个更严厉的措施(如果您有时间和知识、可以选择)是切换到另一个具有浮点协处理器的处理器 DSP。 查看 TI 浮点 DSP (更基本的 DSP)。 它们更昂贵,消耗更多的功率,但会非常非常快地执行浮点...

    谢谢、MM

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 MMAR、

    我有一个想法:

    如果我保持接收到的信号的缓冲器、复杂的传输信号、我将以45毫秒的延迟传输详细的信号、这是可以接受的。

    你怎么看?

    抱歉、我坚持提问、但我是实时编程的新朋友、我需要在不使用功能最强大的 DSP 的情况下解决问题。

    再见

    Paolo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您没有提到应用程序可以接受45ms 的延迟/延迟... 因此,您可以在缓冲区中“保留更长的时间”,并在处理完成时延迟传输,当然,您可以,只需确定可接受的延迟是多少,然后设置上限,比如50ms,以考虑所需的其他处理...

    但是、您确实提到了传输和接收花费的时间与之相比非常少、实际上需要2ms 来执行 DMA 传输。 您应该能够在重新传输'danned'信号的同时进行 DMA 接收传输(在独立的 DMA 通道上、将缓冲器从1交换为2、然后再交换为1到2等)。 只需在 DMA 通道1上继续接收、详细说明接收、在 DMA 通道2上重新传输、不断交换、但未详细说明和重新传输的详细信号之间有50ms 的延迟... 如果您可以接受这种情况(有时延迟对于应用程序来说太大),它将比迁移到另一个平台进行浮点处理要简单得多...

    此致、MM
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我会尝试...
    非常感谢

    Paolo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    MMAr、
    如果我详细说明信号(因此我解调接收到的信号)并以45毫秒的延迟传输信号、我认为通信中不会发生任何情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为您应该进行延迟计算,并确定可接受的内容,因为它可能超过50ms ... 祝你好运、嗯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Paolo Martinetti]MMAr、
    如果我详细说明信号(因此我解调接收到的信号)并以45毫秒的延迟传输信号、我认为通信中不会发生任何情况。

    [/报价]

    您好,根据您所说的内容快速计算:

    DMA 每2ms 传输一次。 这= 1个音频帧= 24 (16位)字节。

    您的处理延迟=最大46ms /2ms 音频帧。

    您必须等待46ms 才能重新传输前2ms 的音频帧。 因此、您所能做的就是依次存储接收到的2ms、所有23个帧(23 x 2ms = 46ms)、因为它们是通过连续 DMA 传输一个接一个地接收到的、因为 DMA 将在不加载处理器的情况下为您执行此操作。 这将需要至少192000 / 16 x 0、002 x 23 = 552个字的存储(使用高速 DRAM 进行此操作)才能进行接收。

    您获取每个接收到的帧,然后依次开始处理序列1、2、3...23,然后将每个结果存储在另一组输出缓冲区1、2、3...中。 23同样按顺序、仅在所有23个输入音频帧均已处理后才可传输。

    当您处理完所有23个输入音频帧后、这将花费23 x 46ms = 1058ms。 然后,您可以开始按顺序1、2、3传输输出缓冲器(输出音频帧)... 23等

    在您继续接收下一组输入音频帧并将它们存储在23个接收器缓冲阵列中的平均时间内,现在它们是帧24、25、26 ... 46,并且也开始处理等...等等... 等等...

    遗憾的是、您的实际延迟看起来更像是1、058ms 秒左右。 这可能会给您的应用带来太多的延迟。 最终、您只能通过将46ms 的处理延迟减少为20ms 或10ms 或更短来降低此延迟。

    希望这对您有所帮助。

    毫米

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是 MMAR、
    昨天,我的理由是你所做的那样,得出了同样的结论。 我完全同意您的意见、我将按照您的建议尝试优化、从浮点运算传递到 int32运算。 我注意到、trig 函数 sin、cos 和 atan2在其参数的浮点格式中非常"饿" CPU 周期。 此外、FP 运算(简单的加法和乘法)也会消耗很多。 我学到了很多、但很难。 现在、我尝试使用 Int32格式创建一个 sin、cos、atan2。 我在将 float 转换为 Q31方面也有一些困难...但了解这些参数非常具有挑战性。 很明显、如果您有任何提示、我很高兴听从您的建议。

    再次感谢、MMAR!

    此致、
    Paolo

    P.S. DSPLIB 对我的问题帮助不大。