我有,我已经使用stm32f746g发现板的项目。 它接收的数据与来自顺序的Uart固定大小和有关每个数据接收完成,则使用DMA回调(HAL_UART_RxCpltCallback函数),以通知应用程序。 它工作正常,在开始,但在运行几分钟后,DMA回调停下来被调用,其结果是,指定的参数值没有更新。 因为该参数在另一个线程中使用过(实际上是一个RTOS定义定时器),我相信这个问题是由缺乏线程安全性造成的。 但我的问题是,互斥和信号灯不中断服务程序的支持,我需要保护我的变量在DMA回调是在中断程序。 我用Keil RTX来处理多线程和我用的计时器是在RTX定义osTimer。 我该如何处理这个问题?
Answer 1:
一般情况下,只有一个线程应与ISR通信。 如果多个线程正在访问与ISR共享的变量,你的设计是错误的,需要加以固定。 在DMA的情况下,只有一个线程应访问缓冲区。
你需要保护这些线程和ISR之间共享的变量 - 不一定用互斥锁/信号,但也许更简单的东西像保证原子访问(如果可能的话最好的解决方案),或使用非interrruptable abilitiy很多的ISR有。 例如,对于简单,单线程MCU应用 。 或者访问期间只是暂时禁止中断,但是这是不可能的,这取决于实时性要求。
文章来源: Uart dma receive interrupt stops receiving data after several minutes