FreeRtos – Find ud af om man er i handler mode

I FreeRtos er det irriterende, at man skal bruge to forskellige måder til at ligge noget i en kø, alt efter om man er i en taks eller i ISR. Hvis man bruger CMSIS_OS sammen med FreeRtos, findes der faktisk en funktion, der kan fortælle om man er i ISR eller TASK. Desværre er den ikke public, så man må lige gå ind i cmsis_os.c og gøre den public ved at fjerne static som vist nedenfor.
static int inHandlerMode (void) ->  int inHandlerMode (void)
Nå man så har brug for at ligge noget i en kø, kan man simpel lave en if statement for at finde ud af hvilken “Send” funktion man skal bruge. Vist med nedenstående eksempel.
//
// The function that be called from both a task and from an ISR
//
if (inHandlerMode()) {
   BaseType_t xHigherPriorityTaskWoken = pdFALSE;
   xQueueSendToBackFromISR(taceFromIsrFifo, &traceString, &xHigherPriorityTaskWoken);
   portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
} else {
    xQueueSendToBack(taceFromIsrFifo, &traceString, 1000);
}

Leave a Reply

Your email address will not be published. Required fields are marked *