]> granicus.if.org Git - esp-idf/commitdiff
pm: prevent interrupt nesting during esp_pm_impl_isr_hook
authorIvan Grokhotkov <ivan@espressif.com>
Tue, 9 Apr 2019 05:25:24 +0000 (13:25 +0800)
committerbot <bot@espressif.com>
Wed, 17 Apr 2019 07:13:52 +0000 (07:13 +0000)
Follows the approach proposed in https://github.com/espressif/esp-idf/pull/3110,
but masks the interrupts during the entire ISR hook, not only during
leave_idle. Interrupt nesting during update_ccompare may also cause
issues.

Closes https://github.com/espressif/esp-idf/issues/3057

components/esp32/pm_esp32.c

index 9a6feaa5a5680c531fd85a5c6fa63082739d2486..e0c97bf811d5a11b1076e567ea98160cee299f37 100644 (file)
@@ -457,6 +457,10 @@ void IRAM_ATTR esp_pm_impl_isr_hook()
 {
     int core_id = xPortGetCoreID();
     ESP_PM_TRACE_ENTER(ISR_HOOK, core_id);
+    /* Prevent higher level interrupts (than the one this function was called from)
+     * from happening in this section, since they will also call into esp_pm_impl_isr_hook. 
+     */
+    uint32_t state = portENTER_CRITICAL_NESTED();
 #if portNUM_PROCESSORS == 2
     if (s_need_update_ccompare[core_id]) {
         update_ccompare();
@@ -467,6 +471,7 @@ void IRAM_ATTR esp_pm_impl_isr_hook()
 #else
     leave_idle();
 #endif // portNUM_PROCESSORS == 2
+    portEXIT_CRITICAL_NESTED(state);
     ESP_PM_TRACE_EXIT(ISR_HOOK, core_id);
 }