#include "fsfw/osal/windows/winTaskHelpers.h" #include #include TaskPriority tasks::makeWinPriority(PriorityClass prioClass, PriorityNumber prioNumber) { return (static_cast(prioClass) << 16) | static_cast(prioNumber); } void tasks::getWinPriorityParameters(TaskPriority priority, DWORD& priorityClass, int& priorityNumber) { PriorityClass classInternal = static_cast(priority >> 16 & 0xff); PriorityNumber numberInternal = static_cast(priority & 0xff); switch (classInternal) { case (CLASS_IDLE): { priorityClass = IDLE_PRIORITY_CLASS; break; } case (CLASS_BELOW_NORMAL): { priorityClass = BELOW_NORMAL_PRIORITY_CLASS; break; } case (CLASS_NORMAL): { priorityClass = NORMAL_PRIORITY_CLASS; break; } case (CLASS_ABOVE_NORMAL): { priorityClass = ABOVE_NORMAL_PRIORITY_CLASS; break; } case (CLASS_HIGH): { priorityClass = HIGH_PRIORITY_CLASS; break; } case (CLASS_REALTIME): { priorityClass = REALTIME_PRIORITY_CLASS; break; } default: { priorityClass = NORMAL_PRIORITY_CLASS; } } switch (numberInternal) { case (IDLE): { priorityNumber = THREAD_PRIORITY_IDLE; break; } case (LOWEST): { priorityNumber = THREAD_PRIORITY_LOWEST; break; } case (BELOW_NORMAL): { priorityNumber = THREAD_PRIORITY_BELOW_NORMAL; break; } case (NORMAL): { priorityNumber = THREAD_PRIORITY_NORMAL; break; } case (ABOVE_NORMAL): { priorityNumber = THREAD_PRIORITY_ABOVE_NORMAL; break; } case (HIGHEST): { priorityNumber = THREAD_PRIORITY_HIGHEST; break; } case (CRITICAL): { priorityNumber = THREAD_PRIORITY_TIME_CRITICAL; break; } default: { priorityNumber = THREAD_PRIORITY_NORMAL; } } } ReturnValue_t tasks::setTaskPriority(HANDLE nativeHandle, TaskPriority priority) { /* List of possible priority classes: https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setpriorityclass And respective thread priority numbers: https://docs.microsoft.com/en-us/windows/win32/procthread/scheduling-priorities */ DWORD dwPriorityClass = 0; int nPriorityNumber = 0; tasks::getWinPriorityParameters(priority, dwPriorityClass, nPriorityNumber); int result = SetPriorityClass(reinterpret_cast(nativeHandle), dwPriorityClass); if (result != 0) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "PeriodicTask: Windows SetPriorityClass failed with code " << GetLastError() << std::endl; return returnvalue::FAILED; #endif } result = SetThreadPriority(reinterpret_cast(nativeHandle), nPriorityNumber); if (result != 0) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "PeriodicTask: Windows SetPriorityClass failed with code " << GetLastError() << std::endl; return returnvalue::FAILED; #endif } return returnvalue::OK; }