Просмотр исходного кода

spi_flash(new driver): Add vTaskDelay while a long erasing

KonstantinKondrashov 5 лет назад
Родитель
Сommit
a128eae7b8
1 измененных файлов с 17 добавлено и 1 удалено
  1. 17 1
      components/spi_flash/esp_flash_api.c

+ 17 - 1
components/spi_flash/esp_flash_api.c

@@ -23,6 +23,9 @@
 #include "sdkconfig.h"
 #include "esp_heap_caps.h"
 #include "esp_flash_internal.h"
+#include <freertos/FreeRTOS.h>
+#include <freertos/task.h>
+#include "esp_timer.h"
 
 static const char TAG[] = "spi_flash";
 
@@ -337,8 +340,13 @@ esp_err_t IRAM_ATTR esp_flash_erase_region(esp_flash_t *chip, uint32_t start, ui
         err = spiflash_end(chip, err);
     }
 
-
+#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
+    int64_t no_yield_time_us = 0;
+#endif
     while (err == ESP_OK && len >= sector_size) {
+#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
+        int64_t start_time_us = esp_timer_get_time();
+#endif
         err = spiflash_start(chip);
         if (err != ESP_OK) {
             return err;
@@ -358,6 +366,14 @@ esp_err_t IRAM_ATTR esp_flash_erase_region(esp_flash_t *chip, uint32_t start, ui
         }
 
         err = spiflash_end(chip, err);
+
+#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
+        no_yield_time_us += (esp_timer_get_time() - start_time_us);
+        if (no_yield_time_us / 1000 >= CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS) {
+            no_yield_time_us = 0;
+            vTaskDelay(CONFIG_SPI_FLASH_ERASE_YIELD_TICKS);
+        }
+#endif
     }
     return err;
 }