]> granicus.if.org Git - esp-idf/commitdiff
FreeRTOS: Convert portMUX_DEBUG to a configuration item
authorAngus Gratton <angus@espressif.com>
Thu, 25 Aug 2016 08:30:47 +0000 (16:30 +0800)
committerAngus Gratton <angus@espressif.com>
Thu, 25 Aug 2016 08:43:59 +0000 (16:43 +0800)
components/freertos/Kconfig
components/freertos/include/freertos/portmacro.h
components/freertos/port.c
components/freertos/tasks.c

index 4c96e2a9cb93e5ceeb1fca7439f3e666ee5c1c88..a9068d1174241d92df77bc451672e0010ba83c62 100644 (file)
@@ -155,4 +155,31 @@ config FREERTOS_BREAK_ON_SCHEDULER_START_JTAG
                If JTAG/OCD is connected, stop execution when the scheduler is started and the first
                task is executed.
 
+menuconfig FREERTOS_DEBUG_INTERNALS
+       bool "Debug FreeRTOS internals"
+       default n
+       help
+               Enable this option to show the menu with internal FreeRTOS debugging features.
+               This option does not change any code by itself, it just shows/hides some options.
+
+if FREERTOS_DEBUG_INTERNALS
+
+config FREERTOS_PORTMUX_DEBUG
+       bool "Debug portMUX portENTER_CRITICAL/portEXIT_CRITICAL"
+       depends on FREERTOS_DEBUG_INTERNALS
+       default n
+       help
+               If enabled, debug information (including integrity checks) will be printed
+               to UART for the port-specific MUX implementation.
+
+config FREERTOS_PORTMUX_DEBUG_RECURSIVE
+       bool "Debug portMUX Recursion"
+       depends on FREERTOS_PORTMUX_DEBUG
+       default n
+       help
+               If enabled, additional debug information will be printed for recursive
+               portMUX usage.
+
+endif # FREERTOS_DEBUG_INTERNALS
+
 endmenu
index 807412fa883a5725c9e4635092f46af8c6a333a6..908206eb3757d416dd44c09c540e7dec4025a9c5 100644 (file)
@@ -120,13 +120,12 @@ typedef unsigned portBASE_TYPE    UBaseType_t;
 
 #include "sdkconfig.h"
 
