Uart dma 接收中断在几分钟后停止接收数据
Uart dma receive interrupt stops receiving data after several minutes
我有一个项目,我使用了 stm32f746g 发现板。它按顺序从 Uart 接收固定大小的数据,并通知应用程序每个数据接收完成,使用 dma 回调(HAL_UART_RxCpltCallback 函数)。它在开始时工作正常,但在 运行 几分钟后,dma 回调停止调用,结果指定的参数值没有得到更新。因为参数也在另一个线程中使用(实际上是一个rtos定义的定时器),我认为这个问题是由于缺乏线程安全性引起的。但我的问题是 ISR 不支持互斥量和信号量,我需要在 dma 回调中保护我的变量,这是一个中断例程。我正在使用 keil rtx 来处理多线程,我使用的定时器是在 rtx 中定义的 osTimer。我该如何处理这个问题?
通常,只有一个线程应该与 ISR 通信。如果多个线程正在访问与 ISR 共享的变量,则您的设计是错误的,需要修复。在 DMA 的情况下,只有一个线程应该访问缓冲区。
您需要保护该线程与 ISR 之间共享的变量——不一定使用 mutex/semaphore,但可能使用更简单的方法,例如保证原子访问(如果可能,最好的解决方案),或者使用许多 ISR 具有不可中断的能力。 。或者只是在访问期间暂时禁用中断,但这可能是不可能的,具体取决于实时要求。
我有一个项目,我使用了 stm32f746g 发现板。它按顺序从 Uart 接收固定大小的数据,并通知应用程序每个数据接收完成,使用 dma 回调(HAL_UART_RxCpltCallback 函数)。它在开始时工作正常,但在 运行 几分钟后,dma 回调停止调用,结果指定的参数值没有得到更新。因为参数也在另一个线程中使用(实际上是一个rtos定义的定时器),我认为这个问题是由于缺乏线程安全性引起的。但我的问题是 ISR 不支持互斥量和信号量,我需要在 dma 回调中保护我的变量,这是一个中断例程。我正在使用 keil rtx 来处理多线程,我使用的定时器是在 rtx 中定义的 osTimer。我该如何处理这个问题?
通常,只有一个线程应该与 ISR 通信。如果多个线程正在访问与 ISR 共享的变量,则您的设计是错误的,需要修复。在 DMA 的情况下,只有一个线程应该访问缓冲区。
您需要保护该线程与 ISR 之间共享的变量——不一定使用 mutex/semaphore,但可能使用更简单的方法,例如保证原子访问(如果可能,最好的解决方案),或者使用许多 ISR 具有不可中断的能力。