工具/软件:
-
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++;
}

