Quellcode durchsuchen

freertos: Restore uxPortCompareSet() in ESP32 unicore & make compatible code for ESP32S2Beta

This macro is used in places which expect it to work even without dual core being on.

Still make "mux" functions in FreeRTOS into no-ops as the mux is not needed.
Angus Gratton vor 6 Jahren
Ursprung
Commit
c22965b22c

+ 17 - 1
components/freertos/include/freertos/portmacro.h

@@ -353,13 +353,29 @@ static inline unsigned portENTER_CRITICAL_NESTED(void) {
  * ESP32 (portMUX assertions would fail).
  */
 static inline void uxPortCompareSet(volatile uint32_t *addr, uint32_t compare, uint32_t *set) {
-#ifndef CONFIG_FREERTOS_UNICORE
+#if XCHAL_HAVE_S32C1I
     __asm__ __volatile__ (
         "WSR 	    %2,SCOMPARE1 \n"
         "S32C1I     %0, %1, 0	 \n"
         :"=r"(*set)
         :"r"(addr), "r"(compare), "0"(*set)
         );
+#else
+    // No S32C1I, so do this by disabling and re-enabling interrupts (slower)
+    uint32_t intlevel, old_value;
+    __asm__ __volatile__ ("rsil %0, " XTSTR(XCHAL_EXCM_LEVEL) "\n"
+                          : "=r"(intlevel));
+
+    old_value = *addr;
+    if (old_value == compare) {
+        *addr = *set;
+    }
+
+    __asm__ __volatile__ ("memw \n"
+                          "wsr %0, ps\n"
+                          :: "r"(intlevel));
+
+    *set = old_value;
 #endif
 }
 

+ 6 - 0
components/freertos/portmux_impl.h

@@ -91,16 +91,21 @@
 
 
 static inline bool __attribute__((always_inline)) vPortCPUAcquireMutexIntsDisabled(PORTMUX_AQUIRE_MUX_FN_ARGS) {
+#if !defined(CONFIG_FREERTOS_UNICORE)
 #if defined(CONFIG_SPIRAM)
 	if (esp_ptr_external_ram(mux)) {
 		return vPortCPUAcquireMutexIntsDisabledExtram(PORTMUX_AQUIRE_MUX_FN_CALL_ARGS(mux));
 	}
 #endif
 	return vPortCPUAcquireMutexIntsDisabledInternal(PORTMUX_AQUIRE_MUX_FN_CALL_ARGS(mux));
+#else
+    return true;
+#endif
 }
 
 
 static inline void vPortCPUReleaseMutexIntsDisabled(PORTMUX_RELEASE_MUX_FN_ARGS) {
+#if !defined(CONFIG_FREERTOS_UNICORE)
 #if defined(CONFIG_SPIRAM)
 	if (esp_ptr_external_ram(mux)) {
 		vPortCPUReleaseMutexIntsDisabledExtram(PORTMUX_RELEASE_MUX_FN_CALL_ARGS(mux));
@@ -108,5 +113,6 @@ static inline void vPortCPUReleaseMutexIntsDisabled(PORTMUX_RELEASE_MUX_FN_ARGS)
 	}
 #endif
 	vPortCPUReleaseMutexIntsDisabledInternal(PORTMUX_RELEASE_MUX_FN_CALL_ARGS(mux));
+#endif
 }