-#define portMUX_DEBUG
 #define portFIRST_TASK_HOOK CONFIG_FREERTOS_BREAK_ON_SCHEDULER_START_JTAG
 
 
 typedef struct {
        volatile uint32_t mux;
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
        const char *lastLockedFn;
        int lastLockedLine;
 #endif
@@ -151,7 +150,7 @@ typedef struct {
 #define portMUX_VAL_SHIFT              0
 
 //Keep this in sync with the portMUX_TYPE struct definition please.
-#ifdef portMUX_DEBUG
+#ifndef CONFIG_FREERTOS_PORTMUX_DEBUG
 #define portMUX_INITIALIZER_UNLOCKED {                                         \
                .mux = portMUX_MAGIC_VAL|portMUX_FREE_VAL               \
        }
@@ -170,13 +169,6 @@ typedef struct {
 
 #define portCRITICAL_NESTING_IN_TCB 1 
 
-
-/*
-Enable this to enable mux debugging. With this on, the mux code will warn you for deadlocks
-and double releases etc.
-*/
-#define portMUX_DEBUG
-
 /*
 Modifications to portENTER_CRITICAL:
 
@@ -198,7 +190,7 @@ This all assumes that interrupts are either entirely disabled or enabled. Interr
 will break this scheme.
 */
 void vPortCPUInitializeMutex(portMUX_TYPE *mux);
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
 void vPortCPUAcquireMutex(portMUX_TYPE *mux, const char *function, int line);
 portBASE_TYPE vPortCPUReleaseMutex(portMUX_TYPE *mux, const char *function, int line);
 void vTaskEnterCritical( portMUX_TYPE *mux, const char *function, int line );
index bbe0837d5f6acc2a84934a9cdf88fe10e35931c9..afa4978639bfad65f28c524c28caa2ac716e9c1a 100644 (file)
@@ -276,7 +276,7 @@ uint32_t uxPortCompareSet(volatile uint32_t *mux, uint32_t compare, uint32_t set
  * For kernel use: Initialize a per-CPU mux. Mux will be initialized unlocked.
  */
 void vPortCPUInitializeMutex(portMUX_TYPE *mux) {
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
        ets_printf("Initializing mux %p\n", mux);
        mux->lastLockedFn="(never locked)";
        mux->lastLockedLine=-1;
@@ -288,7 +288,7 @@ void vPortCPUInitializeMutex(portMUX_TYPE *mux) {
 /*
  * For kernel use: Acquire a per-CPU mux. Spinlocks, so don't hold on to these muxes for too long.
  */
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
 void vPortCPUAcquireMutex(portMUX_TYPE *mux, const char *fnName, int line) {
 #else
 void vPortCPUAcquireMutex(portMUX_TYPE *mux) {
@@ -296,7 +296,7 @@ void vPortCPUAcquireMutex(portMUX_TYPE *mux) {
        uint32_t res;
        uint32_t recCnt;
        unsigned int irqStatus;
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
        uint32_t cnt=(1<<16);
        if ( (mux->mux & portMUX_MAGIC_MASK) != portMUX_MAGIC_VAL ) {
                ets_printf("ERROR: vPortCPUAcquireMutex: mux %p is uninitialized (0x%X)! Called from %s line %d.\n", mux, mux->mux, fnName, line);
@@ -313,21 +313,21 @@ void vPortCPUAcquireMutex(portMUX_TYPE *mux) {
                        //Mux was already locked by us. Just bump the recurse count by one.
                        recCnt=(res&portMUX_CNT_MASK)>>portMUX_CNT_SHIFT;
                        recCnt++;
-#ifdef portMUX_DEBUG_RECURSIVE
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG_RECURSIVE
                        ets_printf("Recursive lock: recCnt=%d last non-recursive lock %s line %d, curr %s line %d\n", recCnt, mux->lastLockedFn, mux->lastLockedLine, fnName, line);
 #endif
                        mux->mux=portMUX_MAGIC_VAL|(recCnt<<portMUX_CNT_SHIFT)|(xPortGetCoreID()<<portMUX_VAL_SHIFT);
                        break;
                }
-               cnt--;
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
+        cnt--;
                if (cnt==0) {
                        ets_printf("Timeout on mux! last non-recursive lock %s line %d, curr %s line %d\n", mux->lastLockedFn, mux->lastLockedLine, fnName, line);
                        ets_printf("Mux value %X\n", mux->mux);
                }
 #endif
        } while (res!=portMUX_FREE_VAL);
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
        if (res==portMUX_FREE_VAL) { //initial lock
                mux->lastLockedFn=fnName;
                mux->lastLockedLine=line;
@@ -340,7 +340,7 @@ void vPortCPUAcquireMutex(portMUX_TYPE *mux) {
  * For kernel use: Release a per-CPU mux. Returns true if everything is OK, false if mux
  * was already unlocked or is locked by a different core.
  */
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
 portBASE_TYPE vPortCPUReleaseMutex(portMUX_TYPE *mux, const char *fnName, int line) {
 #else
 portBASE_TYPE vPortCPUReleaseMutex(portMUX_TYPE *mux) {
@@ -351,7 +351,7 @@ portBASE_TYPE vPortCPUReleaseMutex(portMUX_TYPE *mux) {
        portBASE_TYPE ret=pdTRUE;
 //     ets_printf("Unlock %p\n", mux);
        irqStatus=portENTER_CRITICAL_NESTED();
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
        const char *lastLockedFn=mux->lastLockedFn;
        int lastLockedLine=mux->lastLockedLine;
        mux->lastLockedFn=fnName;
@@ -362,13 +362,13 @@ portBASE_TYPE vPortCPUReleaseMutex(portMUX_TYPE *mux) {
        res=uxPortCompareSet(&mux->mux, (xPortGetCoreID()<<portMUX_VAL_SHIFT)|portMUX_MAGIC_VAL, portMUX_FREE_VAL);
 
        if ( res == portMUX_FREE_VAL ) {
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
                ets_printf("ERROR: vPortCPUReleaseMutex: mux %p was already unlocked!\n", mux);
                ets_printf("Last non-recursive unlock %s line %d, curr unlock %s line %d\n", lastLockedFn, lastLockedLine, fnName, line);
 #endif
                ret=pdFALSE;
        } else if ( ((res&portMUX_VAL_MASK)>>portMUX_VAL_SHIFT) != xPortGetCoreID() ) {
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
                ets_printf("ERROR: vPortCPUReleaseMutex: mux %p wasn't locked by this core (%d) but by core %d (ret=%x, mux=%x).\n", mux, xPortGetCoreID(), ((res&portMUX_VAL_MASK)>>portMUX_VAL_SHIFT), res, mux->mux);
                ets_printf("Last non-recursive lock %s line %d\n", lastLockedFn, lastLockedLine);
                ets_printf("Called by %s line %d\n", fnName, line);
@@ -378,7 +378,7 @@ portBASE_TYPE vPortCPUReleaseMutex(portMUX_TYPE *mux) {
                //We locked this, but the reccount isn't zero. Decrease refcount and continue.
                recCnt=(res&portMUX_CNT_MASK)>>portMUX_CNT_SHIFT;
                recCnt--;
-#ifdef portMUX_DEBUG_RECURSIVE
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG_RECURSIVE
                ets_printf("Recursive unlock: recCnt=%d last locked %s line %d, curr %s line %d\n", recCnt, lastLockedFn, lastLockedLine, fnName, line);
 #endif
                mux->mux=portMUX_MAGIC_VAL|(recCnt<<portMUX_CNT_SHIFT)|(xPortGetCoreID()<<portMUX_VAL_SHIFT);
index ca0baa9d5b566f5bf4cc494b0d3c32b880487b81..97e4b6a0047638c5d9af96f7ce2031329cd2608d 100644 (file)
@@ -3754,14 +3754,14 @@ scheduler will re-enable the interrupts instead. */
 #if ( portCRITICAL_NESTING_IN_TCB == 1 )
 
 
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
        void vTaskEnterCritical( portMUX_TYPE *mux, const char *function, int line )
 #else
        void vTaskEnterCritical( portMUX_TYPE *mux )
 #endif
        {
                portDISABLE_INTERRUPTS();
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
                vPortCPUAcquireMutex( mux, function, line );
 #else
                vPortCPUAcquireMutex( mux );
@@ -3794,13 +3794,13 @@ scheduler will re-enable the interrupts instead. */
 
 #if ( portCRITICAL_NESTING_IN_TCB == 1 )
 
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
        void vTaskExitCritical( portMUX_TYPE *mux, const char *function, int line )
 #else
        void vTaskExitCritical( portMUX_TYPE *mux )
 #endif
        {
-#ifdef portMUX_DEBUG
+#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
                vPortCPUReleaseMutex( mux, function, line );
 #else
                vPortCPUReleaseMutex( mux );