From e013ae954f35f978c1417d8669f6cb7c138e0ae3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 22 Feb 2021 18:00:23 +0100 Subject: [PATCH 1/7] removed missed deadline printout --- osal/linux/PeriodicPosixTask.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/osal/linux/PeriodicPosixTask.cpp b/osal/linux/PeriodicPosixTask.cpp index a8f2de60..630dd8e0 100644 --- a/osal/linux/PeriodicPosixTask.cpp +++ b/osal/linux/PeriodicPosixTask.cpp @@ -68,20 +68,6 @@ void PeriodicPosixTask::taskFunctionality(void) { } if(not PosixThread::delayUntil(&lastWakeTime, periodMs)){ - char name[20] = {0}; - int status = pthread_getname_np(pthread_self(), name, sizeof(name)); - if(status == 0) { -#if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "PeriodicPosixTask " << name << ": Deadline " - "missed." << std::endl; -#endif - } - else { -#if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "PeriodicPosixTask X: Deadline missed. " << - status << std::endl; -#endif - } if (this->deadlineMissedFunc != nullptr) { this->deadlineMissedFunc(); } From 144375827441b80a601579fe4395e3bbc19df92c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 22 Feb 2021 18:43:09 +0100 Subject: [PATCH 2/7] added new static function to print missed deadline --- osal/FreeRTOS/TaskFactory.cpp | 6 ++++++ osal/host/TaskFactory.cpp | 5 +++++ osal/linux/TaskFactory.cpp | 21 +++++++++++++++++++++ osal/rtems/TaskFactory.cpp | 5 +++++ tasks/TaskFactory.h | 6 ++++++ 5 files changed, 43 insertions(+) diff --git a/osal/FreeRTOS/TaskFactory.cpp b/osal/FreeRTOS/TaskFactory.cpp index 3ac5cb49..5b64811a 100644 --- a/osal/FreeRTOS/TaskFactory.cpp +++ b/osal/FreeRTOS/TaskFactory.cpp @@ -49,5 +49,11 @@ ReturnValue_t TaskFactory::delayTask(uint32_t delayMs) { return HasReturnvaluesIF::RETURN_OK; } +void TaskFactory::printMissedDeadline() { + /* TODO: Implement */ + return; +} + + TaskFactory::TaskFactory() { } diff --git a/osal/host/TaskFactory.cpp b/osal/host/TaskFactory.cpp index bc65504c..4fafd349 100644 --- a/osal/host/TaskFactory.cpp +++ b/osal/host/TaskFactory.cpp @@ -48,4 +48,9 @@ ReturnValue_t TaskFactory::delayTask(uint32_t delayMs){ return HasReturnvaluesIF::RETURN_OK; } +void TaskFactory::printMissedDeadline() { + /* TODO: Implement */ + return; +} + diff --git a/osal/linux/TaskFactory.cpp b/osal/linux/TaskFactory.cpp index d18a0316..93564647 100644 --- a/osal/linux/TaskFactory.cpp +++ b/osal/linux/TaskFactory.cpp @@ -39,5 +39,26 @@ ReturnValue_t TaskFactory::delayTask(uint32_t delayMs){ return PosixThread::sleep(delayMs*1000000ull); } +void TaskFactory::printMissedDeadline() { + char name[20] = {0}; + int status = pthread_getname_np(pthread_self(), name, sizeof(name)); +#if FSFW_CPP_OSTREAM_ENABLED == 1 + if(status == 0) { + sif::warning << "task::printMissedDeadline: " << name << "" << std::endl; + } + else { + sif::warning << "task::printMissedDeadline: Unknown task name" << status << + std::endl; + } +#else + if(status == 0) { + sif::printWarning("task::printMissedDeadline: %s\n", name); + } + else { + sif::printWarning("task::printMissedDeadline: Unknown task name\n", name); + } +#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ +} + TaskFactory::TaskFactory() { } diff --git a/osal/rtems/TaskFactory.cpp b/osal/rtems/TaskFactory.cpp index 5dad69fe..095e9a26 100644 --- a/osal/rtems/TaskFactory.cpp +++ b/osal/rtems/TaskFactory.cpp @@ -44,5 +44,10 @@ ReturnValue_t TaskFactory::delayTask(uint32_t delayMs){ return HasReturnvaluesIF::RETURN_OK; } +void TaskFactory::printMissedDeadline() { + /* TODO: Implement */ + return; +} + TaskFactory::TaskFactory() { } diff --git a/tasks/TaskFactory.h b/tasks/TaskFactory.h index 85cdda90..03b5163c 100644 --- a/tasks/TaskFactory.h +++ b/tasks/TaskFactory.h @@ -62,6 +62,12 @@ public: */ static ReturnValue_t delayTask(uint32_t delayMs); + /** + * OS specific implementation to print deadline. In most cases, there is a OS specific + * way to retrieve the task name and print it out as well. + */ + static void printMissedDeadline(); + private: /** * External instantiation is not allowed. From 671bab012e6da1cc3b86784242e6e3659e72207a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 23 Feb 2021 11:30:11 +0100 Subject: [PATCH 3/7] mutex helper printf support and nullptr check --- ipc/MutexHelper.h | 49 +++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/ipc/MutexHelper.h b/ipc/MutexHelper.h index befa69bc..5a14249c 100644 --- a/ipc/MutexHelper.h +++ b/ipc/MutexHelper.h @@ -2,33 +2,44 @@ #define FRAMEWORK_IPC_MUTEXHELPER_H_ #include "MutexFactory.h" -#include "../serviceinterface/ServiceInterfaceStream.h" +#include "../serviceinterface/ServiceInterface.h" class MutexHelper { public: - MutexHelper(MutexIF* mutex, MutexIF::TimeoutType timeoutType = - MutexIF::TimeoutType::BLOCKING, uint32_t timeoutMs = 0) : - internalMutex(mutex) { - ReturnValue_t status = mutex->lockMutex(timeoutType, - timeoutMs); - if(status == MutexIF::MUTEX_TIMEOUT) { + MutexHelper(MutexIF* mutex, MutexIF::TimeoutType timeoutType = + MutexIF::TimeoutType::BLOCKING, uint32_t timeoutMs = 0): + internalMutex(mutex) { + if(mutex == nullptr) { + return; + } + ReturnValue_t status = mutex->lockMutex(timeoutType, + timeoutMs); + if(status == MutexIF::MUTEX_TIMEOUT) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "MutexHelper: Lock of mutex failed with timeout of " - << timeoutMs << " milliseconds!" << std::endl; + sif::error << "MutexHelper: Lock of mutex failed with timeout of " + << timeoutMs << " milliseconds!" << std::endl; +#else + sif::printError("MutexHelper: Lock of mutex failed with timeout of %lu milliseconds\n", + timeoutMs); #endif - } - else if(status != HasReturnvaluesIF::RETURN_OK){ + } + else if(status != HasReturnvaluesIF::RETURN_OK){ #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "MutexHelper: Lock of Mutex failed with code " - << status << std::endl; + sif::error << "MutexHelper: Lock of Mutex failed with code " + << status << std::endl; +#else + sif::printError("MutexHelper: Lock of Mutex failed with code %d\n", status); #endif - } - } + } + } - ~MutexHelper() { - internalMutex->unlockMutex(); - } + ~MutexHelper() { + if(internalMutex != nullptr) { + internalMutex->unlockMutex(); + } + } private: - MutexIF* internalMutex; + MutexIF* internalMutex; }; + #endif /* FRAMEWORK_IPC_MUTEXHELPER_H_ */ From 58e219981f179eed11e08f139d9cc1bdca2831f5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 23 Feb 2021 14:09:55 +0100 Subject: [PATCH 4/7] updated mutex helper --- ipc/MutexHelper.h | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ipc/MutexHelper.h b/ipc/MutexHelper.h index 5a14249c..dd6eb926 100644 --- a/ipc/MutexHelper.h +++ b/ipc/MutexHelper.h @@ -10,26 +10,37 @@ public: MutexIF::TimeoutType::BLOCKING, uint32_t timeoutMs = 0): internalMutex(mutex) { if(mutex == nullptr) { +#if FSFW_VERBOSE_LEVEL >= 1 +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::error << "MutexHelper: Passed mutex is invalid!" << std::endl; +#else + sif::printError("MutexHelper: Passed mutex is invalid!\n"); +#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ +#endif /* FSFW_VERBOSE_LEVEL >= 1 */ return; } ReturnValue_t status = mutex->lockMutex(timeoutType, timeoutMs); if(status == MutexIF::MUTEX_TIMEOUT) { +#if FSFW_VERBOSE_LEVEL >= 1 #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "MutexHelper: Lock of mutex failed with timeout of " << timeoutMs << " milliseconds!" << std::endl; #else sif::printError("MutexHelper: Lock of mutex failed with timeout of %lu milliseconds\n", timeoutMs); -#endif +#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ +#endif /* FSFW_VERBOSE_LEVEL >= 1 */ } - else if(status != HasReturnvaluesIF::RETURN_OK){ + else if(status != HasReturnvaluesIF::RETURN_OK) { +#if FSFW_VERBOSE_LEVEL >= 1 #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "MutexHelper: Lock of Mutex failed with code " << status << std::endl; #else sif::printError("MutexHelper: Lock of Mutex failed with code %d\n", status); -#endif +#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ +#endif /* FSFW_VERBOSE_LEVEL >= 1 */ } } From 06eadb55abe4debf9cf0d124778bcae148a4002e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 23 Feb 2021 14:11:53 +0100 Subject: [PATCH 5/7] small stuff --- ipc/MutexHelper.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ipc/MutexHelper.h b/ipc/MutexHelper.h index dd6eb926..7f81f2f4 100644 --- a/ipc/MutexHelper.h +++ b/ipc/MutexHelper.h @@ -35,8 +35,7 @@ public: else if(status != HasReturnvaluesIF::RETURN_OK) { #if FSFW_VERBOSE_LEVEL >= 1 #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "MutexHelper: Lock of Mutex failed with code " - << status << std::endl; + sif::error << "MutexHelper: Lock of Mutex failed with code " << status << std::endl; #else sif::printError("MutexHelper: Lock of Mutex failed with code %d\n", status); #endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ From ce770a67b2d577df8f02ddf16a9297c4bee9cd59 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 23 Feb 2021 14:14:23 +0100 Subject: [PATCH 6/7] preprocessor define improved --- ipc/MutexHelper.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipc/MutexHelper.h b/ipc/MutexHelper.h index 7f81f2f4..76eadc00 100644 --- a/ipc/MutexHelper.h +++ b/ipc/MutexHelper.h @@ -21,8 +21,8 @@ public: } ReturnValue_t status = mutex->lockMutex(timeoutType, timeoutMs); - if(status == MutexIF::MUTEX_TIMEOUT) { #if FSFW_VERBOSE_LEVEL >= 1 + if(status == MutexIF::MUTEX_TIMEOUT) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "MutexHelper: Lock of mutex failed with timeout of " << timeoutMs << " milliseconds!" << std::endl; @@ -30,7 +30,7 @@ public: sif::printError("MutexHelper: Lock of mutex failed with timeout of %lu milliseconds\n", timeoutMs); #endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ -#endif /* FSFW_VERBOSE_LEVEL >= 1 */ + } else if(status != HasReturnvaluesIF::RETURN_OK) { #if FSFW_VERBOSE_LEVEL >= 1 @@ -39,8 +39,8 @@ public: #else sif::printError("MutexHelper: Lock of Mutex failed with code %d\n", status); #endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ -#endif /* FSFW_VERBOSE_LEVEL >= 1 */ } +#endif /* FSFW_VERBOSE_LEVEL >= 1 */ } ~MutexHelper() { From 94f9d1ee16b4d0249a2e6d60b3508c7de9da3c77 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 23 Feb 2021 14:40:08 +0100 Subject: [PATCH 7/7] mutex helper update --- ipc/MutexHelper.h | 62 +++++++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/ipc/MutexHelper.h b/ipc/MutexHelper.h index befa69bc..bc573085 100644 --- a/ipc/MutexHelper.h +++ b/ipc/MutexHelper.h @@ -2,33 +2,53 @@ #define FRAMEWORK_IPC_MUTEXHELPER_H_ #include "MutexFactory.h" -#include "../serviceinterface/ServiceInterfaceStream.h" +#include "../serviceinterface/ServiceInterface.h" class MutexHelper { public: - MutexHelper(MutexIF* mutex, MutexIF::TimeoutType timeoutType = - MutexIF::TimeoutType::BLOCKING, uint32_t timeoutMs = 0) : - internalMutex(mutex) { - ReturnValue_t status = mutex->lockMutex(timeoutType, - timeoutMs); - if(status == MutexIF::MUTEX_TIMEOUT) { + MutexHelper(MutexIF* mutex, MutexIF::TimeoutType timeoutType = + MutexIF::TimeoutType::BLOCKING, uint32_t timeoutMs = 0): + internalMutex(mutex) { + if(mutex == nullptr) { +#if FSFW_VERBOSE_LEVEL >= 1 #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "MutexHelper: Lock of mutex failed with timeout of " - << timeoutMs << " milliseconds!" << std::endl; -#endif - } - else if(status != HasReturnvaluesIF::RETURN_OK){ + sif::error << "MutexHelper: Passed mutex is invalid!" << std::endl; +#else + sif::printError("MutexHelper: Passed mutex is invalid!\n"); +#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ +#endif /* FSFW_VERBOSE_LEVEL >= 1 */ + return; + } + ReturnValue_t status = mutex->lockMutex(timeoutType, + timeoutMs); +#if FSFW_VERBOSE_LEVEL >= 1 + if(status == MutexIF::MUTEX_TIMEOUT) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "MutexHelper: Lock of Mutex failed with code " - << status << std::endl; -#endif - } - } + sif::error << "MutexHelper: Lock of mutex failed with timeout of " + << timeoutMs << " milliseconds!" << std::endl; +#else + sif::printError("MutexHelper: Lock of mutex failed with timeout of %lu milliseconds\n", + timeoutMs); +#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ - ~MutexHelper() { - internalMutex->unlockMutex(); - } + } + else if(status != HasReturnvaluesIF::RETURN_OK) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::error << "MutexHelper: Lock of Mutex failed with code " << status << std::endl; +#else + sif::printError("MutexHelper: Lock of Mutex failed with code %d\n", status); +#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ + } +#endif /* FSFW_VERBOSE_LEVEL >= 1 */ + } + + ~MutexHelper() { + if(internalMutex != nullptr) { + internalMutex->unlockMutex(); + } + } private: - MutexIF* internalMutex; + MutexIF* internalMutex; }; + #endif /* FRAMEWORK_IPC_MUTEXHELPER_H_ */