From 13639feec6229446c04906d2f69849ec7ececbbd Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Fri, 13 Jan 2023 11:09:32 +0100 Subject: [PATCH] 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