问题描述
串口发送使用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)) != 0)

该博客探讨了在单片机串口使用DMA发送数据时遇到的卡死问题。当out_buf->wait信号量未释放且get指针指向末尾时,串口无输出。问题源于DMA中断处理函数中回调函数的执行不及时,导致信号量无法释放。解决方案是在中断处理函数开始时先清理中断,确保回调函数能正确配置DMA并释放信号量。
最低0.47元/天 解锁文章
2496

被折叠的 条评论
为什么被折叠?



