TI中文支持网
TI专业的中文技术问题搜集分享网站

zstack DMA传输的BUG,请官方确认!

版本:2.5.1a

描述:使用DMA作为串口输出,HalUARTPollDMA会轮询DMA状态,但是以下代码中的decr计算发送延时有问题,因为dmaCfg.txShdw的值会跟着HalUARTPollDMA轮询周期进行刷新,导致ST0的值和刷新后的dmaCfg.txShdw的值一直达不到maCfg.txTick的要求,导致DMA触发发送有很长延迟。

if (dmaCfg.txShdwValid)
{
uint8 decr = ST0;
decr -= dmaCfg.txShdw;
if(decr > dmaCfg.txTick )
{
    // No protection for txShdwValid is required
    // because while the shadow was valid, DMA ISR cannot be triggered
    // to cause concurrent access to this variable.
    dmaCfg.txShdwValid = FALSE;
}
}

DMA中断函数中给了dmaCfg.txShdw初始值,但HalUARTPollDMA函数中在以下条件下会不停的刷新(通过调用HalUARTIsrDMA();)

if ((dmaCfg.txIdx[dmaCfg.txSel] != 0) && !HAL_DMA_CH_ARMED(HAL_DMA_CH_TX)
&& !HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX))
{
HAL_EXIT_CRITICAL_SECTION(his);
HalUARTIsrDMA();
}

该现象在低速率波特率下很明显,例如9600波特率经串口发送60个字节,连续发送4次,间隔20ms,240个字节有时候输出延时会到达8~10s,但由于缓存未溢出,倒是不会丢包。

VV:

你的发现是正确的,尤其在波特率低的时候,你需要调整这个值。

one Man:

回复 VV:

那要调为多少才没有延时啊?

赞(0)
未经允许不得转载:TI中文支持网 » zstack DMA传输的BUG,请官方确认!
分享到: 更多 (0)