]> granicus.if.org Git - esp-idf/commitdiff
spi: fix a possible concurrency issue
authorMichael (XIAO Xufeng) <xiaoxufeng@espressif.com>
Fri, 31 May 2019 07:23:10 +0000 (15:23 +0800)
committerMichael (XIAO Xufeng) <xiaoxufeng@espressif.com>
Wed, 19 Jun 2019 04:44:24 +0000 (12:44 +0800)
components/driver/spi_slave.c

index 02dd587df96fffbdfdbc8272e5fcbf1aa3de0934..82fc99c10b99215afaf323d5f1025118089cacf9 100644 (file)
@@ -467,12 +467,14 @@ static void SPI_SLAVE_ISR_ATTR spi_intr(void *arg)
         }
     }
 
+    //Disable interrupt before checking to avoid concurrency issue.
+    esp_intr_disable(host->intr);
     //Grab next transaction
     r = xQueueReceiveFromISR(host->trans_queue, &trans, &do_yield);
-    if (!r) {
-        //No packet waiting. Disable interrupt.
-        esp_intr_disable(host->intr);
-    } else {
+    if (r) {
+        //enable the interrupt again if there is packet to send
+        esp_intr_enable(host->intr);
+
         //We have a transaction. Send it.
         host->hw->slave.trans_done = 0; //clear int bit
         host->cur_trans = trans;