Mutex “give” occurs when another task already owns mutex. V9.0

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

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

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

I wasn’t ever calling from an interrupt. Thanks for the fast response.

Mutex “give” occurs when another task already owns mutex. V9.0

You also should be testing the return value of the take to make sure you got it. That would have cought the error.