Mutex “give” occurs when another task already owns mutex. V9.0
Posted by
zempter on September 25, 2017
I have checked to make sure that all of the tasks that take ownership of the mutex give it back imediately after the important function call that interacts with a non-thread-safe libary. However, when The tasks are operating, not very long into startup (but not imediately, so it works for a little while) My “periodics” task tries to give up my mutex that says it is currently owned by my “matrix” task.
xTaskPriorityDisinherit then thows at configASSERT( pxTCB == pxCurrentTCB ); because the current owner is wrong.
I want to understand what could be causing it, but my boss wants me to just toss everything that interracts with that library into one task to avoid the problem from happening. It is bugging me like crazy though, and I will have to do a decent amount of restructuring to my code that I feel like would be unfortunate.
What could be causing this? I am operating on a single core Cypress chip. My config header looks like this:
ifndef FREERTOSCONFIGH
define FREERTOSCONFIGH
/* Here is a good place to include header files that are required across
your application. */
include “project.h”
define configUSE_PREEMPTION 1
define configUSEPORTOPTIMISEDTASKSELECTION 0
define configUSETICKLESSIDLE 0
// PSoC Creator creates a #define macro for the clock settings from the DWR
define configCPUCLOCKHZ ( ( unsigned long ) CYDEV_BCLKSYSCLKHZ )
// SysTick Defaults to 1ms
define configTICKRATEHZ 1000
define configMAX_PRIORITIES 5
define configMINIMALSTACKSIZE 128
define configMAXTASKNAME_LEN 16
define configUSE16BIT_TICKS 0
define configIDLESHOULDYIELD 1
define configUSETASKNOTIFICATIONS 1
define configUSE_MUTEXES 1
define configUSERECURSIVEMUTEXES 0
define configUSECOUNTINGSEMAPHORES 1
define configUSEALTERNATIVEAPI 0 /* Deprecated! */
define configQUEUEREGISTRYSIZE 10
define configUSEQUEUESETS 1
define configUSETIMESLICING 0
define configUSENEWLIBREENTRANT 0
define configENABLEBACKWARDCOMPATIBILITY 0
define configNUMTHREADLOCALSTORAGEPOINTERS 5
/* Memory allocation related definitions. */
define configSUPPORTSTATICALLOCATION 0
define configSUPPORTDYNAMICALLOCATION 1
define configTOTALHEAPSIZE 7000
define configAPPLICATIONALLOCATEDHEAP 0
/* Hook function related definitions. */
define configUSEIDLEHOOK 0
define configUSETICKHOOK 0
define configCHECKFORSTACK_OVERFLOW 0
define configUSEMALLOCFAILED_HOOK 0
define configUSEDAEMONTASKSTARTUPHOOK 0
/* Run time and task stats gathering related definitions. */
define configGENERATERUNTIME_STATS 0
define configUSETRACEFACILITY 0
define configUSESTATSFORMATTING_FUNCTIONS 0
/* Co-routine related definitions. */
define configUSECOROUTINES 0
define configMAXCOROUTINE_PRIORITIES 1
/* Software timer related definitions. */
define configUSE_TIMERS 1
define configTIMERTASKPRIORITY 3
define configTIMERQUEUELENGTH 10
define configTIMERTASKSTACKDEPTH configMINIMALSTACK_SIZE
/* Interrupt nesting behaviour configuration. */
define configKERNELINTERRUPTPRIORITY [dependent of processor]
define configMAXSYSCALLINTERRUPT_PRIORITY [dependent on processor and application]
define configMAXAPICALLINTERRUPTPRIORITY [dependent on processor and application]
/* Define to trap errors during development. */
define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
/* FreeRTOS MPU specific definitions. */
define configINCLUDEAPPLICATIONDEFINEDPRIVILEGEDFUNCTIONS 0
/* Optional functions – most linkers will remove unused functions anyway. */
define INCLUDE_vTaskPrioritySet 1
define INCLUDE_uxTaskPriorityGet 1
define INCLUDE_vTaskDelete 1
define INCLUDE_vTaskSuspend 1
define INCLUDE_xResumeFromISR 1
define INCLUDE_vTaskDelayUntil 1
define INCLUDE_vTaskDelay 1
define INCLUDE_xTaskGetSchedulerState 1
define INCLUDE_xTaskGetCurrentTaskHandle 1
define INCLUDE_uxTaskGetStackHighWaterMark 0
define INCLUDE_xTaskGetIdleTaskHandle 0
define INCLUDE_eTaskGetState 0
define INCLUDE_xEventGroupSetBitFromISR 1
define INCLUDE_xTimerPendFunctionCall 0
define INCLUDE_xTaskAbortDelay 0
define INCLUDE_xTaskGetHandle 0
define INCLUDE_xTaskResumeFromISR 1
/* A header file that defines trace macro can be included here. */
endif /* FREERTOSCONFIGH */**
Mutex “give” occurs when another task already owns mutex. V9.0
Posted by
rtel on September 25, 2017
Are you giving the mutex from an interrupt at all? That can really mess
up what the system thinks is the mutex owner.
Mutex “give” occurs when another task already owns mutex. V9.0
Posted by
zempter on September 25, 2017
Nevermind, I figured it out, I was using the wrong delay value.
xSemaphoreTake(MATRIX_MUTEX,0);
when I really wanted:
xSemaphoreTake(MATRIXMUTEX,portMAXDELAY );
I was thinking that 0 meant it didn’t have a timeout.
Mutex “give” occurs when another task already owns mutex. V9.0
Posted by
zempter on September 25, 2017
I wasn’t ever calling from an interrupt.
Thanks for the fast response.
Mutex “give” occurs when another task already owns mutex. V9.0
Posted by
richard_damon on September 26, 2017
You also should be testing the return value of the take to make sure you got it. That would have cought the error.