工具/软件:
您好的团队、
当我使用 UDMA 4 通道传输 1M 数据时、偶尔会遇到向队列提交 TRPD 请求的问题。 故障次数过多后,这部分代码将无法运行,问题只在高温下运行,而且很难重现,是什么原因引起问题,以及如何避免问题? 以下是我的操作方式:
int8_t bsp_udma_multi_ch_copy_data_func(uint8_t *destBuf, uint8_t *srcBuf, uint32_t width, uint32_t height)
{
int8_t l_int8_ret = 0;
int32_t l_int32_status = 0, l_int32_i = 0;
uint32_t l_u32_length = UDMA_TEST_NUM_BYTES, l_u32_addr_offset = UDMA_CHANNEL_ADDR_OFFSET;
udma_config_info_type *l_udma_multi_ch_config_info = NULL;
uint8_t *l_pu8_dst_buf = (uint8_t *)destBuf;
uint8_t *l_pu8_src_buf = (uint8_t *)srcBuf;
/* check size */
l_u32_length = width * height;
if (l_u32_length <= UDMA_TEST_NUM_BYTES)
{
l_u32_length = UDMA_TEST_NUM_BYTES;
l_u32_addr_offset = 0x2000; // 32K四等分
}
/* init */
g_udma_channel_complete_cnt = 0;
for (l_int32_i = 0; l_int32_i < UDMA_CHANNEL_NUM; l_int32_i++)
{
l_udma_multi_ch_config_info = &g_udma_multi_ch_config_info[l_int32_i];
/* set address */
l_pu8_dst_buf = (uint8_t *)(destBuf + l_u32_addr_offset * l_int32_i);
l_pu8_src_buf = (uint8_t *)(srcBuf + l_u32_addr_offset * l_int32_i);
/* Init buffers and TR packet descriptor */
bsp_udma_trpd_init(l_udma_multi_ch_config_info->chHandle, l_udma_multi_ch_config_info->trpdMem, l_pu8_dst_buf, l_pu8_src_buf, l_u32_length);
/* Submit TRPD to channel */
l_int32_status = Udma_ringQueueRaw(Udma_chGetFqRingHandle(l_udma_multi_ch_config_info->chHandle), l_udma_multi_ch_config_info->trpdMemPhy);
if (l_int32_status != UDMA_SOK)
{
l_int8_ret = 1;
}
}
l_udma_multi_ch_config_info = &g_udma_multi_ch_config_info[0];
/* Wait for return descriptor in completion ring - this marks transfer completion */
SemaphoreP_pend(&l_udma_multi_ch_config_info->udma_done_sem, 10); // SystemP_WAIT_FOREVER
for (l_int32_i = 0; l_int32_i < UDMA_CHANNEL_NUM; l_int32_i++)
{
l_udma_multi_ch_config_info = &g_udma_multi_ch_config_info[l_int32_i];
l_int32_status = Udma_ringDequeueRaw(Udma_chGetCqRingHandle(l_udma_multi_ch_config_info->chHandle), &l_udma_multi_ch_config_info->pDesc);
if (l_int32_status != UDMA_SOK)
{
l_int8_ret = 2;
}
// /* Check TR response status */
// CacheP_inv(l_udma_multi_ch_config_info->trpdMem, UDMA_TEST_TRPD_SIZE, CacheP_TYPE_ALLD);
// l_int32_status = UdmaUtils_getTrpdTr15Response(l_udma_multi_ch_config_info->trpdMem, 1U, 0U);
// if (l_int32_status != CSL_UDMAP_TR_RESPONSE_STATUS_COMPLETE)
// {
// LOG_PRINT("[warn]l_int32_status:%d\r\n", l_int32_status);
// }
}
return l_int8_ret;
}
我应该采取哪些措施来确保 UDMA 正常工作? 谢谢。
此致
