器件型号: TMDS64EVM
在的当前实现中 UART_lld_dmaDisableChannel、调用后 Udma_chDisable、代码使用循环执行空闲队列描述符的刷新:
while (temp == true)
{
uint64_t pDesc;
int32_t tempRetVal;
tempRetVal = UDMA_ringFlushRaw (
UDMA_chGetFqRingHandle (chHandle)、&pDesc);
IF (UDMA_ETIMEOUT == tempRetVal)
{
TEMP = FALSE;
}
}
此循环将继续调用、 Udma_ringFlushRaw 直到函数返回 UDMA_ETIMEOUT。
问题: 在我的用例中、我需要 在 ISR 上下文中中止 DMA 读取传输。 在 ISR 中运行此循环有问题、因为它会阻塞且耗时‑μ s。
我想了解、 对的单次调用是否 Udma_ringFlushRaw 足以确保通道保持一致的状态、或者跳过循环是否可能导致问题(例如,未发布描述符,内部不一致)。
问题:
-
为什么 SDK 实施会在循环中刷新描述符、直到
ETIMEOUT? -
为了确保正确的通道禁用行为、是否严格需要该环路?
-
在 ISR 上下文中中止 DMA 传输 而不执行这个可能阻塞的循环的建议方法是什么?