From 654de0f586075a687b9b322c541572a404a42c66 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Thu, 12 Jan 2023 17:16:17 +0100 Subject: [PATCH 01/12] WIP --- CMakeLists.txt | 22 ++++++++++++++++++++++ unittests/FreeRTOS-Config/FreeRTOSConfig.h | 0 2 files changed, 22 insertions(+) create mode 100644 unittests/FreeRTOS-Config/FreeRTOSConfig.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8308f5234..59acb05cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,6 +174,25 @@ if(FSFW_BUILD_TESTS) configure_file(unittests/testcfg/FSFWConfig.h.in FSFWConfig.h) configure_file(unittests/testcfg/TestsConfig.h.in tests/TestsConfig.h) + if(FSFW_OSAL MATCHES "freertos") + message( + STATUS + "${MSG_PREFIX} Downloading FreeRTOS with FetchContent" + ) + include(FetchContent) + + FetchContent_Declare( + FreeRTOS + GIT_REPOSITORY https://egit.irs.uni-stuttgart.de/fsfw/FreeRTOS-LTS + GIT_TAG develop + GIT_SUBMODULES FreeRTOS/FreeRTOS-Kernel) + + list(APPEND FSFW_FETCH_CONTENT_TARGETS FreeRTOS) + + set(LIB_OS_NAME FreeRTOS) + target_include_directories(FreeRTOS PRIVATE unittests/FreeRTOS-Config) + endif() + project(${FSFW_TEST_TGT} CXX C) add_executable(${FSFW_TEST_TGT}) if(IPO_SUPPORTED AND FSFW_ENABLE_IPO) @@ -226,6 +245,9 @@ if(FSFW_FETCH_CONTENT_TARGETS) # GitHub issue: https://github.com/catchorg/Catch2/issues/2417 set_target_properties(Catch2 PROPERTIES DEBUG_POSTFIX "") endif() + + + endif() set(FSFW_CORE_INC_PATH "inc") diff --git a/unittests/FreeRTOS-Config/FreeRTOSConfig.h b/unittests/FreeRTOS-Config/FreeRTOSConfig.h new file mode 100644 index 000000000..e69de29bb -- 2.34.1 From 13639feec6229446c04906d2f69849ec7ececbbd Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Fri, 13 Jan 2023 11:09:32 +0100 Subject: [PATCH 02/12] FreeRTOS unittests building (but not running) --- CMakeLists.txt | 7 +- src/fsfw/osal/freertos/BinSemaphUsingTask.h | 4 +- src/fsfw/osal/freertos/BinarySemaphore.h | 2 +- .../osal/freertos/CountingSemaphUsingTask.h | 2 +- src/fsfw/osal/freertos/FixedTimeslotTask.cpp | 4 +- src/fsfw/osal/freertos/Mutex.cpp | 2 +- src/fsfw/osal/freertos/TaskManagement.cpp | 16 +-- src/fsfw/osal/freertos/TaskManagement.h | 4 +- unittests/FreeRTOS-Config/FreeRTOSConfig.h | 0 unittests/testcfg/freertos/FreeRTOSConfig.h | 104 ++++++++++++++++++ 10 files changed, 127 insertions(+), 18 deletions(-) delete mode 100644 unittests/FreeRTOS-Config/FreeRTOSConfig.h create mode 100644 unittests/testcfg/freertos/FreeRTOSConfig.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 59acb05cb..41be31e0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -181,16 +181,19 @@ if(FSFW_BUILD_TESTS) ) include(FetchContent) + set(FreeRTOS_PORT posix) + FetchContent_Declare( FreeRTOS GIT_REPOSITORY https://egit.irs.uni-stuttgart.de/fsfw/FreeRTOS-LTS GIT_TAG develop GIT_SUBMODULES FreeRTOS/FreeRTOS-Kernel) - list(APPEND FSFW_FETCH_CONTENT_TARGETS FreeRTOS) + FetchContent_MakeAvailable(FreeRTOS) set(LIB_OS_NAME FreeRTOS) - target_include_directories(FreeRTOS PRIVATE unittests/FreeRTOS-Config) + target_include_directories(FreeRTOS PUBLIC unittests/testcfg/freertos) + endif() project(${FSFW_TEST_TGT} CXX C) diff --git a/src/fsfw/osal/freertos/BinSemaphUsingTask.h b/src/fsfw/osal/freertos/BinSemaphUsingTask.h index 480296eee..340633314 100644 --- a/src/fsfw/osal/freertos/BinSemaphUsingTask.h +++ b/src/fsfw/osal/freertos/BinSemaphUsingTask.h @@ -40,7 +40,7 @@ class BinarySemaphoreUsingTask : public SemaphoreIF { void refreshTaskHandle(); ReturnValue_t acquire(TimeoutType timeoutType = TimeoutType::BLOCKING, - uint32_t timeoutMs = portMAX_DELAY) override; + uint32_t timeoutMs = 0) override; ReturnValue_t release() override; uint8_t getSemaphoreCounter() const override; static uint8_t getSemaphoreCounter(TaskHandle_t taskHandle); @@ -54,7 +54,7 @@ class BinarySemaphoreUsingTask : public SemaphoreIF { * - @c returnvalue::FAILED on failure */ ReturnValue_t acquireWithTickTimeout(TimeoutType timeoutType = TimeoutType::BLOCKING, - TickType_t timeoutTicks = portMAX_DELAY); + TickType_t timeoutTicks = portMAX_DELAY); /** * Get handle to the task related to the semaphore. diff --git a/src/fsfw/osal/freertos/BinarySemaphore.h b/src/fsfw/osal/freertos/BinarySemaphore.h index bd1148ece..abf5da16d 100644 --- a/src/fsfw/osal/freertos/BinarySemaphore.h +++ b/src/fsfw/osal/freertos/BinarySemaphore.h @@ -51,7 +51,7 @@ class BinarySemaphore : public SemaphoreIF { * -@c SemaphoreIF::SEMAPHORE_TIMEOUT on timeout */ ReturnValue_t acquire(TimeoutType timeoutType = TimeoutType::BLOCKING, - uint32_t timeoutMs = portMAX_DELAY) override; + uint32_t timeoutMs = 0) override; /** * Same as lockBinarySemaphore() with timeout in FreeRTOS ticks. diff --git a/src/fsfw/osal/freertos/CountingSemaphUsingTask.h b/src/fsfw/osal/freertos/CountingSemaphUsingTask.h index 4426f29b9..2fecfbbc5 100644 --- a/src/fsfw/osal/freertos/CountingSemaphUsingTask.h +++ b/src/fsfw/osal/freertos/CountingSemaphUsingTask.h @@ -34,7 +34,7 @@ class CountingSemaphoreUsingTask : public SemaphoreIF { * -@c SemaphoreIF::SEMAPHORE_TIMEOUT on timeout */ ReturnValue_t acquire(TimeoutType timeoutType = TimeoutType::BLOCKING, - uint32_t timeoutMs = portMAX_DELAY) override; + uint32_t timeoutMs = 0) override; /** * Release a semaphore, increasing the number of available counting diff --git a/src/fsfw/osal/freertos/FixedTimeslotTask.cpp b/src/fsfw/osal/freertos/FixedTimeslotTask.cpp index a0a4ecee3..ff111063e 100644 --- a/src/fsfw/osal/freertos/FixedTimeslotTask.cpp +++ b/src/fsfw/osal/freertos/FixedTimeslotTask.cpp @@ -56,7 +56,9 @@ ReturnValue_t FixedTimeslotTask::startTask() { // start time for the first entry. auto slotListIter = pollingSeqTable.current; - pollingSeqTable.intializeSequenceAfterTaskCreation(); + ReturnValue_t result = pollingSeqTable.intializeSequenceAfterTaskCreation(); + // Ignore returnvalue for now + static_cast(result); // The start time for the first entry is read. uint32_t intervalMs = slotListIter->pollingTimeMs; diff --git a/src/fsfw/osal/freertos/Mutex.cpp b/src/fsfw/osal/freertos/Mutex.cpp index 6c264dd69..1b2be77c9 100644 --- a/src/fsfw/osal/freertos/Mutex.cpp +++ b/src/fsfw/osal/freertos/Mutex.cpp @@ -22,7 +22,7 @@ ReturnValue_t Mutex::lockMutex(TimeoutType timeoutType, uint32_t timeoutMs) { return MutexIF::MUTEX_NOT_FOUND; } // If the timeout type is BLOCKING, this will be the correct value. - uint32_t timeout = portMAX_DELAY; + TickType_t timeout = portMAX_DELAY; if (timeoutType == TimeoutType::POLLING) { timeout = 0; } else if (timeoutType == TimeoutType::WAITING) { diff --git a/src/fsfw/osal/freertos/TaskManagement.cpp b/src/fsfw/osal/freertos/TaskManagement.cpp index 1879976cd..b09ff721b 100644 --- a/src/fsfw/osal/freertos/TaskManagement.cpp +++ b/src/fsfw/osal/freertos/TaskManagement.cpp @@ -3,16 +3,16 @@ void TaskManagement::vRequestContextSwitchFromTask() { vTaskDelay(0); } void TaskManagement::requestContextSwitch(CallContext callContext = CallContext::TASK) { - if (callContext == CallContext::ISR) { - // This function depends on the partmacro.h definition for the specific device - vRequestContextSwitchFromISR(); - } else { +// if (callContext == CallContext::ISR) { +// // This function depends on the partmacro.h definition for the specific device +// vRequestContextSwitchFromISR(); +// } else { vRequestContextSwitchFromTask(); - } +// } } TaskHandle_t TaskManagement::getCurrentTaskHandle() { return xTaskGetCurrentTaskHandle(); } -size_t TaskManagement::getTaskStackHighWatermark(TaskHandle_t task) { - return uxTaskGetStackHighWaterMark(task) * sizeof(StackType_t); -} +// size_t TaskManagement::getTaskStackHighWatermark(TaskHandle_t task) { +// return uxTaskGetStackHighWaterMark(task) * sizeof(StackType_t); +// } diff --git a/src/fsfw/osal/freertos/TaskManagement.h b/src/fsfw/osal/freertos/TaskManagement.h index 6dec15cce..44c8c0f39 100644 --- a/src/fsfw/osal/freertos/TaskManagement.h +++ b/src/fsfw/osal/freertos/TaskManagement.h @@ -11,7 +11,7 @@ * Architecture dependant portmacro.h function call. * Should be implemented in bsp. */ -extern "C" void vRequestContextSwitchFromISR(); +//extern "C" void vRequestContextSwitchFromISR(); /*! * Used by functions to tell if they are being called from @@ -53,7 +53,7 @@ TaskHandle_t getCurrentTaskHandle(); * @return Smallest value of stack remaining since the task was started in * words. */ -size_t getTaskStackHighWatermark(TaskHandle_t task = nullptr); +//size_t getTaskStackHighWatermark(TaskHandle_t task = nullptr); }; // namespace TaskManagement diff --git a/unittests/FreeRTOS-Config/FreeRTOSConfig.h b/unittests/FreeRTOS-Config/FreeRTOSConfig.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/unittests/testcfg/freertos/FreeRTOSConfig.h b/unittests/testcfg/freertos/FreeRTOSConfig.h new file mode 100644 index 000000000..ca470db0c --- /dev/null +++ b/unittests/testcfg/freertos/FreeRTOSConfig.h @@ -0,0 +1,104 @@ +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +#define configUSE_PREEMPTION 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#define configUSE_TICKLESS_IDLE 0 +#define configCPU_CLOCK_HZ 60000000 +#define configSYSTICK_CLOCK_HZ 1000000 +#define configTICK_RATE_HZ 250 +#define configMAX_PRIORITIES 5 +#define configMINIMAL_STACK_SIZE 128 +#define configMAX_TASK_NAME_LEN 16 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_TASK_NOTIFICATIONS 1 +#define configTASK_NOTIFICATION_ARRAY_ENTRIES 3 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 0 +#define configUSE_COUNTING_SEMAPHORES 0 +#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ +#define configQUEUE_REGISTRY_SIZE 10 +#define configUSE_QUEUE_SETS 0 +#define configUSE_TIME_SLICING 0 +#define configUSE_NEWLIB_REENTRANT 0 +#define configENABLE_BACKWARD_COMPATIBILITY 1 +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5 +#define configUSE_MINI_LIST_ITEM 1 +#define configSTACK_DEPTH_TYPE uint16_t +#define configMESSAGE_BUFFER_LENGTH_TYPE size_t +#define configHEAP_CLEAR_MEMORY_ON_FREE 1 + +/* Memory allocation related definitions. */ +#define configSUPPORT_STATIC_ALLOCATION 0 +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configTOTAL_HEAP_SIZE 10240 +#define configAPPLICATION_ALLOCATED_HEAP 1 +#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0 + +/* Hook function related definitions. */ +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 0 +#define configUSE_MALLOC_FAILED_HOOK 0 +#define configUSE_DAEMON_TASK_STARTUP_HOOK 0 +#define configUSE_SB_COMPLETED_CALLBACK 0 + +/* Run time and task stats gathering related definitions. */ +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_TRACE_FACILITY 0 +#define configUSE_STATS_FORMATTING_FUNCTIONS 0 + +/* Co-routine related definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES 1 + +/* Software timer related definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY 3 +#define configTIMER_QUEUE_LENGTH 10 +#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE + +/* Interrupt nesting behaviour configuration. */ +#define configKERNEL_INTERRUPT_PRIORITY [dependent of processor] +#define configMAX_SYSCALL_INTERRUPT_PRIORITY [dependent on processor and application] +#define configMAX_API_CALL_INTERRUPT_PRIORITY [dependent on processor and application] + +/* Define to trap errors during development. */ +//#define configASSERT( ( x ) ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ ) + +/* FreeRTOS MPU specific definitions. */ +#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#define configTOTAL_MPU_REGIONS 8 /* Default value. */ +#define configTEX_S_C_B_FLASH 0x07UL /* Default value. */ +#define configTEX_S_C_B_SRAM 0x07UL /* Default value. */ +#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 1 +#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 +#define configENABLE_ERRATA_837070_WORKAROUND 1 + +/* ARMv8-M secure side port related definitions. */ +#define secureconfigMAX_SECURE_CONTEXTS 5 + +/* Optional functions - most linkers will remove unused functions anyway. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_xResumeFromISR 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 0 +#define INCLUDE_uxTaskGetStackHighWaterMark2 0 +#define INCLUDE_xTaskGetIdleTaskHandle 0 +#define INCLUDE_eTaskGetState 0 +#define INCLUDE_xEventGroupSetBitFromISR 1 +#define INCLUDE_xTimerPendFunctionCall 0 +#define INCLUDE_xTaskAbortDelay 0 +#define INCLUDE_xTaskGetHandle 0 +#define INCLUDE_xTaskResumeFromISR 1 + +/* A header file that defines trace macro can be included here. */ + +#endif /* FREERTOS_CONFIG_H */ \ No newline at end of file -- 2.34.1 From 552a12a6ad8d57a915e7f05554a624a46eb29418 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 28 Nov 2022 08:30:45 +0100 Subject: [PATCH 03/12] updates for source sequence counter --- src/fsfw/tmtcservices/SourceSequenceCounter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsfw/tmtcservices/SourceSequenceCounter.h b/src/fsfw/tmtcservices/SourceSequenceCounter.h index f530b4445..43b6945ca 100644 --- a/src/fsfw/tmtcservices/SourceSequenceCounter.h +++ b/src/fsfw/tmtcservices/SourceSequenceCounter.h @@ -11,7 +11,7 @@ class SourceSequenceCounter { SourceSequenceCounter(uint16_t initialSequenceCount = 0) : sequenceCount(initialSequenceCount) {} void increment() { sequenceCount = (sequenceCount + 1) % (ccsds::LIMIT_SEQUENCE_COUNT); } void decrement() { sequenceCount = (sequenceCount - 1) % (ccsds::LIMIT_SEQUENCE_COUNT); } - uint16_t get() const { return this->sequenceCount; } + uint16_t get() { return this->sequenceCount; } void reset(uint16_t toValue = 0) { sequenceCount = toValue % (ccsds::LIMIT_SEQUENCE_COUNT); } SourceSequenceCounter& operator++(int) { this->increment(); -- 2.34.1 From fe9cc20d0013c9da67cb71a9e8f1e1a53b7557bc Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 19 Dec 2022 14:58:08 +0100 Subject: [PATCH 04/12] make get const --- src/fsfw/tmtcservices/SourceSequenceCounter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsfw/tmtcservices/SourceSequenceCounter.h b/src/fsfw/tmtcservices/SourceSequenceCounter.h index 43b6945ca..f530b4445 100644 --- a/src/fsfw/tmtcservices/SourceSequenceCounter.h +++ b/src/fsfw/tmtcservices/SourceSequenceCounter.h @@ -11,7 +11,7 @@ class SourceSequenceCounter { SourceSequenceCounter(uint16_t initialSequenceCount = 0) : sequenceCount(initialSequenceCount) {} void increment() { sequenceCount = (sequenceCount + 1) % (ccsds::LIMIT_SEQUENCE_COUNT); } void decrement() { sequenceCount = (sequenceCount - 1) % (ccsds::LIMIT_SEQUENCE_COUNT); } - uint16_t get() { return this->sequenceCount; } + uint16_t get() const { return this->sequenceCount; } void reset(uint16_t toValue = 0) { sequenceCount = toValue % (ccsds::LIMIT_SEQUENCE_COUNT); } SourceSequenceCounter& operator++(int) { this->increment(); -- 2.34.1 From a993c4e0d4d02b416a3e41e99a01238dec0dd9d9 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Thu, 12 Jan 2023 15:40:52 +0100 Subject: [PATCH 05/12] adding linux ci and fixing problems --- automation/Jenkinsfile | 96 +++++++++++++------ src/fsfw/events/EventManager.cpp | 6 ++ src/fsfw/events/EventManager.h | 1 + src/fsfw/events/EventManagerIF.h | 1 + src/fsfw/fdir/FailureIsolationBase.cpp | 2 +- src/fsfw/globalfunctions/matching/MatchTree.h | 41 +++++++- src/fsfw/health/HealthTable.cpp | 2 - .../internalerror/InternalErrorReporter.cpp | 7 +- src/fsfw/objectmanager/ObjectManager.cpp | 18 +++- src/fsfw/objectmanager/ObjectManager.h | 10 +- src/fsfw/osal/CMakeLists.txt | 10 +- src/fsfw/osal/linux/MessageQueue.cpp | 2 +- src/fsfw/osal/osal.h.in | 36 +++++++ unittests/CatchSetup.cpp | 5 +- .../devicehandler/DeviceHandlerCommander.cpp | 4 +- unittests/osal/TestSemaphore.cpp | 68 ++++++------- 16 files changed, 230 insertions(+), 79 deletions(-) create mode 100644 src/fsfw/osal/osal.h.in diff --git a/automation/Jenkinsfile b/automation/Jenkinsfile index 271366062..64c32237f 100644 --- a/automation/Jenkinsfile +++ b/automation/Jenkinsfile @@ -1,45 +1,87 @@ pipeline { environment { - BUILDDIR = 'cmake-build-tests' + BUILDDIR_HOST = 'cmake-build-tests-host' + BUILDDIR_LINUX = 'cmake-build-tests-linux' DOCDDIR = 'cmake-build-documentation' } agent { docker { image 'fsfw-ci:d6' - args '--network host' + args '--network host --sysctl fs.mqueue.msg_max=100' } } stages { - stage('Clean') { - steps { - sh 'rm -rf $BUILDDIR' - } - } - stage('Configure') { - steps { - dir(BUILDDIR) { - sh 'cmake -DFSFW_OSAL=host -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..' + stage('Host') { + stages{ + stage('Clean') { + steps { + sh 'rm -rf $BUILDDIR_HOST' + } + } + stage('Configure') { + steps { + dir(BUILDDIR_HOST) { + sh 'cmake -DFSFW_OSAL=host -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..' + } + } + } + stage('Build') { + steps { + dir(BUILDDIR_HOST) { + sh 'cmake --build . -j4' + } + } + } + stage('Unittests') { + steps { + dir(BUILDDIR_HOST) { + sh 'cmake --build . -- fsfw-tests_coverage -j4' + } + } + } + stage('Valgrind') { + steps { + dir(BUILDDIR_HOST) { + sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests' + } + } } } } - stage('Build') { - steps { - dir(BUILDDIR) { - sh 'cmake --build . -j4' + stage('Linux') { + stages{ + stage('Clean') { + steps { + sh 'rm -rf $BUILDDIR_LINUX' + } } - } - } - stage('Unittests') { - steps { - dir(BUILDDIR) { - sh 'cmake --build . -- fsfw-tests_coverage -j4' + stage('Configure') { + steps { + dir(BUILDDIR_LINUX) { + sh 'cmake -DFSFW_OSAL=linux -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..' + } + } } - } - } - stage('Valgrind') { - steps { - dir(BUILDDIR) { - sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests' + stage('Build') { + steps { + dir(BUILDDIR_LINUX) { + sh 'cmake --build . -j4' + } + } + } + stage('Unittests') { + steps { + dir(BUILDDIR_LINUX) { + sh 'cmake --build . -- fsfw-tests_coverage -j4' + } + } + } + stage('Valgrind') { + steps { + dir(BUILDDIR_LINUX) { + sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests' + } + } } } } diff --git a/src/fsfw/events/EventManager.cpp b/src/fsfw/events/EventManager.cpp index f44668176..8bd26282a 100644 --- a/src/fsfw/events/EventManager.cpp +++ b/src/fsfw/events/EventManager.cpp @@ -23,6 +23,7 @@ EventManager::EventManager(object_id_t setObjectId) } EventManager::~EventManager() { + listenerList.clear(); QueueFactory::instance()->deleteMessageQueue(eventReportQueue); MutexFactory::instance()->deleteMutex(mutex); } @@ -61,9 +62,14 @@ ReturnValue_t EventManager::registerListener(MessageQueueId_t listener, if (!result.second) { return returnvalue::FAILED; } + return returnvalue::OK; } +ReturnValue_t EventManager::unregisterListener(MessageQueueId_t listener) { + return listenerList.erase(listener) == 1 ? returnvalue::OK : returnvalue::FAILED; +} + ReturnValue_t EventManager::subscribeToEvent(MessageQueueId_t listener, EventId_t event) { return subscribeToEventRange(listener, event); } diff --git a/src/fsfw/events/EventManager.h b/src/fsfw/events/EventManager.h index 70245f5d1..0e6dace04 100644 --- a/src/fsfw/events/EventManager.h +++ b/src/fsfw/events/EventManager.h @@ -31,6 +31,7 @@ class EventManager : public EventManagerIF, public ExecutableObjectIF, public Sy MessageQueueId_t getEventReportQueue(); ReturnValue_t registerListener(MessageQueueId_t listener, bool forwardAllButSelected = false); + ReturnValue_t unregisterListener(MessageQueueId_t listener) override; ReturnValue_t subscribeToEvent(MessageQueueId_t listener, EventId_t event); ReturnValue_t subscribeToAllEventsFrom(MessageQueueId_t listener, object_id_t object); ReturnValue_t subscribeToEventRange(MessageQueueId_t listener, EventId_t idFrom = 0, diff --git a/src/fsfw/events/EventManagerIF.h b/src/fsfw/events/EventManagerIF.h index adb61f2b1..12014090a 100644 --- a/src/fsfw/events/EventManagerIF.h +++ b/src/fsfw/events/EventManagerIF.h @@ -18,6 +18,7 @@ class EventManagerIF { virtual ReturnValue_t registerListener(MessageQueueId_t listener, bool forwardAllButSelected = false) = 0; + virtual ReturnValue_t unregisterListener(MessageQueueId_t listener) = 0; virtual ReturnValue_t subscribeToEvent(MessageQueueId_t listener, EventId_t event) = 0; virtual ReturnValue_t subscribeToAllEventsFrom(MessageQueueId_t listener, object_id_t object) = 0; virtual ReturnValue_t unsubscribeFromAllEvents(MessageQueueId_t listener, object_id_t object) = 0; diff --git a/src/fsfw/fdir/FailureIsolationBase.cpp b/src/fsfw/fdir/FailureIsolationBase.cpp index 28df16d89..0d3b02149 100644 --- a/src/fsfw/fdir/FailureIsolationBase.cpp +++ b/src/fsfw/fdir/FailureIsolationBase.cpp @@ -23,7 +23,7 @@ FailureIsolationBase::~FailureIsolationBase() { #endif return; } - manager->unsubscribeFromAllEvents(eventQueue->getId(), ownerId); + manager->unregisterListener(eventQueue->getId()); QueueFactory::instance()->deleteMessageQueue(eventQueue); } diff --git a/src/fsfw/globalfunctions/matching/MatchTree.h b/src/fsfw/globalfunctions/matching/MatchTree.h index 0c31cf2a5..69f660d30 100644 --- a/src/fsfw/globalfunctions/matching/MatchTree.h +++ b/src/fsfw/globalfunctions/matching/MatchTree.h @@ -24,7 +24,7 @@ class MatchTree : public SerializeableMatcherIF, public BinaryTree>(root.element), maxDepth(maxDepth) {} MatchTree() : BinaryTree>(), maxDepth(-1) {} - virtual ~MatchTree() {} + virtual ~MatchTree() { clear(); } virtual bool match(T number) override { return matchesTree(number); } bool matchesTree(T number) { iterator iter = this->begin(); @@ -176,6 +176,45 @@ class MatchTree : public SerializeableMatcherIF, public BinaryTree>::rootNode; + + if (localRoot == nullptr) { + return; + } + + Node* node = localRoot->left; + + while (true) { + if (node->left != nullptr) { + node = node->left; + continue; + } + if (node->right != nullptr) { + node = node->right; + continue; + } + if (node->parent == nullptr) { + // this is the root node with no children + if (node->value != nullptr) { + cleanUpElement(iterator(node)); + } + return; + } + // leaf + { + Node* parent = node->parent; + if (parent->left == node) { + parent->left = nullptr; + } else { + parent->right = nullptr; + } + cleanUpElement(iterator(node)); + node = parent; + } + } + } + virtual ReturnValue_t cleanUpElement(iterator position) { return returnvalue::OK; } bool matchSubtree(iterator iter, T number) { diff --git a/src/fsfw/health/HealthTable.cpp b/src/fsfw/health/HealthTable.cpp index 5fb45fb9f..3fcf7f77e 100644 --- a/src/fsfw/health/HealthTable.cpp +++ b/src/fsfw/health/HealthTable.cpp @@ -6,8 +6,6 @@ HealthTable::HealthTable(object_id_t objectid) : SystemObject(objectid) { mutex = MutexFactory::instance()->createMutex(); - ; - mapIterator = healthMap.begin(); } diff --git a/src/fsfw/internalerror/InternalErrorReporter.cpp b/src/fsfw/internalerror/InternalErrorReporter.cpp index b3b77366d..fb2dc8a61 100644 --- a/src/fsfw/internalerror/InternalErrorReporter.cpp +++ b/src/fsfw/internalerror/InternalErrorReporter.cpp @@ -7,14 +7,17 @@ InternalErrorReporter::InternalErrorReporter(object_id_t setObjectId, uint32_t messageQueueDepth) : SystemObject(setObjectId), - commandQueue(QueueFactory::instance()->createMessageQueue(messageQueueDepth)), poolManager(this, commandQueue), internalErrorSid(setObjectId, InternalErrorDataset::ERROR_SET_ID), internalErrorDataset(this) { + commandQueue = QueueFactory::instance()->createMessageQueue(messageQueueDepth); mutex = MutexFactory::instance()->createMutex(); } -InternalErrorReporter::~InternalErrorReporter() { MutexFactory::instance()->deleteMutex(mutex); } +InternalErrorReporter::~InternalErrorReporter() { + MutexFactory::instance()->deleteMutex(mutex); + QueueFactory::instance()->deleteMessageQueue(commandQueue); +} void InternalErrorReporter::setDiagnosticPrintout(bool enable) { this->diagnosticPrintout = enable; diff --git a/src/fsfw/objectmanager/ObjectManager.cpp b/src/fsfw/objectmanager/ObjectManager.cpp index ddf5ab802..29c1b2fcc 100644 --- a/src/fsfw/objectmanager/ObjectManager.cpp +++ b/src/fsfw/objectmanager/ObjectManager.cpp @@ -23,9 +23,17 @@ void ObjectManager::setObjectFactoryFunction(produce_function_t objFactoryFunc, ObjectManager::ObjectManager() = default; +void ObjectManager::clear() { + if (objManagerInstance != nullptr) { + delete objManagerInstance; + objManagerInstance = nullptr; + } +} + ObjectManager::~ObjectManager() { - for (auto const& iter : objectList) { - delete iter.second; + teardown = true; + for (auto iter = objectList.begin(); iter != objectList.end(); iter = objectList.erase(iter)) { + delete iter->second; } } @@ -53,6 +61,12 @@ ReturnValue_t ObjectManager::insert(object_id_t id, SystemObjectIF* object) { } ReturnValue_t ObjectManager::remove(object_id_t id) { + // this function is called during destruction of System Objects + // disabeld for teardown to avoid iterator invalidation and + // double free + if (teardown) { + return returnvalue::OK; + } if (this->getSystemObject(id) != nullptr) { this->objectList.erase(id); #if FSFW_CPP_OSTREAM_ENABLED == 1 diff --git a/src/fsfw/objectmanager/ObjectManager.h b/src/fsfw/objectmanager/ObjectManager.h index e0e747924..355f5d0a4 100644 --- a/src/fsfw/objectmanager/ObjectManager.h +++ b/src/fsfw/objectmanager/ObjectManager.h @@ -24,12 +24,17 @@ class ObjectManager : public ObjectManagerIF { using produce_function_t = void (*)(void* args); /** - * Returns the single instance of TaskFactory. + * Returns the single instance of ObjectManager. * The implementation of #instance is found in its subclasses. * Thus, we choose link-time variability of the instance. */ static ObjectManager* instance(); + /** + * Deletes the single instance of ObjectManager + */ + static void clear(); + void setObjectFactoryFunction(produce_function_t prodFunc, void* args); template @@ -66,6 +71,9 @@ class ObjectManager : public ObjectManagerIF { */ std::map objectList; static ObjectManager* objManagerInstance; + // used when the OM itself is deleted to modify behaviour of remove() + // to avoid iterator invalidation and double free + bool teardown = false; }; // Documentation can be found in the class method declaration above diff --git a/src/fsfw/osal/CMakeLists.txt b/src/fsfw/osal/CMakeLists.txt index 50fd61025..a40976496 100644 --- a/src/fsfw/osal/CMakeLists.txt +++ b/src/fsfw/osal/CMakeLists.txt @@ -1,10 +1,13 @@ # Check the OS_FSFW variable if(FSFW_OSAL MATCHES "freertos") add_subdirectory(freertos) + set(FSFW_OSAL_FREERTOS 1) elseif(FSFW_OSAL MATCHES "rtems") add_subdirectory(rtems) + set(FSFW_OSAL_RTEMS 1) elseif(FSFW_OSAL MATCHES "linux") add_subdirectory(linux) + set(FSFW_OSAL_LINUX 1) elseif(FSFW_OSAL MATCHES "host") add_subdirectory(host) if(WIN32) @@ -13,16 +16,17 @@ elseif(FSFW_OSAL MATCHES "host") # We still need to pull in some Linux specific sources target_sources(${LIB_FSFW_NAME} PUBLIC linux/tcpipHelpers.cpp) endif() - + set(FSFW_OSAL_HOST 1) else() - message(WARNING "The OS_FSFW variable was not set. Assuming host OS..") # Not set. Assumuing this is a host build, try to determine host OS if(WIN32) add_subdirectory(host) add_subdirectory(windows) + set(FSFW_OSAL_HOST 1) elseif(UNIX) add_subdirectory(linux) + set(FSFW_OSAL_LINUX 1) else() # MacOS or other OSes have not been tested yet / are not supported. message(FATAL_ERROR "The host OS could not be determined! Aborting.") @@ -31,3 +35,5 @@ else() endif() add_subdirectory(common) + +configure_file(osal.h.in ${CMAKE_BINARY_DIR}/fsfw/osal/osal.h) diff --git a/src/fsfw/osal/linux/MessageQueue.cpp b/src/fsfw/osal/linux/MessageQueue.cpp index b2cca3f1c..c08e37752 100644 --- a/src/fsfw/osal/linux/MessageQueue.cpp +++ b/src/fsfw/osal/linux/MessageQueue.cpp @@ -21,7 +21,7 @@ MessageQueue::MessageQueue(uint32_t messageDepth, size_t maxMessageSize, MqArgs* attributes.mq_msgsize = maxMessageSize; attributes.mq_flags = 0; // Flags are ignored on Linux during mq_open // Set the name of the queue. The slash is mandatory! - sprintf(name, "/FSFW_MQ%u\n", queueCounter++); + sprintf(name, "/FSFW_MQ%u", queueCounter++); // Create a nonblocking queue if the name is available (the queue is read // and writable for the owner as well as the group) diff --git a/src/fsfw/osal/osal.h.in b/src/fsfw/osal/osal.h.in new file mode 100644 index 000000000..8e48c31a5 --- /dev/null +++ b/src/fsfw/osal/osal.h.in @@ -0,0 +1,36 @@ +#pragma once + +namespace osal { + enum osalTarget{ + HOST, + LINUX, + WINDOWS, + FREERTOS, + RTEMS, + }; + +#cmakedefine FSFW_OSAL_HOST +#cmakedefine FSFW_OSAL_LINUX +#cmakedefine FSFW_OSAL_WINDOWS +#cmakedefine FSFW_OSAL_FREERTOS +#cmakedefine FSFW_OSAL_RTEMS + + + constexpr osalTarget getTarget() { +#ifdef FSFW_OSAL_HOST + return HOST; +#endif +#ifdef FSFW_OSAL_LINUX + return LINUX; +#endif +#ifdef FSFW_OSAL_WINDOWS + return WINDOWS; +#endif +#ifdef FSFW_OSAL_FREERTOS + return FREERTOS; +#endif +#ifdef FSFW_OSAL_RTEMS + return RTEMS; +#endif + } +}; \ No newline at end of file diff --git a/unittests/CatchSetup.cpp b/unittests/CatchSetup.cpp index 4f2a4a54b..fc5bb3f57 100644 --- a/unittests/CatchSetup.cpp +++ b/unittests/CatchSetup.cpp @@ -31,4 +31,7 @@ int customSetup() { return 0; } -int customTeardown() { return 0; } +int customTeardown() { + ObjectManager::clear(); + return 0; +} diff --git a/unittests/devicehandler/DeviceHandlerCommander.cpp b/unittests/devicehandler/DeviceHandlerCommander.cpp index 03ff992cf..835faf2b2 100644 --- a/unittests/devicehandler/DeviceHandlerCommander.cpp +++ b/unittests/devicehandler/DeviceHandlerCommander.cpp @@ -9,7 +9,9 @@ DeviceHandlerCommander::DeviceHandlerCommander(object_id_t objectId) QUEUE_SIZE, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } -DeviceHandlerCommander::~DeviceHandlerCommander() {} +DeviceHandlerCommander::~DeviceHandlerCommander() { + QueueFactory::instance()->deleteMessageQueue(commandQueue); +} ReturnValue_t DeviceHandlerCommander::performOperation(uint8_t operationCode) { readCommandQueue(); diff --git a/unittests/osal/TestSemaphore.cpp b/unittests/osal/TestSemaphore.cpp index 376b08dbe..1d8758b18 100644 --- a/unittests/osal/TestSemaphore.cpp +++ b/unittests/osal/TestSemaphore.cpp @@ -1,46 +1,38 @@ - -#ifdef LINUX - -/* +#include #include #include -#include "catch.hpp" -#include "core/CatchDefinitions.h" +#include -TEST_CASE("Binary Semaphore Test" , "[BinSemaphore]") { - //perform set-up here - SemaphoreIF* binSemaph = SemaphoreFactory::instance()-> - createBinarySemaphore(); - REQUIRE(binSemaph != nullptr); - SECTION("Simple Test") { - // set-up is run for each section - REQUIRE(binSemaph->getSemaphoreCounter() == 1); - REQUIRE(binSemaph->release() == - static_cast(SemaphoreIF::SEMAPHORE_NOT_OWNED)); - REQUIRE(binSemaph->acquire(SemaphoreIF::POLLING) == - result::OK); - { - // not precise enough on linux.. should use clock instead.. - //Stopwatch stopwatch(false); - //REQUIRE(binSemaph->acquire(SemaphoreIF::TimeoutType::WAITING, 5) == - // SemaphoreIF::SEMAPHORE_TIMEOUT); - //dur_millis_t time = stopwatch.stop(); - //CHECK(time == 5); - } - REQUIRE(binSemaph->getSemaphoreCounter() == 0); - REQUIRE(binSemaph->release() == result::OK); - } - SemaphoreFactory::instance()->deleteSemaphore(binSemaph); - // perform tear-down here +// binary semaphores currently only supported on linux +#ifdef FSFW_OSAL_LINUX + +TEST_CASE("Binary Semaphore Test", "[BinSemaphore]") { + // perform set-up here + SemaphoreIF* binSemaph = SemaphoreFactory::instance()->createBinarySemaphore(); + REQUIRE(binSemaph != nullptr); + SECTION("Simple Test") { + // set-up is run for each section + REQUIRE(binSemaph->getSemaphoreCounter() == 1); + REQUIRE(binSemaph->release() == static_cast(SemaphoreIF::SEMAPHORE_NOT_OWNED)); + REQUIRE(binSemaph->acquire(SemaphoreIF::POLLING) == returnvalue::OK); + { + // not precise enough on linux.. should use clock instead.. + // Stopwatch stopwatch(false); + // REQUIRE(binSemaph->acquire(SemaphoreIF::TimeoutType::WAITING, 5) == + // SemaphoreIF::SEMAPHORE_TIMEOUT); + // dur_millis_t time = stopwatch.stop(); + // CHECK(time == 5); + } + REQUIRE(binSemaph->getSemaphoreCounter() == 0); + REQUIRE(binSemaph->release() == returnvalue::OK); + } + SemaphoreFactory::instance()->deleteSemaphore(binSemaph); + // perform tear-down here } - -TEST_CASE("Counting Semaphore Test" , "[CountingSemaph]") { - SECTION("Simple Test") { - - } +TEST_CASE("Counting Semaphore Test", "[CountingSemaph]") { + SECTION("Simple Test") {} } -*/ -#endif +#endif \ No newline at end of file -- 2.34.1 From 39dad5f45b8bd4ee4a256d510d75ead86ccae2a9 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Fri, 13 Jan 2023 12:48:14 +0100 Subject: [PATCH 06/12] unittests running but failing --- CMakeLists.txt | 6 ++- unittests/CatchRunner.cpp | 42 ++++++++++++++++++++- unittests/CatchSetup.cpp | 2 + unittests/osal/TestSemaphore.cpp | 2 +- unittests/testcfg/freertos/FreeRTOSConfig.h | 2 +- 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 41be31e0c..b22ffe464 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,7 +174,7 @@ if(FSFW_BUILD_TESTS) configure_file(unittests/testcfg/FSFWConfig.h.in FSFWConfig.h) configure_file(unittests/testcfg/TestsConfig.h.in tests/TestsConfig.h) - if(FSFW_OSAL MATCHES "freertos") + if(FSFW_OSAL MATCHES "freertos") message( STATUS "${MSG_PREFIX} Downloading FreeRTOS with FetchContent" @@ -193,7 +193,6 @@ if(FSFW_BUILD_TESTS) set(LIB_OS_NAME FreeRTOS) target_include_directories(FreeRTOS PUBLIC unittests/testcfg/freertos) - endif() project(${FSFW_TEST_TGT} CXX C) @@ -385,6 +384,9 @@ if(FSFW_BUILD_TESTS) endif() target_link_libraries(${FSFW_TEST_TGT} PRIVATE Catch2::Catch2 ${LIB_FSFW_NAME}) + if(FSFW_OSAL MATCHES "freertos") + target_link_libraries(${FSFW_TEST_TGT} PRIVATE FreeRTOS) + endif() endif() # The project CMakeLists file has to set the FSFW_CONFIG_PATH and add it. If diff --git a/unittests/CatchRunner.cpp b/unittests/CatchRunner.cpp index 9bdcb676a..5149f8b53 100644 --- a/unittests/CatchRunner.cpp +++ b/unittests/CatchRunner.cpp @@ -11,15 +11,55 @@ #define CATCH_CONFIG_COLOUR_WINDOWS #include +#include + +#ifdef FSFW_OSAL_FREERTOS + #include + #include "task.h" +#endif extern int customSetup(); extern int customTeardown(); + +#ifdef FSFW_OSAL_FREERTOS +struct Taskparameters { + int argc; char** argv; +} taskParameters; + +void unittestTaskFunction( void *pvParameters ) { + puts("go"); + Taskparameters* parameters = (Taskparameters*)pvParameters; + int result = Catch::Session().run(parameters->argc, parameters->argv); + puts("gone"); + vTaskDelete( NULL ); +} +#endif + + int main(int argc, char* argv[]) { customSetup(); + int result = 0; + + puts("pre"); + + #ifdef FSFW_OSAL_FREERTOS + puts("task"); + xTaskCreate( unittestTaskFunction, /* The function that implements the task. */ + "Unittests", /* The text name assigned to the task - for debug only as it is not used by the kernel. */ + configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */ + &taskParameters, /* The parameter passed to the task - not used in this simple case. */ + 1, /* The priority assigned to the task. */ + NULL ); /* The task handle is not required, so NULL is passed. */ + taskParameters.argc = argc; + taskParameters.argv = argv; + vTaskStartScheduler(); + #else + puts("nom"); // Catch internal function call - int result = Catch::Session().run(argc, argv); + result = Catch::Session().run(argc, argv); + #endif // global clean-up customTeardown(); diff --git a/unittests/CatchSetup.cpp b/unittests/CatchSetup.cpp index fc5bb3f57..cbed8029e 100644 --- a/unittests/CatchSetup.cpp +++ b/unittests/CatchSetup.cpp @@ -6,6 +6,8 @@ #include #endif + + #include "fsfw/objectmanager/ObjectManager.h" #include "fsfw/serviceinterface/ServiceInterface.h" #include "fsfw/storagemanager/StorageManagerIF.h" diff --git a/unittests/osal/TestSemaphore.cpp b/unittests/osal/TestSemaphore.cpp index 1d8758b18..6bf63f6a8 100644 --- a/unittests/osal/TestSemaphore.cpp +++ b/unittests/osal/TestSemaphore.cpp @@ -5,7 +5,7 @@ #include // binary semaphores currently only supported on linux -#ifdef FSFW_OSAL_LINUX +#if defined(FSFW_OSAL_LINUX) || defined(FSFW_OSAL_FREERTOS) TEST_CASE("Binary Semaphore Test", "[BinSemaphore]") { // perform set-up here diff --git a/unittests/testcfg/freertos/FreeRTOSConfig.h b/unittests/testcfg/freertos/FreeRTOSConfig.h index ca470db0c..0c4d78f8a 100644 --- a/unittests/testcfg/freertos/FreeRTOSConfig.h +++ b/unittests/testcfg/freertos/FreeRTOSConfig.h @@ -16,7 +16,7 @@ #define configTASK_NOTIFICATION_ARRAY_ENTRIES 3 #define configUSE_MUTEXES 1 #define configUSE_RECURSIVE_MUTEXES 0 -#define configUSE_COUNTING_SEMAPHORES 0 +#define configUSE_COUNTING_SEMAPHORES 1 #define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ #define configQUEUE_REGISTRY_SIZE 10 #define configUSE_QUEUE_SETS 0 -- 2.34.1 From 47d85fb61cb66f2f0418d2de4d222a847697846a Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Fri, 13 Jan 2023 16:30:47 +0100 Subject: [PATCH 07/12] finished freertos unittests, valgrind not happy yet --- automation/Jenkinsfile | 93 +++++++-------------- src/fsfw/osal/freertos/Clock.cpp | 6 +- src/fsfw/timemanager/CCSDSTime.cpp | 5 +- unittests/CatchRunner.cpp | 18 ++-- unittests/osal/TestClock.cpp | 2 + unittests/testcfg/freertos/FreeRTOSConfig.h | 10 +-- 6 files changed, 48 insertions(+), 86 deletions(-) diff --git a/automation/Jenkinsfile b/automation/Jenkinsfile index 64c32237f..b97c3a9a8 100644 --- a/automation/Jenkinsfile +++ b/automation/Jenkinsfile @@ -2,6 +2,7 @@ pipeline { environment { BUILDDIR_HOST = 'cmake-build-tests-host' BUILDDIR_LINUX = 'cmake-build-tests-linux' + BUILDDIR_FREERTOS = 'cmake-build-tests-freertos' DOCDDIR = 'cmake-build-documentation' } agent { @@ -12,76 +13,38 @@ pipeline { } stages { stage('Host') { - stages{ - stage('Clean') { - steps { - sh 'rm -rf $BUILDDIR_HOST' - } - } - stage('Configure') { - steps { - dir(BUILDDIR_HOST) { - sh 'cmake -DFSFW_OSAL=host -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..' - } - } - } - stage('Build') { - steps { - dir(BUILDDIR_HOST) { - sh 'cmake --build . -j4' - } - } - } - stage('Unittests') { - steps { - dir(BUILDDIR_HOST) { - sh 'cmake --build . -- fsfw-tests_coverage -j4' - } - } - } - stage('Valgrind') { - steps { - dir(BUILDDIR_HOST) { - sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests' - } - } + steps { + sh 'rm -rf $BUILDDIR_HOST' + + dir(BUILDDIR_LINUX) { + sh 'cmake -DFSFW_OSAL=host -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..' + sh 'cmake --build . -j4' + sh 'cmake --build . -- fsfw-tests_coverage -j4' + sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests' } } } stage('Linux') { - stages{ - stage('Clean') { - steps { - sh 'rm -rf $BUILDDIR_LINUX' - } + steps { + sh 'rm -rf $BUILDDIR_HOST' + + dir(BUILDDIR_HOST) { + sh 'cmake -DFSFW_OSAL=linux -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..' + sh 'cmake --build . -j4' + sh 'cmake --build . -- fsfw-tests_coverage -j4' + sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests' } - stage('Configure') { - steps { - dir(BUILDDIR_LINUX) { - sh 'cmake -DFSFW_OSAL=linux -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..' - } - } - } - stage('Build') { - steps { - dir(BUILDDIR_LINUX) { - sh 'cmake --build . -j4' - } - } - } - stage('Unittests') { - steps { - dir(BUILDDIR_LINUX) { - sh 'cmake --build . -- fsfw-tests_coverage -j4' - } - } - } - stage('Valgrind') { - steps { - dir(BUILDDIR_LINUX) { - sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests' - } - } + } + } + stage('FreeRTOS') { + steps { + sh 'rm -rf $BUILDDIR_FREERTOS' + + dir(BUILDDIR_FREERTOS) { + sh 'cmake -DFSFW_OSAL=freertos -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..' + sh 'cmake --build . -j4' + sh 'cmake --build . -- fsfw-tests_coverage -j4' + //sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests' } } } diff --git a/src/fsfw/osal/freertos/Clock.cpp b/src/fsfw/osal/freertos/Clock.cpp index dc00ac7ea..4ff340f56 100644 --- a/src/fsfw/osal/freertos/Clock.cpp +++ b/src/fsfw/osal/freertos/Clock.cpp @@ -110,11 +110,13 @@ ReturnValue_t Clock::convertTimeOfDayToTimeval(const TimeOfDay_t* from, timeval* time_tm.tm_min = from->minute; time_tm.tm_sec = from->second; - time_t seconds = mktime(&time_tm); + time_tm.tm_isdst = 0; + + time_t seconds = timegm(&time_tm); to->tv_sec = seconds; to->tv_usec = from->usecond; - // Fails in 2038.. + return returnvalue::OK; } diff --git a/src/fsfw/timemanager/CCSDSTime.cpp b/src/fsfw/timemanager/CCSDSTime.cpp index cb0d57587..4ee5362a5 100644 --- a/src/fsfw/timemanager/CCSDSTime.cpp +++ b/src/fsfw/timemanager/CCSDSTime.cpp @@ -552,10 +552,7 @@ ReturnValue_t CCSDSTime::convertFromCDS(timeval* to, const CCSDSTime::CDS_short* if (to == nullptr or from == nullptr) { return returnvalue::FAILED; } - uint16_t days = (from->dayMSB << 8) + from->dayLSB; - if (days <= DAYS_CCSDS_TO_UNIX_EPOCH) { - return INVALID_TIME_FORMAT; - } + int32_t days = (from->dayMSB << 8) + from->dayLSB; days -= DAYS_CCSDS_TO_UNIX_EPOCH; to->tv_sec = days * SECONDS_PER_DAY; uint32_t msDay = diff --git a/unittests/CatchRunner.cpp b/unittests/CatchRunner.cpp index 5149f8b53..8478efbf6 100644 --- a/unittests/CatchRunner.cpp +++ b/unittests/CatchRunner.cpp @@ -24,15 +24,19 @@ extern int customTeardown(); #ifdef FSFW_OSAL_FREERTOS struct Taskparameters { - int argc; char** argv; + int argc; char** argv;TaskHandle_t catchTask; } taskParameters; void unittestTaskFunction( void *pvParameters ) { - puts("go"); Taskparameters* parameters = (Taskparameters*)pvParameters; + int result = Catch::Session().run(parameters->argc, parameters->argv); - puts("gone"); - vTaskDelete( NULL ); + + vTaskDelay(pdMS_TO_TICKS(10)); + vTaskSuspendAll(); + vTaskDelete(parameters->catchTask); + customTeardown(); + exit(result); } #endif @@ -42,21 +46,17 @@ int main(int argc, char* argv[]) { int result = 0; - puts("pre"); - #ifdef FSFW_OSAL_FREERTOS - puts("task"); xTaskCreate( unittestTaskFunction, /* The function that implements the task. */ "Unittests", /* The text name assigned to the task - for debug only as it is not used by the kernel. */ configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */ &taskParameters, /* The parameter passed to the task - not used in this simple case. */ 1, /* The priority assigned to the task. */ - NULL ); /* The task handle is not required, so NULL is passed. */ + &taskParameters.catchTask); /* The task handle is not required, so NULL is passed. */ taskParameters.argc = argc; taskParameters.argv = argv; vTaskStartScheduler(); #else - puts("nom"); // Catch internal function call result = Catch::Session().run(argc, argv); #endif diff --git a/unittests/osal/TestClock.cpp b/unittests/osal/TestClock.cpp index 5d198db1a..663bcf331 100644 --- a/unittests/osal/TestClock.cpp +++ b/unittests/osal/TestClock.cpp @@ -5,6 +5,8 @@ #include #include +#include + #include "CatchDefinitions.h" TEST_CASE("OSAL::Clock Test", "[OSAL::Clock Test]") { diff --git a/unittests/testcfg/freertos/FreeRTOSConfig.h b/unittests/testcfg/freertos/FreeRTOSConfig.h index 0c4d78f8a..2f58e3545 100644 --- a/unittests/testcfg/freertos/FreeRTOSConfig.h +++ b/unittests/testcfg/freertos/FreeRTOSConfig.h @@ -4,11 +4,9 @@ #define configUSE_PREEMPTION 1 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 #define configUSE_TICKLESS_IDLE 0 -#define configCPU_CLOCK_HZ 60000000 -#define configSYSTICK_CLOCK_HZ 1000000 -#define configTICK_RATE_HZ 250 +#define configTICK_RATE_HZ 1000 #define configMAX_PRIORITIES 5 -#define configMINIMAL_STACK_SIZE 128 +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) PTHREAD_STACK_MIN ) #define configMAX_TASK_NAME_LEN 16 #define configUSE_16_BIT_TICKS 0 #define configIDLE_SHOULD_YIELD 1 @@ -18,7 +16,7 @@ #define configUSE_RECURSIVE_MUTEXES 0 #define configUSE_COUNTING_SEMAPHORES 1 #define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ -#define configQUEUE_REGISTRY_SIZE 10 +#define configQUEUE_REGISTRY_SIZE 20 #define configUSE_QUEUE_SETS 0 #define configUSE_TIME_SLICING 0 #define configUSE_NEWLIB_REENTRANT 0 @@ -32,7 +30,7 @@ /* Memory allocation related definitions. */ #define configSUPPORT_STATIC_ALLOCATION 0 #define configSUPPORT_DYNAMIC_ALLOCATION 1 -#define configTOTAL_HEAP_SIZE 10240 +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1024 * 1024 ) ) #define configAPPLICATION_ALLOCATED_HEAP 1 #define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0 -- 2.34.1 From 90bafbb6de9fe08095703dbab25b04ce876ea581 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Fri, 13 Jan 2023 17:37:22 +0100 Subject: [PATCH 08/12] typos in Jenkinsfile --- automation/Jenkinsfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automation/Jenkinsfile b/automation/Jenkinsfile index b97c3a9a8..0768f2cc2 100644 --- a/automation/Jenkinsfile +++ b/automation/Jenkinsfile @@ -16,7 +16,7 @@ pipeline { steps { sh 'rm -rf $BUILDDIR_HOST' - dir(BUILDDIR_LINUX) { + dir(BUILDDIR_HOST) { sh 'cmake -DFSFW_OSAL=host -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..' sh 'cmake --build . -j4' sh 'cmake --build . -- fsfw-tests_coverage -j4' @@ -26,9 +26,9 @@ pipeline { } stage('Linux') { steps { - sh 'rm -rf $BUILDDIR_HOST' + sh 'rm -rf $BUILDDIR_LINUX' - dir(BUILDDIR_HOST) { + dir(BUILDDIR_LINUX) { sh 'cmake -DFSFW_OSAL=linux -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..' sh 'cmake --build . -j4' sh 'cmake --build . -- fsfw-tests_coverage -j4' -- 2.34.1 From e131480d5f0986dfcbf2f02a8e49dc9a2f5673c2 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Mon, 16 Jan 2023 11:36:33 +0100 Subject: [PATCH 09/12] two errors found by valgrind --- src/fsfw/internalerror/InternalErrorReporter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/fsfw/internalerror/InternalErrorReporter.cpp b/src/fsfw/internalerror/InternalErrorReporter.cpp index fb2dc8a61..483ee72be 100644 --- a/src/fsfw/internalerror/InternalErrorReporter.cpp +++ b/src/fsfw/internalerror/InternalErrorReporter.cpp @@ -10,7 +10,6 @@ InternalErrorReporter::InternalErrorReporter(object_id_t setObjectId, uint32_t m poolManager(this, commandQueue), internalErrorSid(setObjectId, InternalErrorDataset::ERROR_SET_ID), internalErrorDataset(this) { - commandQueue = QueueFactory::instance()->createMessageQueue(messageQueueDepth); mutex = MutexFactory::instance()->createMutex(); } -- 2.34.1 From a0eae66c351d1bf5968d83977b301589fca3f4cf Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Mon, 16 Jan 2023 11:55:13 +0100 Subject: [PATCH 10/12] checking if this helps docker build --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b22ffe464..075dc51f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -193,6 +193,9 @@ if(FSFW_BUILD_TESTS) set(LIB_OS_NAME FreeRTOS) target_include_directories(FreeRTOS PUBLIC unittests/testcfg/freertos) + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(FreeRTOS PRIVATE ${CMAKE_THREAD_LIBS_INIT}) endif() project(${FSFW_TEST_TGT} CXX C) -- 2.34.1 From fe9804d922fb3b4625c277dd2b7c5acdfbd4e1ba Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Mon, 16 Jan 2023 12:35:14 +0100 Subject: [PATCH 11/12] format --- CMakeLists.txt | 7 +- src/fsfw/osal/freertos/BinSemaphUsingTask.h | 2 +- src/fsfw/osal/freertos/TaskManagement.cpp | 12 +- src/fsfw/osal/freertos/TaskManagement.h | 4 +- .../pus/Service11TelecommandScheduling.tpp | 6 +- unittests/CatchRunner.cpp | 40 ++--- unittests/CatchSetup.cpp | 2 - unittests/osal/TestClock.cpp | 3 +- unittests/testcfg/freertos/FreeRTOSConfig.h | 142 +++++++++--------- 9 files changed, 107 insertions(+), 111 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 075dc51f7..bdf3fdc40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,10 +175,7 @@ if(FSFW_BUILD_TESTS) configure_file(unittests/testcfg/TestsConfig.h.in tests/TestsConfig.h) if(FSFW_OSAL MATCHES "freertos") - message( - STATUS - "${MSG_PREFIX} Downloading FreeRTOS with FetchContent" - ) + message(STATUS "${MSG_PREFIX} Downloading FreeRTOS with FetchContent") include(FetchContent) set(FreeRTOS_PORT posix) @@ -251,8 +248,6 @@ if(FSFW_FETCH_CONTENT_TARGETS) set_target_properties(Catch2 PROPERTIES DEBUG_POSTFIX "") endif() - - endif() set(FSFW_CORE_INC_PATH "inc") diff --git a/src/fsfw/osal/freertos/BinSemaphUsingTask.h b/src/fsfw/osal/freertos/BinSemaphUsingTask.h index 340633314..d1b82703d 100644 --- a/src/fsfw/osal/freertos/BinSemaphUsingTask.h +++ b/src/fsfw/osal/freertos/BinSemaphUsingTask.h @@ -54,7 +54,7 @@ class BinarySemaphoreUsingTask : public SemaphoreIF { * - @c returnvalue::FAILED on failure */ ReturnValue_t acquireWithTickTimeout(TimeoutType timeoutType = TimeoutType::BLOCKING, - TickType_t timeoutTicks = portMAX_DELAY); + TickType_t timeoutTicks = portMAX_DELAY); /** * Get handle to the task related to the semaphore. diff --git a/src/fsfw/osal/freertos/TaskManagement.cpp b/src/fsfw/osal/freertos/TaskManagement.cpp index b09ff721b..144985b9a 100644 --- a/src/fsfw/osal/freertos/TaskManagement.cpp +++ b/src/fsfw/osal/freertos/TaskManagement.cpp @@ -3,12 +3,12 @@ void TaskManagement::vRequestContextSwitchFromTask() { vTaskDelay(0); } void TaskManagement::requestContextSwitch(CallContext callContext = CallContext::TASK) { -// if (callContext == CallContext::ISR) { -// // This function depends on the partmacro.h definition for the specific device -// vRequestContextSwitchFromISR(); -// } else { - vRequestContextSwitchFromTask(); -// } + // if (callContext == CallContext::ISR) { + // // This function depends on the partmacro.h definition for the specific device + // vRequestContextSwitchFromISR(); + // } else { + vRequestContextSwitchFromTask(); + // } } TaskHandle_t TaskManagement::getCurrentTaskHandle() { return xTaskGetCurrentTaskHandle(); } diff --git a/src/fsfw/osal/freertos/TaskManagement.h b/src/fsfw/osal/freertos/TaskManagement.h index 44c8c0f39..7a6b1700a 100644 --- a/src/fsfw/osal/freertos/TaskManagement.h +++ b/src/fsfw/osal/freertos/TaskManagement.h @@ -11,7 +11,7 @@ * Architecture dependant portmacro.h function call. * Should be implemented in bsp. */ -//extern "C" void vRequestContextSwitchFromISR(); +// extern "C" void vRequestContextSwitchFromISR(); /*! * Used by functions to tell if they are being called from @@ -53,7 +53,7 @@ TaskHandle_t getCurrentTaskHandle(); * @return Smallest value of stack remaining since the task was started in * words. */ -//size_t getTaskStackHighWatermark(TaskHandle_t task = nullptr); +// size_t getTaskStackHighWatermark(TaskHandle_t task = nullptr); }; // namespace TaskManagement diff --git a/src/fsfw/pus/Service11TelecommandScheduling.tpp b/src/fsfw/pus/Service11TelecommandScheduling.tpp index 540f6c689..ac08f02ca 100644 --- a/src/fsfw/pus/Service11TelecommandScheduling.tpp +++ b/src/fsfw/pus/Service11TelecommandScheduling.tpp @@ -2,12 +2,12 @@ #include +#include "fsfw/globalfunctions/CRC.h" #include "fsfw/objectmanager/ObjectManager.h" #include "fsfw/serialize/SerializeAdapter.h" #include "fsfw/serviceinterface.h" -#include "fsfw/tmtcservices/AcceptsTelecommandsIF.h" #include "fsfw/tmtcpacket/pus/tc/PusTcIF.h" -#include "fsfw/globalfunctions/CRC.h" +#include "fsfw/tmtcservices/AcceptsTelecommandsIF.h" static constexpr auto DEF_END = SerializeIF::Endianness::BIG; @@ -180,7 +180,7 @@ inline ReturnValue_t Service11TelecommandScheduling::doInsertActivi if (CRC::crc16ccitt(data, size) != 0) { return CONTAINED_TC_CRC_MISSMATCH; } - + // store currentPacket and receive the store address store_address_t addr{}; if (tcStore->addData(&addr, data, size) != returnvalue::OK || diff --git a/unittests/CatchRunner.cpp b/unittests/CatchRunner.cpp index 8478efbf6..a25d523d6 100644 --- a/unittests/CatchRunner.cpp +++ b/unittests/CatchRunner.cpp @@ -10,28 +10,31 @@ #define CATCH_CONFIG_COLOUR_WINDOWS -#include #include +#include + #ifdef FSFW_OSAL_FREERTOS - #include - #include "task.h" +#include + +#include "task.h" #endif extern int customSetup(); extern int customTeardown(); - #ifdef FSFW_OSAL_FREERTOS struct Taskparameters { - int argc; char** argv;TaskHandle_t catchTask; + int argc; + char** argv; + TaskHandle_t catchTask; } taskParameters; -void unittestTaskFunction( void *pvParameters ) { +void unittestTaskFunction(void* pvParameters) { Taskparameters* parameters = (Taskparameters*)pvParameters; - + int result = Catch::Session().run(parameters->argc, parameters->argv); - + vTaskDelay(pdMS_TO_TICKS(10)); vTaskSuspendAll(); vTaskDelete(parameters->catchTask); @@ -40,26 +43,27 @@ void unittestTaskFunction( void *pvParameters ) { } #endif - int main(int argc, char* argv[]) { customSetup(); int result = 0; - #ifdef FSFW_OSAL_FREERTOS - xTaskCreate( unittestTaskFunction, /* The function that implements the task. */ - "Unittests", /* The text name assigned to the task - for debug only as it is not used by the kernel. */ - configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */ - &taskParameters, /* The parameter passed to the task - not used in this simple case. */ - 1, /* The priority assigned to the task. */ - &taskParameters.catchTask); /* The task handle is not required, so NULL is passed. */ +#ifdef FSFW_OSAL_FREERTOS + xTaskCreate( + unittestTaskFunction, /* The function that implements the task. */ + "Unittests", /* The text name assigned to the task - for debug only as it is not used by the + kernel. */ + configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */ + &taskParameters, /* The parameter passed to the task - not used in this simple case. */ + 1, /* The priority assigned to the task. */ + &taskParameters.catchTask); /* The task handle is not required, so NULL is passed. */ taskParameters.argc = argc; taskParameters.argv = argv; vTaskStartScheduler(); - #else +#else // Catch internal function call result = Catch::Session().run(argc, argv); - #endif +#endif // global clean-up customTeardown(); diff --git a/unittests/CatchSetup.cpp b/unittests/CatchSetup.cpp index cbed8029e..fc5bb3f57 100644 --- a/unittests/CatchSetup.cpp +++ b/unittests/CatchSetup.cpp @@ -6,8 +6,6 @@ #include #endif - - #include "fsfw/objectmanager/ObjectManager.h" #include "fsfw/serviceinterface/ServiceInterface.h" #include "fsfw/storagemanager/StorageManagerIF.h" diff --git a/unittests/osal/TestClock.cpp b/unittests/osal/TestClock.cpp index 663bcf331..bdfefde63 100644 --- a/unittests/osal/TestClock.cpp +++ b/unittests/osal/TestClock.cpp @@ -1,12 +1,11 @@ #include #include +#include #include #include #include -#include - #include "CatchDefinitions.h" TEST_CASE("OSAL::Clock Test", "[OSAL::Clock Test]") { diff --git a/unittests/testcfg/freertos/FreeRTOSConfig.h b/unittests/testcfg/freertos/FreeRTOSConfig.h index 2f58e3545..049bbc25e 100644 --- a/unittests/testcfg/freertos/FreeRTOSConfig.h +++ b/unittests/testcfg/freertos/FreeRTOSConfig.h @@ -1,101 +1,101 @@ #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H -#define configUSE_PREEMPTION 1 +#define configUSE_PREEMPTION 1 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 -#define configUSE_TICKLESS_IDLE 0 -#define configTICK_RATE_HZ 1000 -#define configMAX_PRIORITIES 5 -#define configMINIMAL_STACK_SIZE ( ( unsigned short ) PTHREAD_STACK_MIN ) -#define configMAX_TASK_NAME_LEN 16 -#define configUSE_16_BIT_TICKS 0 -#define configIDLE_SHOULD_YIELD 1 -#define configUSE_TASK_NOTIFICATIONS 1 -#define configTASK_NOTIFICATION_ARRAY_ENTRIES 3 -#define configUSE_MUTEXES 1 -#define configUSE_RECURSIVE_MUTEXES 0 -#define configUSE_COUNTING_SEMAPHORES 1 -#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ -#define configQUEUE_REGISTRY_SIZE 20 -#define configUSE_QUEUE_SETS 0 -#define configUSE_TIME_SLICING 0 -#define configUSE_NEWLIB_REENTRANT 0 -#define configENABLE_BACKWARD_COMPATIBILITY 1 +#define configUSE_TICKLESS_IDLE 0 +#define configTICK_RATE_HZ 1000 +#define configMAX_PRIORITIES 5 +#define configMINIMAL_STACK_SIZE ((unsigned short)PTHREAD_STACK_MIN) +#define configMAX_TASK_NAME_LEN 16 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_TASK_NOTIFICATIONS 1 +#define configTASK_NOTIFICATION_ARRAY_ENTRIES 3 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 0 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ +#define configQUEUE_REGISTRY_SIZE 20 +#define configUSE_QUEUE_SETS 0 +#define configUSE_TIME_SLICING 0 +#define configUSE_NEWLIB_REENTRANT 0 +#define configENABLE_BACKWARD_COMPATIBILITY 1 #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5 -#define configUSE_MINI_LIST_ITEM 1 -#define configSTACK_DEPTH_TYPE uint16_t -#define configMESSAGE_BUFFER_LENGTH_TYPE size_t -#define configHEAP_CLEAR_MEMORY_ON_FREE 1 +#define configUSE_MINI_LIST_ITEM 1 +#define configSTACK_DEPTH_TYPE uint16_t +#define configMESSAGE_BUFFER_LENGTH_TYPE size_t +#define configHEAP_CLEAR_MEMORY_ON_FREE 1 /* Memory allocation related definitions. */ -#define configSUPPORT_STATIC_ALLOCATION 0 -#define configSUPPORT_DYNAMIC_ALLOCATION 1 -#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1024 * 1024 ) ) -#define configAPPLICATION_ALLOCATED_HEAP 1 -#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0 +#define configSUPPORT_STATIC_ALLOCATION 0 +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configTOTAL_HEAP_SIZE ((size_t)(1024 * 1024)) +#define configAPPLICATION_ALLOCATED_HEAP 1 +#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0 /* Hook function related definitions. */ -#define configUSE_IDLE_HOOK 0 -#define configUSE_TICK_HOOK 0 -#define configCHECK_FOR_STACK_OVERFLOW 0 -#define configUSE_MALLOC_FAILED_HOOK 0 -#define configUSE_DAEMON_TASK_STARTUP_HOOK 0 -#define configUSE_SB_COMPLETED_CALLBACK 0 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 0 +#define configUSE_MALLOC_FAILED_HOOK 0 +#define configUSE_DAEMON_TASK_STARTUP_HOOK 0 +#define configUSE_SB_COMPLETED_CALLBACK 0 /* Run time and task stats gathering related definitions. */ -#define configGENERATE_RUN_TIME_STATS 0 -#define configUSE_TRACE_FACILITY 0 -#define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_TRACE_FACILITY 0 +#define configUSE_STATS_FORMATTING_FUNCTIONS 0 /* Co-routine related definitions. */ -#define configUSE_CO_ROUTINES 0 -#define configMAX_CO_ROUTINE_PRIORITIES 1 +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES 1 /* Software timer related definitions. */ -#define configUSE_TIMERS 1 -#define configTIMER_TASK_PRIORITY 3 -#define configTIMER_QUEUE_LENGTH 10 -#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY 3 +#define configTIMER_QUEUE_LENGTH 10 +#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE /* Interrupt nesting behaviour configuration. */ -#define configKERNEL_INTERRUPT_PRIORITY [dependent of processor] -#define configMAX_SYSCALL_INTERRUPT_PRIORITY [dependent on processor and application] -#define configMAX_API_CALL_INTERRUPT_PRIORITY [dependent on processor and application] +#define configKERNEL_INTERRUPT_PRIORITY [dependent of processor] +#define configMAX_SYSCALL_INTERRUPT_PRIORITY [dependent on processor and application] +#define configMAX_API_CALL_INTERRUPT_PRIORITY [dependent on processor and application] /* Define to trap errors during development. */ //#define configASSERT( ( x ) ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ ) /* FreeRTOS MPU specific definitions. */ #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 -#define configTOTAL_MPU_REGIONS 8 /* Default value. */ -#define configTEX_S_C_B_FLASH 0x07UL /* Default value. */ -#define configTEX_S_C_B_SRAM 0x07UL /* Default value. */ -#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 1 -#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 -#define configENABLE_ERRATA_837070_WORKAROUND 1 +#define configTOTAL_MPU_REGIONS 8 /* Default value. */ +#define configTEX_S_C_B_FLASH 0x07UL /* Default value. */ +#define configTEX_S_C_B_SRAM 0x07UL /* Default value. */ +#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 1 +#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 +#define configENABLE_ERRATA_837070_WORKAROUND 1 /* ARMv8-M secure side port related definitions. */ -#define secureconfigMAX_SECURE_CONTEXTS 5 +#define secureconfigMAX_SECURE_CONTEXTS 5 /* Optional functions - most linkers will remove unused functions anyway. */ -#define INCLUDE_vTaskPrioritySet 1 -#define INCLUDE_uxTaskPriorityGet 1 -#define INCLUDE_vTaskDelete 1 -#define INCLUDE_vTaskSuspend 1 -#define INCLUDE_xResumeFromISR 1 -#define INCLUDE_vTaskDelayUntil 1 -#define INCLUDE_vTaskDelay 1 -#define INCLUDE_xTaskGetSchedulerState 1 -#define INCLUDE_xTaskGetCurrentTaskHandle 1 -#define INCLUDE_uxTaskGetStackHighWaterMark 0 -#define INCLUDE_uxTaskGetStackHighWaterMark2 0 -#define INCLUDE_xTaskGetIdleTaskHandle 0 -#define INCLUDE_eTaskGetState 0 -#define INCLUDE_xEventGroupSetBitFromISR 1 -#define INCLUDE_xTimerPendFunctionCall 0 -#define INCLUDE_xTaskAbortDelay 0 -#define INCLUDE_xTaskGetHandle 0 -#define INCLUDE_xTaskResumeFromISR 1 +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_xResumeFromISR 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 0 +#define INCLUDE_uxTaskGetStackHighWaterMark2 0 +#define INCLUDE_xTaskGetIdleTaskHandle 0 +#define INCLUDE_eTaskGetState 0 +#define INCLUDE_xEventGroupSetBitFromISR 1 +#define INCLUDE_xTimerPendFunctionCall 0 +#define INCLUDE_xTaskAbortDelay 0 +#define INCLUDE_xTaskGetHandle 0 +#define INCLUDE_xTaskResumeFromISR 1 /* A header file that defines trace macro can be included here. */ -- 2.34.1 From 90efb132d07f14bee464b9055c2745aa73f6b8c7 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Mon, 16 Jan 2023 12:41:23 +0100 Subject: [PATCH 12/12] fixing rebase error --- src/fsfw/internalerror/InternalErrorReporter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fsfw/internalerror/InternalErrorReporter.cpp b/src/fsfw/internalerror/InternalErrorReporter.cpp index 483ee72be..806c6b587 100644 --- a/src/fsfw/internalerror/InternalErrorReporter.cpp +++ b/src/fsfw/internalerror/InternalErrorReporter.cpp @@ -7,6 +7,7 @@ InternalErrorReporter::InternalErrorReporter(object_id_t setObjectId, uint32_t messageQueueDepth) : SystemObject(setObjectId), + commandQueue(QueueFactory::instance()->createMessageQueue(messageQueueDepth)), poolManager(this, commandQueue), internalErrorSid(setObjectId, InternalErrorDataset::ERROR_SET_ID), internalErrorDataset(this) { -- 2.34.1