【问题标题】:Uart dma receive interrupt stops receiving data after several minutesUart dma 接收中断在几分钟后停止接收数据
【发布时间】:2019-02-21 05:25:09
【问题描述】:

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

【问题讨论】:

    标签: mutex semaphore uart dma stm32f7


    【解决方案1】:

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

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

    【讨论】:

    • 我会试试你的解决方案。
    • 我通过使用 bool 变量处理了 ISR 和计时器函数原子化的问题,因此该参数每次都被一个线程使用。
    猜你喜欢
    • 2012-10-12
    • 2015-09-18
    • 2018-01-18
    • 2022-08-23
    • 2021-09-06
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多