问题描述
串口发送使用DMA出现卡死的问题,串口无输出,out_buf->wait信号量未释放,out_buf的get指针指向末尾
原因分析:
DMA本次搬运完,在中断处理函数中调用对应的回调函数,在回调函数里进行buf指针的调整,若还有剩余数据则配置DMA继续搬运
out_buf的get指针指向末尾时,DMA下次搬运数据量较少,很快完成,本次进入DMA中断处理函数中没有及时清理中断,导致下一次中断到来时一起被清理,无法进入callback函数,释放out_buf->wait信号量,此时任务中再次调用serial_write时卡死
解决方案:
将清理中断调整到回调函数之前,进入中断处理函数先清理中断,再在回调函数中配置DMA,dma_isr中部分代码如下
if ((val32 & (0x1 << DMAC_INT_STATUS_TFR_BIT))