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.

[参考译文] AM2754-Q1:McASP&&&cycle_get 位于 r5f 内核中

Guru**** 2539500 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1561914/am2754-q1-mcasp-cycle_get-in-r5f-core

器件型号:AM2754-Q1


工具/软件:

  1. R5F 中的 CycleCounterP_getCount32

McASP 程序在 am275x r5f0-1 内核上运行。 此时、

int soc_clk = SOC_getSelfCpuClk ();

调用此函数会显示 soc_clk = 800MHz。

McASP DMA 模式的配置如下图所示。

mcasp1.$name                                   = "CONFIG_MCASP0";
mcasp1.enableLoopback                          = false;
mcasp1.skipDriverOpen                          = true;
mcasp1.TxMode                                  = "TDM";
mcasp1.NumTxSlots                              = 16;
mcasp1.txDataDelay                             = 0;
mcasp1.txFsWidth                               = 0;
mcasp1.txFsPolarity                            = 0;
mcasp1.txDataMask                              = 0xFFFFFFFF;
mcasp1.txActiveSlotMask                        = 0xFFFF;
mcasp1.txCallbackFxn                           = "mcasp_txcb";
mcasp1.txLoopjobBufLength                      = 2048;
mcasp1.txFsSource                              = 0;
mcasp1.txAclkSource                            = 0;
mcasp1.RxMode                                  = "TDM";
mcasp1.NumRxSlots                              = 16;
mcasp1.rxDataDelay                             = 0;
mcasp1.rxFsWidth                               = 0;
mcasp1.rxFsPolarity                            = 0;
mcasp1.rxDataMask                              = 0xFFFFFFFF;
mcasp1.rxActiveSlotMask                        = 0xFFFF;
mcasp1.rxCallbackFxn                           = "mcasp_rxcb";
mcasp1.rxFsSource                              = 0;
mcasp1.rxAclkSource                            = 0;
mcasp1.rxLoopjobBufLength                      = 2048;
mcasp1.MCASP.$assignAllowConflicts             = "MCASP2";
mcasp1.MCASP.AFSX.$assign                      = "MCASP2_AFSX";
mcasp1.MCASP.ACLKX.$assign                     = "MCASP2_ACLKX";
mcasp1.MCASP.AFSR.$assign                      = "MCASP4_AXR2";
mcasp1.MCASP.ACLKR.$assign                     = "MCASP4_AXR1";
mcasp1.CLOCKING.$assignAllowConflicts          = "CLOCKING";
mcasp1.mcaspSer.create(2);
mcasp1.mcaspSer[0].$name                       = "CONFIG_MCASP_SER0";
mcasp1.mcaspSer[0].MCASP.$assignAllowConflicts = "MCASP2";
mcasp1.mcaspSer[0].MCASP.AXR0.$assign          = "MCASP2_AXR0";
mcasp1.mcaspSer[1].$name                       = "CONFIG_MCASP_SER1";
mcasp1.mcaspSer[1].serNum                      = 2;
mcasp1.mcaspSer[1].dataDir                     = "Receive";
mcasp1.mcaspSer[1].MCASP.$assignAllowConflicts = "MCASP2";
mcasp1.mcaspSer[1].MCASP.AXR2.$assign          = "MCASP2_AXR2";

因此、对于 McASP recv、每 32 点块大小就会为 McASP_rxcb 生成一个 DMA 中断。

此时、我们测量每次中断之间的时间间隔(周期)。

最后、在调试测试期间、我们发现 cyc2(即每个中断之间的周期)大约为 120,000 个周期。

不过、理论上、每个 McASP DMA 接收中断的周期间隔应为:

32 (block_size)/ 48000 (sample_freq)* 800000000 (soc_clk)= 533333。

那么、CycleCounterP_getCount32 函数中周期的基准测试是什么?配置问题可能出在哪里?

void mcasp_rxcb(MCASP_Handle handle,
                          MCASP_Transaction *transaction)
{
    cyc0 = CycleCounterP_getCount32();
    cyc2 = cyc0 - cyc1;
    if(cyc_min > cyc2)
    {
        cyc_min = cyc2;
    }
    cyc1 = cyc0;
    SemaphoreP_post(&a2b_rx_sem);
    a2b_rx_cnt++;
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、雨天、

    感谢您的查询。 我正在研究它,并将在几天内回到你身边。

    此致、
    Ritapravo

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

    嗨、雨天、

    我将 TDM8 与音频缓冲器 2048 字节一起使用、因此块大小为 64 个样本。 64/48000*10000000000 = 1,333,333。 我的 R5F 和 C7x 内核都以 1GHz 的频率运行。 Cyc2 应该是 1,333,000 个周期

    我确实看到 R5F 内核鞋的 cyc2 值不正确(11339 周期):

    C7x 内核时、CPU 中断。 我得到了正确的数字。  

    当我将 rxcbCount 与挂钟一起使用时、得到的 RX 采样率正确为 48kHz、因此 R5F 内核的 CycleCounterP_get32 () 出了问题。 我们将对其进行调查、并回复您。

    此致、

    Ming