fsfw/src/fsfw/osal/linux/PeriodicPosixTask.cpp

60 lines
1.7 KiB
C++
Raw Normal View History

#include "PeriodicPosixTask.h"
2021-06-05 19:52:38 +02:00
#include "fsfw/serviceinterface.h"
2022-02-02 10:29:30 +01:00
#include "fsfw/tasks/ExecutableObjectIF.h"
2021-06-05 19:52:38 +02:00
2022-02-02 10:29:30 +01:00
PeriodicPosixTask::PeriodicPosixTask(const char* name_, int priority_, size_t stackSize_,
2023-03-24 11:53:41 +01:00
TaskPeriod period_, TaskDeadlineMissedFunction dlmFunc_,
PosixThreadArgs* args)
: PeriodicTaskBase(period_, dlmFunc_),
2023-03-24 11:53:41 +01:00
posixThread(name_, SchedulingPolicy::REGULAR, priority_, stackSize_),
started(false) {
if (args != nullptr) {
posixThread.setSchedPolicy(args->policy);
}
}
2018-07-13 18:28:26 +02:00
void* PeriodicPosixTask::taskEntryPoint(void* arg) {
2022-02-02 10:29:30 +01:00
// The argument is re-interpreted as PollingTask.
auto* originalTask(reinterpret_cast<PeriodicPosixTask*>(arg));
2022-02-02 10:29:30 +01:00
// The task's functionality is called.
originalTask->taskFunctionality();
2022-05-17 18:12:05 +02:00
return nullptr;
2018-07-13 18:28:26 +02:00
}
ReturnValue_t PeriodicPosixTask::sleepFor(uint32_t ms) {
return PosixThread::sleep(static_cast<uint64_t>(ms) * 1000000);
2018-07-13 18:28:26 +02:00
}
ReturnValue_t PeriodicPosixTask::startTask() {
2022-05-14 09:38:59 +02:00
if (isEmpty()) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-05-14 09:38:59 +02:00
}
2022-02-02 10:29:30 +01:00
started = true;
2022-05-18 15:42:18 +02:00
posixThread.createTask(&taskEntryPoint, this);
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2018-07-13 18:28:26 +02:00
}
[[noreturn]] void PeriodicPosixTask::taskFunctionality() {
2022-02-02 10:29:30 +01:00
if (not started) {
2022-05-18 15:42:18 +02:00
posixThread.suspend();
2022-02-02 10:29:30 +01:00
}
2020-09-04 14:43:53 +02:00
2022-05-14 09:38:59 +02:00
initObjsAfterTaskCreation();
2020-09-04 14:43:53 +02:00
uint64_t lastWakeTime = PosixThread::getCurrentMonotonicTimeMs();
2022-05-18 15:42:18 +02:00
uint64_t periodMs = getPeriodMs();
2022-02-02 10:29:30 +01:00
// The task's "infinite" inner loop is entered.
while (true) {
2022-05-14 09:38:59 +02:00
for (auto const& objOpCodePair : objectList) {
objOpCodePair.first->performOperation(objOpCodePair.second);
2022-02-02 10:29:30 +01:00
}
2020-09-04 14:43:53 +02:00
2022-02-02 10:29:30 +01:00
if (not PosixThread::delayUntil(&lastWakeTime, periodMs)) {
if (dlmFunc != nullptr) {
dlmFunc();
2022-02-02 10:29:30 +01:00
}
}
}
2018-07-13 18:28:26 +02:00
}