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

时间:2018-09-17 09:59:28

标签: mutex semaphore uart dma stm32f7

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

1 个答案:

答案 0 :(得分:2)

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

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