42 lines
1.4 KiB
C++
42 lines
1.4 KiB
C++
#ifndef FSFW_OSAL_FREERTOS_FREERTOSTASKIF_H_
|
|
#define FSFW_OSAL_FREERTOS_FREERTOSTASKIF_H_
|
|
|
|
#include <freertos/FreeRTOS.h>
|
|
#include <freertos/task.h>
|
|
|
|
class FreeRTOSTaskIF {
|
|
public:
|
|
virtual~ FreeRTOSTaskIF() {}
|
|
virtual TaskHandle_t getTaskHandle() = 0;
|
|
|
|
protected:
|
|
|
|
bool checkMissedDeadline(const TickType_t xLastWakeTime,
|
|
const TickType_t interval) {
|
|
/* Check whether deadline was missed while also taking overflows
|
|
* into account. Drawing this on paper with a timeline helps to understand
|
|
* it. */
|
|
TickType_t currentTickCount = xTaskGetTickCount();
|
|
TickType_t timeToWake = xLastWakeTime + interval;
|
|
// Time to wake has not overflown.
|
|
if(timeToWake > xLastWakeTime) {
|
|
/* If the current time has overflown exclusively or the current
|
|
* tick count is simply larger than the time to wake, a deadline was
|
|
* missed */
|
|
if((currentTickCount < xLastWakeTime) or
|
|
(currentTickCount > timeToWake)) {
|
|
return true;
|
|
}
|
|
}
|
|
/* Time to wake has overflown. A deadline was missed if the current time
|
|
* is larger than the time to wake */
|
|
else if((timeToWake < xLastWakeTime) and
|
|
(currentTickCount > timeToWake)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
#endif /* FSFW_OSAL_FREERTOS_FREERTOSTASKIF_H_ */
|