ソースを参照

sdio_slave: fixed the issue that interrupt may be cleared with finished trans unhandled

Michael (XIAO Xufeng) 5 年 前
コミット
4d2bb1e7ec
1 ファイル変更4 行追加2 行削除
  1. 4 2
      components/driver/sdio_slave.c

+ 4 - 2
components/driver/sdio_slave.c

@@ -701,7 +701,8 @@ static esp_err_t recv_flush_data(void)
 static void sdio_intr_recv(void *arg)
 {
     portBASE_TYPE yield = 0;
-    while (sdio_slave_hal_recv_done(context.hal)) {
+    bool triggered = sdio_slave_hal_recv_done(context.hal);
+    while (triggered) {
         portENTER_CRITICAL_ISR(&context.recv_spinlock);
         bool has_next_item = sdio_slave_hal_recv_has_next_item(context.hal);
         portEXIT_CRITICAL_ISR(&context.recv_spinlock);
@@ -710,8 +711,9 @@ static void sdio_intr_recv(void *arg)
             xSemaphoreGiveFromISR(context.recv_event, &yield);
             continue;   //check the linked list again skip the interrupt checking
         }
-        // if no more items on the list, go back and check again the interrupt,
+        // if no more items on the list, check the interrupt again,
         // will loop until the interrupt bit is kept cleared.
+        triggered = sdio_slave_hal_recv_done(context.hal);
     }
     if (yield) {
         portYIELD_FROM_ISR();