Uart dma接收中断在几分钟后停止接收数据

问题描述 投票:0回答:1

我有一个项目,我使用了stm32f746g发现板。它从Uart顺序接收固定大小的数据,并通知应用程序每个数据接收完成,使用dma回调(HAL_UART_RxCpltCallback函数)。它在开始时工作正常,但运行几分钟后,dma回调停止被调用,因此,指定的参数值不会更新。因为参数也在另一个线程中使用(实际上是一个rtos定义的计时器),我相信这个问题是由缺乏线程安全性引起的。但我的问题是ISR中不支持互斥和信号量,我需要在dma回调中保护我的变量,这是一个中断例程。我使用keil rtx来处理多线程,我使用的计时器是在rtx中定义的osTimer。我该如何处理这个问题?

mutex semaphore uart dma stm32f7
1个回答
2
投票

通常,只有一个线程应与ISR通信。如果多个线程正在访问与ISR共享的变量,那么您的设计是错误的并且需要修复。在DMA的情况下,只有一个线程应该访问缓冲区。

你需要保护在该线程和ISR之间共享的变量 - 不一定要使用互斥锁/信号量,但可能使用更简单的东西,如保证原子访问(如果可能的话,最好的解决方案),或者使用不可中断的许多ISR有。 Example for simple, single-threaded MCU applications。或者只是暂时禁用访问期间的中断,但这可能无法实现,具体取决于实时要求。

© www.soinside.com 2019 - 2024. All rights reserved.