Desinherit after different mutex is given

meierbenjamin wrote on Wednesday, April 10, 2013:

Hi all,

whilst analyzing my software i found something that concerned me.
I was wondering why the priority of the control-task is set back at this point in time.
But first things first.

The image below shows a part of a trace captured with percepio. There are no events hidden.
There are mainly three active tasks.
- Display (Priority 1)
- Radio (Priority 2)
- Control (Priority 3)

To share some resources with tasks (some were not active during the capture) there are mainly two mutexes:
- SPI Mutex
- Radio Mutex

Any task communicating with the display has to have the SPI mutex first.
Any task communicating with the radio needs to get the Radio mutex and then the SPI mutex.

Even though it isn’t very pretty the control-task attempts to get the Radio-mutex and blocks.
This leads to the inheritance of the priority of the Radio-task, which has the radio mutex during the whole capture.

Somewhat later the priority of the radio-task is returned to its original priority (2).
This right after the radio-task returns the other mutex (SPI).

I cannot see any reason why this should be. The Radio-mutex is still owned by the radio-task.

Thanks for any idea, I’m quite confused right now…

meierbenjamin wrote on Wednesday, April 10, 2013:

Also should to my opinion the control-task get active if the priority of the radio task was actually returned to 2.

rtel wrote on Wednesday, April 10, 2013:

The priority inheritance mechanism is very simply and does not stack inherited priorities - it assumes only one mutex is held at a time.