From db4587bb59603bdc83e6720193fd1782649a0678 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 23 Mar 2023 18:29:17 +0100 Subject: [PATCH 1/5] allow creating regular threads --- src/fsfw/osal/linux/PosixThread.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/fsfw/osal/linux/PosixThread.cpp b/src/fsfw/osal/linux/PosixThread.cpp index 9851876d..e90070bb 100644 --- a/src/fsfw/osal/linux/PosixThread.cpp +++ b/src/fsfw/osal/linux/PosixThread.cpp @@ -178,20 +178,32 @@ void PosixThread::createTask(void* (*fnc_)(void*), void* arg_) { #ifndef FSFW_USE_REALTIME_FOR_LINUX #error "Please define FSFW_USE_REALTIME_FOR_LINUX with either 0 or 1" #endif + if (priority < 100) { + // RR -> This needs root privileges for the process #if FSFW_USE_REALTIME_FOR_LINUX == 1 - // RR -> This needs root privileges for the process - status = pthread_attr_setschedpolicy(&attributes, SCHED_RR); - if (status != 0) { - utility::printUnixErrorGeneric(CLASS_NAME, "createTask", "pthread_attr_setschedpolicy"); + status = pthread_attr_setschedpolicy(&attributes, SCHED_RR); + if (status != 0) { + utility::printUnixErrorGeneric(CLASS_NAME, "createTask", "pthread_attr_setschedpolicy"); + } +#else +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::warning + << "Real time priorities are only allowed if FSFW_USE_REALTIME_FOR_LINUX is set to 1" + << std::endl; +#endif +#endif + } else { + priority = 0; } sched_param scheduleParams; scheduleParams.__sched_priority = priority; status = pthread_attr_setschedparam(&attributes, &scheduleParams); if (status != 0) { - utility::printUnixErrorGeneric(CLASS_NAME, "createTask", "pthread_attr_setschedparam"); - } +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::warning << "PosixThread: Setting priority failed" << std::endl; #endif + } // Set Signal Mask for suspend until startTask is called sigset_t waitSignal; sigemptyset(&waitSignal); From d16b3c7e6707276dcc5a7ce6b100a88b0ef84b74 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Mar 2023 11:53:41 +0100 Subject: [PATCH 2/5] try to do this cleanly --- src/fsfw/osal/linux/FixedTimeslotTask.cpp | 11 ++++++++--- src/fsfw/osal/linux/FixedTimeslotTask.h | 3 ++- src/fsfw/osal/linux/PeriodicPosixTask.cpp | 11 ++++++++--- src/fsfw/osal/linux/PeriodicPosixTask.h | 2 +- src/fsfw/osal/linux/PosixThread.cpp | 11 ++++++----- src/fsfw/osal/linux/PosixThread.h | 11 ++++++++++- src/fsfw/osal/linux/TaskFactory.cpp | 14 ++++++++------ src/fsfw/tasks/TaskFactory.h | 6 ++++-- src/fsfw_hal/linux/serial/helper.h | 2 +- 9 files changed, 48 insertions(+), 23 deletions(-) diff --git a/src/fsfw/osal/linux/FixedTimeslotTask.cpp b/src/fsfw/osal/linux/FixedTimeslotTask.cpp index 34729c22..0709f52f 100644 --- a/src/fsfw/osal/linux/FixedTimeslotTask.cpp +++ b/src/fsfw/osal/linux/FixedTimeslotTask.cpp @@ -7,10 +7,15 @@ const size_t PeriodicTaskIF::MINIMUM_STACK_SIZE = PTHREAD_STACK_MIN; FixedTimeslotTask::FixedTimeslotTask(const char* name_, TaskPriority priority_, size_t stackSize_, - TaskPeriod periodSeconds_, TaskDeadlineMissedFunction dlmFunc_) + TaskPeriod periodSeconds_, TaskDeadlineMissedFunction dlmFunc_, + PosixThreadArgs* args) : FixedTimeslotTaskBase(periodSeconds_, dlmFunc_), - posixThread(name_, priority_, stackSize_), - started(false) {} + posixThread(name_, SchedulingPolicy::REGULAR, priority_, stackSize_), + started(false) { + if (args != nullptr) { + posixThread.setSchedPolicy(args->policy); + } +} void* FixedTimeslotTask::taskEntryPoint(void* arg) { // The argument is re-interpreted as PollingTask. diff --git a/src/fsfw/osal/linux/FixedTimeslotTask.h b/src/fsfw/osal/linux/FixedTimeslotTask.h index 1f5766a2..0957bedc 100644 --- a/src/fsfw/osal/linux/FixedTimeslotTask.h +++ b/src/fsfw/osal/linux/FixedTimeslotTask.h @@ -23,7 +23,8 @@ class FixedTimeslotTask : public FixedTimeslotTaskBase { * @param deadlineMissedFunc_ */ FixedTimeslotTask(const char* name_, TaskPriority priority_, size_t stackSize_, - TaskPeriod periodSeconds_, TaskDeadlineMissedFunction dlmFunc_); + TaskPeriod periodSeconds_, TaskDeadlineMissedFunction dlmFunc_, + PosixThreadArgs* args); ~FixedTimeslotTask() override = default; ReturnValue_t startTask() override; diff --git a/src/fsfw/osal/linux/PeriodicPosixTask.cpp b/src/fsfw/osal/linux/PeriodicPosixTask.cpp index 556a0367..5f1256d7 100644 --- a/src/fsfw/osal/linux/PeriodicPosixTask.cpp +++ b/src/fsfw/osal/linux/PeriodicPosixTask.cpp @@ -4,10 +4,15 @@ #include "fsfw/tasks/ExecutableObjectIF.h" PeriodicPosixTask::PeriodicPosixTask(const char* name_, int priority_, size_t stackSize_, - TaskPeriod period_, TaskDeadlineMissedFunction dlmFunc_) + TaskPeriod period_, TaskDeadlineMissedFunction dlmFunc_, + PosixThreadArgs* args) : PeriodicTaskBase(period_, dlmFunc_), - posixThread(name_, priority_, stackSize_), - started(false) {} + posixThread(name_, SchedulingPolicy::REGULAR, priority_, stackSize_), + started(false) { + if (args != nullptr) { + posixThread.setSchedPolicy(args->policy); + } +} void* PeriodicPosixTask::taskEntryPoint(void* arg) { // The argument is re-interpreted as PollingTask. diff --git a/src/fsfw/osal/linux/PeriodicPosixTask.h b/src/fsfw/osal/linux/PeriodicPosixTask.h index 085c10b9..eac14f0c 100644 --- a/src/fsfw/osal/linux/PeriodicPosixTask.h +++ b/src/fsfw/osal/linux/PeriodicPosixTask.h @@ -24,7 +24,7 @@ class PeriodicPosixTask : public PeriodicTaskBase { * @param deadlineMissedFunc_ */ PeriodicPosixTask(const char* name_, int priority_, size_t stackSize_, TaskPeriod period_, - TaskDeadlineMissedFunction dlmFunc_); + TaskDeadlineMissedFunction dlmFunc_, PosixThreadArgs* args); ~PeriodicPosixTask() override = default; /** diff --git a/src/fsfw/osal/linux/PosixThread.cpp b/src/fsfw/osal/linux/PosixThread.cpp index e90070bb..385b4e1c 100644 --- a/src/fsfw/osal/linux/PosixThread.cpp +++ b/src/fsfw/osal/linux/PosixThread.cpp @@ -7,8 +7,9 @@ #include "fsfw/osal/linux/unixUtility.h" #include "fsfw/serviceinterface/ServiceInterface.h" -PosixThread::PosixThread(const char* name_, int priority_, size_t stackSize_) - : thread(0), priority(priority_), stackSize(stackSize_) { +PosixThread::PosixThread(const char* name_, SchedulingPolicy schedPolciy, int priority_, + size_t stackSize_) + : thread(0), schedPolicy(schedPolciy), priority(priority_), stackSize(stackSize_) { name[0] = '\0'; std::strncat(name, name_, PTHREAD_MAX_NAMELEN - 1); } @@ -178,7 +179,7 @@ void PosixThread::createTask(void* (*fnc_)(void*), void* arg_) { #ifndef FSFW_USE_REALTIME_FOR_LINUX #error "Please define FSFW_USE_REALTIME_FOR_LINUX with either 0 or 1" #endif - if (priority < 100) { + if (schedPolicy == SchedulingPolicy::RR) { // RR -> This needs root privileges for the process #if FSFW_USE_REALTIME_FOR_LINUX == 1 status = pthread_attr_setschedpolicy(&attributes, SCHED_RR); @@ -192,8 +193,6 @@ void PosixThread::createTask(void* (*fnc_)(void*), void* arg_) { << std::endl; #endif #endif - } else { - priority = 0; } sched_param scheduleParams; @@ -255,3 +254,5 @@ void PosixThread::createTask(void* (*fnc_)(void*), void* arg_) { utility::printUnixErrorGeneric(CLASS_NAME, "createTask", "pthread_attr_destroy"); } } + +void PosixThread::setSchedPolicy(SchedulingPolicy policy) { this->schedPolicy = policy; } diff --git a/src/fsfw/osal/linux/PosixThread.h b/src/fsfw/osal/linux/PosixThread.h index add41bf6..1ae0ec0c 100644 --- a/src/fsfw/osal/linux/PosixThread.h +++ b/src/fsfw/osal/linux/PosixThread.h @@ -9,10 +9,15 @@ #include "../../returnvalues/returnvalue.h" +enum SchedulingPolicy { REGULAR, RR }; +struct PosixThreadArgs { + SchedulingPolicy policy; +}; + class PosixThread { public: static constexpr uint8_t PTHREAD_MAX_NAMELEN = 16; - PosixThread(const char* name_, int priority_, size_t stackSize_); + PosixThread(const char* name_, SchedulingPolicy schedPolicy, int priority_, size_t stackSize_); virtual ~PosixThread(); /** * Set the Thread to sleep state @@ -20,6 +25,9 @@ class PosixThread { * @return Returns Failed if sleep fails */ static ReturnValue_t sleep(uint64_t ns); + + void setSchedPolicy(SchedulingPolicy policy); + /** * @brief Function to suspend the task until SIGUSR1 was received * @@ -72,6 +80,7 @@ class PosixThread { private: char name[PTHREAD_MAX_NAMELEN]; + SchedulingPolicy schedPolicy; int priority; size_t stackSize = 0; diff --git a/src/fsfw/osal/linux/TaskFactory.cpp b/src/fsfw/osal/linux/TaskFactory.cpp index bacc4311..c93f3fde 100644 --- a/src/fsfw/osal/linux/TaskFactory.cpp +++ b/src/fsfw/osal/linux/TaskFactory.cpp @@ -12,18 +12,20 @@ TaskFactory::~TaskFactory() = default; TaskFactory* TaskFactory::instance() { return TaskFactory::factoryInstance; } -PeriodicTaskIF* TaskFactory::createPeriodicTask( - TaskName name_, TaskPriority taskPriority_, TaskStackSize stackSize_, - TaskPeriod periodInSeconds_, TaskDeadlineMissedFunction deadLineMissedFunction_) { +PeriodicTaskIF* TaskFactory::createPeriodicTask(TaskName name_, TaskPriority taskPriority_, + TaskStackSize stackSize_, + TaskPeriod periodInSeconds_, + TaskDeadlineMissedFunction deadLineMissedFunction_, + void* args) { return new PeriodicPosixTask(name_, taskPriority_, stackSize_, periodInSeconds_, - deadLineMissedFunction_); + deadLineMissedFunction_, reinterpret_cast(args)); } FixedTimeslotTaskIF* TaskFactory::createFixedTimeslotTask( TaskName name_, TaskPriority taskPriority_, TaskStackSize stackSize_, - TaskPeriod periodInSeconds_, TaskDeadlineMissedFunction deadLineMissedFunction_) { + TaskPeriod periodInSeconds_, TaskDeadlineMissedFunction deadLineMissedFunction_, void* args) { return new FixedTimeslotTask(name_, taskPriority_, stackSize_, periodInSeconds_, - deadLineMissedFunction_); + deadLineMissedFunction_, reinterpret_cast(args)); } ReturnValue_t TaskFactory::deleteTask(PeriodicTaskIF* task) { diff --git a/src/fsfw/tasks/TaskFactory.h b/src/fsfw/tasks/TaskFactory.h index 828c533e..9198f100 100644 --- a/src/fsfw/tasks/TaskFactory.h +++ b/src/fsfw/tasks/TaskFactory.h @@ -47,7 +47,8 @@ class TaskFactory { */ PeriodicTaskIF* createPeriodicTask(TaskName name_, TaskPriority taskPriority_, TaskStackSize stackSize_, TaskPeriod periodInSeconds_, - TaskDeadlineMissedFunction deadLineMissedFunction_); + TaskDeadlineMissedFunction deadLineMissedFunction_, + void* args); /** * The meaning for the variables for fixed timeslot tasks is the same as for periodic tasks. @@ -62,7 +63,8 @@ class TaskFactory { FixedTimeslotTaskIF* createFixedTimeslotTask(TaskName name_, TaskPriority taskPriority_, TaskStackSize stackSize_, TaskPeriod periodInSeconds_, - TaskDeadlineMissedFunction deadLineMissedFunction_); + TaskDeadlineMissedFunction deadLineMissedFunction_, + void* args); /** * Function to be called to delete a task diff --git a/src/fsfw_hal/linux/serial/helper.h b/src/fsfw_hal/linux/serial/helper.h index ee59ac66..623612ad 100644 --- a/src/fsfw_hal/linux/serial/helper.h +++ b/src/fsfw_hal/linux/serial/helper.h @@ -69,6 +69,6 @@ void flushTxRxBuf(int fd); int readCountersAndErrors(int serialPort, serial_icounter_struct& icounter); -} // namespace uart +} // namespace serial #endif /* FSFW_HAL_LINUX_UART_HELPER_H_ */ From e704295cce76048d65bbb8893840b9ecedb05c94 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Mar 2023 11:58:23 +0100 Subject: [PATCH 3/5] default value --- src/fsfw/osal/linux/PosixThread.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsfw/osal/linux/PosixThread.h b/src/fsfw/osal/linux/PosixThread.h index 1ae0ec0c..133a9884 100644 --- a/src/fsfw/osal/linux/PosixThread.h +++ b/src/fsfw/osal/linux/PosixThread.h @@ -11,7 +11,7 @@ enum SchedulingPolicy { REGULAR, RR }; struct PosixThreadArgs { - SchedulingPolicy policy; + SchedulingPolicy policy = SchedulingPolicy::REGULAR; }; class PosixThread { From 4415dc24e1bee0252e5282b583fcade7f37a97bf Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Mar 2023 13:25:34 +0100 Subject: [PATCH 4/5] fix host OSAL --- src/fsfw/osal/host/TaskFactory.cpp | 10 ++++++---- src/fsfw/tasks/TaskFactory.h | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/fsfw/osal/host/TaskFactory.cpp b/src/fsfw/osal/host/TaskFactory.cpp index 0a27241b..d9552923 100644 --- a/src/fsfw/osal/host/TaskFactory.cpp +++ b/src/fsfw/osal/host/TaskFactory.cpp @@ -20,16 +20,18 @@ TaskFactory::~TaskFactory() = default; TaskFactory* TaskFactory::instance() { return TaskFactory::factoryInstance; } -PeriodicTaskIF* TaskFactory::createPeriodicTask( - TaskName name_, TaskPriority taskPriority_, TaskStackSize stackSize_, - TaskPeriod periodInSeconds_, TaskDeadlineMissedFunction deadLineMissedFunction_) { +PeriodicTaskIF* TaskFactory::createPeriodicTask(TaskName name_, TaskPriority taskPriority_, + TaskStackSize stackSize_, + TaskPeriod periodInSeconds_, + TaskDeadlineMissedFunction deadLineMissedFunction_, + void* args) { return new PeriodicTask(name_, taskPriority_, stackSize_, periodInSeconds_, deadLineMissedFunction_); } FixedTimeslotTaskIF* TaskFactory::createFixedTimeslotTask( TaskName name_, TaskPriority taskPriority_, TaskStackSize stackSize_, - TaskPeriod periodInSeconds_, TaskDeadlineMissedFunction deadLineMissedFunction_) { + TaskPeriod periodInSeconds_, TaskDeadlineMissedFunction deadLineMissedFunction_, void* args) { return new FixedTimeslotTask(name_, taskPriority_, stackSize_, periodInSeconds_, deadLineMissedFunction_); } diff --git a/src/fsfw/tasks/TaskFactory.h b/src/fsfw/tasks/TaskFactory.h index 9198f100..e9b96a77 100644 --- a/src/fsfw/tasks/TaskFactory.h +++ b/src/fsfw/tasks/TaskFactory.h @@ -48,7 +48,7 @@ class TaskFactory { PeriodicTaskIF* createPeriodicTask(TaskName name_, TaskPriority taskPriority_, TaskStackSize stackSize_, TaskPeriod periodInSeconds_, TaskDeadlineMissedFunction deadLineMissedFunction_, - void* args); + void* args = nullptr); /** * The meaning for the variables for fixed timeslot tasks is the same as for periodic tasks. @@ -64,7 +64,7 @@ class TaskFactory { TaskStackSize stackSize_, TaskPeriod periodInSeconds_, TaskDeadlineMissedFunction deadLineMissedFunction_, - void* args); + void* args = nullptr); /** * Function to be called to delete a task From a937b457f900a6a6b26bc0b42a5357f014840a67 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Mar 2023 14:10:47 +0100 Subject: [PATCH 5/5] this is so confusing --- src/fsfw/osal/linux/PosixThread.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/fsfw/osal/linux/PosixThread.cpp b/src/fsfw/osal/linux/PosixThread.cpp index 385b4e1c..f420b326 100644 --- a/src/fsfw/osal/linux/PosixThread.cpp +++ b/src/fsfw/osal/linux/PosixThread.cpp @@ -186,6 +186,14 @@ void PosixThread::createTask(void* (*fnc_)(void*), void* arg_) { if (status != 0) { utility::printUnixErrorGeneric(CLASS_NAME, "createTask", "pthread_attr_setschedpolicy"); } + sched_param scheduleParams; + scheduleParams.sched_priority = priority; + status = pthread_attr_setschedparam(&attributes, &scheduleParams); + if (status != 0) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::warning << "PosixThread: Setting priority failed" << std::endl; +#endif + } #else #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::warning @@ -195,14 +203,6 @@ void PosixThread::createTask(void* (*fnc_)(void*), void* arg_) { #endif } - sched_param scheduleParams; - scheduleParams.__sched_priority = priority; - status = pthread_attr_setschedparam(&attributes, &scheduleParams); - if (status != 0) { -#if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::warning << "PosixThread: Setting priority failed" << std::endl; -#endif - } // Set Signal Mask for suspend until startTask is called sigset_t waitSignal; sigemptyset(&waitSignal);