diff --git a/CMakeLists.txt b/CMakeLists.txt index 02849ca4..3cc5ffd5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -139,5 +139,4 @@ target_include_directories(${LIB_FSFW_NAME} PRIVATE target_compile_options(${LIB_FSFW_NAME} PRIVATE ${WARNING_FLAGS} ${COMPILER_FLAGS} - ${ABI_FLAGS} ) diff --git a/defaultcfg/fsfwconfig/OBSWConfig.h b/defaultcfg/fsfwconfig/OBSWConfig.h index 8ad2cb67..6ed8ea2c 100644 --- a/defaultcfg/fsfwconfig/OBSWConfig.h +++ b/defaultcfg/fsfwconfig/OBSWConfig.h @@ -3,11 +3,12 @@ #include "OBSWVersion.h" +#ifdef __cplusplus + #include "objects/systemObjectList.h" #include "events/subsystemIdRanges.h" #include "returnvalues/classIds.h" -#ifdef __cplusplus namespace config { #endif diff --git a/devicehandlers/DeviceHandlerBase.cpp b/devicehandlers/DeviceHandlerBase.cpp index d0630854..251320cb 100644 --- a/devicehandlers/DeviceHandlerBase.cpp +++ b/devicehandlers/DeviceHandlerBase.cpp @@ -682,8 +682,10 @@ void DeviceHandlerBase::doGetRead() { replyRawData(receivedData, receivedDataLen, requestedRawTraffic); } - if (mode == MODE_RAW and defaultRawReceiver != MessageQueueIF::NO_QUEUE) { - replyRawReplyIfnotWiretapped(receivedData, receivedDataLen); + if (mode == MODE_RAW) { + if (defaultRawReceiver != MessageQueueIF::NO_QUEUE) { + replyRawReplyIfnotWiretapped(receivedData, receivedDataLen); + } } else { parseReply(receivedData, receivedDataLen); diff --git a/osal/host/CMakeLists.txt b/osal/host/CMakeLists.txt index aa32990b..367f721e 100644 --- a/osal/host/CMakeLists.txt +++ b/osal/host/CMakeLists.txt @@ -13,9 +13,11 @@ target_sources(${LIB_FSFW_NAME} ) if(UNIX) + find_package(Threads REQUIRED) + target_link_libraries(${LIB_FSFW_NAME} PRIVATE rt - pthread + ${CMAKE_THREAD_LIBS_INIT} ) endif() \ No newline at end of file diff --git a/osal/linux/CMakeLists.txt b/osal/linux/CMakeLists.txt index c0096e42..474e548b 100644 --- a/osal/linux/CMakeLists.txt +++ b/osal/linux/CMakeLists.txt @@ -18,8 +18,14 @@ target_sources(${LIB_FSFW_NAME} Timer.cpp ) -target_link_libraries(${LIB_FSFW_NAME} - PRIVATE - rt - pthread +find_package(Threads REQUIRED) + +target_link_libraries(${LIB_FSFW_NAME} PRIVATE + ${CMAKE_THREAD_LIBS_INIT} + rt ) + +target_link_libraries(${LIB_FSFW_NAME} INTERFACE + ${CMAKE_THREAD_LIBS_INIT} +) + diff --git a/osal/rtems/CMakeLists.txt b/osal/rtems/CMakeLists.txt new file mode 100644 index 00000000..bff03184 --- /dev/null +++ b/osal/rtems/CMakeLists.txt @@ -0,0 +1,18 @@ +target_sources(${LIB_FSFW_NAME} + PRIVATE + Clock.cpp + CpuUsage.cpp + InitTask.cpp + InternalErrorCodes.cpp + MessageQueue.cpp + MultiObjectTask.cpp + Mutex.cpp + MutexFactory.cpp + PollingTask.cpp + QueueFactory.cpp + RtemsBasic.cpp + TaskBase.cpp + TaskFactory.cpp +) + + diff --git a/osal/rtems/Clock.cpp b/osal/rtems/Clock.cpp index e5f37ec6..8bd7ac37 100644 --- a/osal/rtems/Clock.cpp +++ b/osal/rtems/Clock.cpp @@ -1,6 +1,10 @@ -#include "../../timemanager/Clock.h" #include "RtemsBasic.h" + +#include "../../timemanager/Clock.h" +#include "../../ipc/MutexHelper.h" + #include +#include uint16_t Clock::leapSeconds = 0; MutexIF* Clock::timeMutex = nullptr; @@ -33,15 +37,24 @@ ReturnValue_t Clock::setClock(const TimeOfDay_t* time) { } ReturnValue_t Clock::setClock(const timeval* time) { - //TODO This routine uses _TOD_Set which is not timespec newTime; newTime.tv_sec = time->tv_sec; + if(time->tv_usec < 0) { + // better returnvalue. + return HasReturnvaluesIF::RETURN_FAILED; + } newTime.tv_nsec = time->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND; - //SHOULDDO: Not sure if we need to protect this call somehow (by thread lock or something). - //Uli: rtems docu says you can call this from an ISR, not sure if this means no protetion needed - //TODO Second parameter is ISR_lock_Context - _TOD_Set(&newTime,nullptr); - return HasReturnvaluesIF::RETURN_OK; + + ISR_lock_Context context; + _TOD_Lock(); + _TOD_Acquire(&context); + Status_Control status = _TOD_Set(&newTime, &context); + _TOD_Unlock(); + if(status == STATUS_SUCCESSFUL) { + return HasReturnvaluesIF::RETURN_OK; + } + // better returnvalue + return HasReturnvaluesIF::RETURN_FAILED; } ReturnValue_t Clock::getClock_timeval(timeval* time) { @@ -91,6 +104,7 @@ ReturnValue_t Clock::getClock_usecs(uint64_t* time) { } ReturnValue_t Clock::getDateAndTime(TimeOfDay_t* time) { + // TIsn't this a bug? Are RTEMS ticks always microseconds? rtems_time_of_day* timeRtems = reinterpret_cast(time); rtems_status_code status = rtems_clock_get_tod(timeRtems); switch (status) { diff --git a/osal/rtems/InternalErrorCodes.cpp b/osal/rtems/InternalErrorCodes.cpp index ddf365d5..f4079814 100644 --- a/osal/rtems/InternalErrorCodes.cpp +++ b/osal/rtems/InternalErrorCodes.cpp @@ -34,8 +34,10 @@ ReturnValue_t InternalErrorCodes::translate(uint8_t code) { return OUT_OF_PROXIES; case INTERNAL_ERROR_INVALID_GLOBAL_ID: return INVALID_GLOBAL_ID; +#ifndef STM32H743ZI_NUCLEO case INTERNAL_ERROR_BAD_STACK_HOOK: return BAD_STACK_HOOK; +#endif // case INTERNAL_ERROR_BAD_ATTRIBUTES: // return BAD_ATTRIBUTES; // case INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY: diff --git a/osal/rtems/MessageQueue.cpp b/osal/rtems/MessageQueue.cpp index 839182a6..bfaf3569 100644 --- a/osal/rtems/MessageQueue.cpp +++ b/osal/rtems/MessageQueue.cpp @@ -9,9 +9,11 @@ MessageQueue::MessageQueue(size_t message_depth, size_t max_message_size) : rtems_status_code status = rtems_message_queue_create(name, message_depth, max_message_size, 0, &(this->id)); if (status != RTEMS_SUCCESSFUL) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "MessageQueue::MessageQueue: Creating Queue " << std::hex << name << std::dec << " failed with status:" << (uint32_t) status << std::endl; +#endif this->id = 0; } } diff --git a/osal/rtems/MultiObjectTask.cpp b/osal/rtems/MultiObjectTask.cpp index 970d01e1..b111f724 100644 --- a/osal/rtems/MultiObjectTask.cpp +++ b/osal/rtems/MultiObjectTask.cpp @@ -30,8 +30,10 @@ ReturnValue_t MultiObjectTask::startTask() { rtems_status_code status = rtems_task_start(id, MultiObjectTask::taskEntryPoint, rtems_task_argument((void *) this)); if (status != RTEMS_SUCCESSFUL) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "ObjectTask::startTask for " << std::hex << this->getId() << std::dec << " failed." << std::endl; +#endif } switch(status){ case RTEMS_SUCCESSFUL: @@ -63,7 +65,9 @@ void MultiObjectTask::taskFunctionality() { char nameSpace[8] = { 0 }; char* ptr = rtems_object_get_name(getId(), sizeof(nameSpace), nameSpace); +#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "ObjectTask: " << ptr << " Deadline missed." << std::endl; +#endif if (this->deadlineMissedFunc != nullptr) { this->deadlineMissedFunc(); } diff --git a/osal/rtems/Mutex.cpp b/osal/rtems/Mutex.cpp index a5ec9635..71c5782f 100644 --- a/osal/rtems/Mutex.cpp +++ b/osal/rtems/Mutex.cpp @@ -10,16 +10,20 @@ Mutex::Mutex() : RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY, 0, &mutexId); if (status != RTEMS_SUCCESSFUL) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "Mutex: creation with name, id " << mutexName << ", " << mutexId << " failed with " << status << std::endl; +#endif } } Mutex::~Mutex() { rtems_status_code status = rtems_semaphore_delete(mutexId); if (status != RTEMS_SUCCESSFUL) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "Mutex: deletion for id " << mutexId << " failed with " << status << std::endl; +#endif } } diff --git a/osal/rtems/PollingTask.cpp b/osal/rtems/PollingTask.cpp index db7864fe..0ebf63e2 100644 --- a/osal/rtems/PollingTask.cpp +++ b/osal/rtems/PollingTask.cpp @@ -35,15 +35,19 @@ rtems_task PollingTask::taskEntryPoint(rtems_task_argument argument) { PollingTask *originalTask(reinterpret_cast(argument)); //The task's functionality is called. originalTask->taskFunctionality(); +#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::debug << "Polling task " << originalTask->getId() << " returned from taskFunctionality." << std::endl; +#endif } void PollingTask::missedDeadlineCounter() { PollingTask::deadlineMissedCount++; if (PollingTask::deadlineMissedCount % 10 == 0) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "PST missed " << PollingTask::deadlineMissedCount << " deadlines." << std::endl; +#endif } } @@ -51,8 +55,10 @@ ReturnValue_t PollingTask::startTask() { rtems_status_code status = rtems_task_start(id, PollingTask::taskEntryPoint, rtems_task_argument((void *) this)); if (status != RTEMS_SUCCESSFUL) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "PollingTask::startTask for " << std::hex << this->getId() << std::dec << " failed." << std::endl; +#endif } switch(status){ case RTEMS_SUCCESSFUL: @@ -75,8 +81,10 @@ ReturnValue_t PollingTask::addSlot(object_id_t componentId, return HasReturnvaluesIF::RETURN_OK; } +#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "Component " << std::hex << componentId << " not found, not adding it to pst" << std::endl; +#endif return HasReturnvaluesIF::RETURN_FAILED; } diff --git a/osal/rtems/TaskBase.cpp b/osal/rtems/TaskBase.cpp index 4e0c8f00..6abfcca8 100644 --- a/osal/rtems/TaskBase.cpp +++ b/osal/rtems/TaskBase.cpp @@ -22,9 +22,11 @@ TaskBase::TaskBase(rtems_task_priority set_priority, size_t stack_size, } ReturnValue_t result = convertReturnCode(status); if (result != HasReturnvaluesIF::RETURN_OK) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "TaskBase::TaskBase: createTask with name " << std::hex << osalName << std::dec << " failed with return code " << (uint32_t) status << std::endl; +#endif this->id = 0; } } diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt new file mode 100644 index 00000000..119ef243 --- /dev/null +++ b/unittest/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(internal) +add_subdirectory(tests) \ No newline at end of file