From 69bc8785a80ccf6250629c9b7be5f4ab5fe2a895 Mon Sep 17 00:00:00 2001 From: fastium Date: Mon, 30 Dec 2024 16:56:04 +0100 Subject: [PATCH] ADD threads dispatcher and drive reset with event --- multi_tasking/bike_system.cpp | 147 +++++++-------------------------- multi_tasking/bike_system.hpp | 27 +++--- multi_tasking/reset_device.cpp | 26 +++--- 3 files changed, 56 insertions(+), 144 deletions(-) diff --git a/multi_tasking/bike_system.cpp b/multi_tasking/bike_system.cpp index 3954cbe..f8bd60e 100644 --- a/multi_tasking/bike_system.cpp +++ b/multi_tasking/bike_system.cpp @@ -35,104 +35,29 @@ namespace multi_tasking { -static constexpr std::chrono::milliseconds kGearTaskPeriod = 800ms; -static constexpr std::chrono::milliseconds kGearTaskDelay = 0ms; -static constexpr std::chrono::milliseconds kGearTaskComputationTime = 100ms; - -static constexpr std::chrono::milliseconds kSpeedDistanceTaskPeriod = 400ms; -static constexpr std::chrono::milliseconds kSpeedDistanceTaskDelay = 100ms; -static constexpr std::chrono::milliseconds kSpeedDistanceTaskComputationTime = 200ms; - -static constexpr std::chrono::milliseconds kDisplayTask1Period = 1600ms; -static constexpr std::chrono::milliseconds kDisplayTask1Delay = 300ms; -static constexpr std::chrono::milliseconds kDisplayTask1ComputationTime = 200ms; - -static constexpr std::chrono::milliseconds kResetTaskPeriod = 800ms; -static constexpr std::chrono::milliseconds kResetTaskDelay = 700ms; -static constexpr std::chrono::milliseconds kResetTaskComputationTime = 100ms; - -static constexpr std::chrono::milliseconds kTemperatureTaskPeriod = 1600ms; -static constexpr std::chrono::milliseconds kTemperatureTaskDelay = 1100ms; -static constexpr std::chrono::milliseconds kTemperatureTaskComputationTime = 100ms; - -static constexpr std::chrono::milliseconds kDisplayTask2Period = 1600ms; -static constexpr std::chrono::milliseconds kDisplayTask2Delay = 1200ms; -static constexpr std::chrono::milliseconds kDisplayTask2ComputationTime = 100ms; - -static constexpr std::chrono::milliseconds kCPUTaskPeriod = 1600ms; -static constexpr std::chrono::milliseconds kCPUTaskDelay = 1200ms; -static constexpr std::chrono::milliseconds kCPUTaskComputationTime = 100ms; - - -BikeSystem::BikeSystem() : - _gearDevice(), - _pedalDevice(), - _resetDevice(callback(this, &BikeSystem::onReset)), - _speedometer(_timer), - _cpuLogger(_timer) -{ - -} +BikeSystem::BikeSystem() + : _gearDevice(), + _pedalDevice(), + _resetDevice(callback(this, &BikeSystem::onReset)), + _speedometer(_timer), + _cpuLogger(_timer) {} void BikeSystem::start() { - // new thread dedicated for ISRs with its event queue - - tr_info("Starting Super-Loop with event handling"); init(); - EventQueue eventQueue; - - Event gearEvent(&eventQueue, callback(this, &BikeSystem::gearTask)); - gearEvent.delay(kGearTaskDelay); - gearEvent.period(kGearTaskPeriod); - gearEvent.post(); - - Event speedDistanceEvent(&eventQueue, callback(this, &BikeSystem::speedDistanceTask)); - speedDistanceEvent.delay(kSpeedDistanceTaskDelay); - speedDistanceEvent.period(kSpeedDistanceTaskPeriod); - speedDistanceEvent.post(); - - Event display1Event(&eventQueue, callback(this, &BikeSystem::displayTask1)); - display1Event.delay(kDisplayTask1Delay); - display1Event.period(kDisplayTask1Period); - display1Event.post(); - - Event resetEvent(&eventQueue, callback(this, &BikeSystem::resetTask)); - resetEvent.delay(kResetTaskDelay); - resetEvent.period(kResetTaskPeriod); - resetEvent.post(); - - Event temperatureEvent(&eventQueue, callback(this, &BikeSystem::temperatureTask)); - temperatureEvent.delay(kTemperatureTaskDelay); - temperatureEvent.period(kTemperatureTaskPeriod); - temperatureEvent.post(); - - Event display2Event(&eventQueue, callback(this, &BikeSystem::displayTask2)); - display2Event.delay(kDisplayTask2Delay); - display2Event.period(kDisplayTask2Period); - display2Event.post(); - - #if !defined(MBED_TEST_MODE) - Event cpuEvent(&eventQueue, callback(this, &BikeSystem::cpuTask)); - cpuEvent.delay(kCPUTaskDelay); - cpuEvent.period(kCPUTaskPeriod); - cpuEvent.post(); - #endif - - eventQueue.dispatch_forever(); + _isrEventThread.start(callback(this, &BikeSystem::dispatch_isr_events)); + _mainEventThread.start(callback(this, &BikeSystem::dispatch_events)); } void BikeSystem::onReset() { - _resetTime = _timer.elapsed_time(); - core_util_atomic_store_bool(&_resetFlag, true); + Event resetEvent(&_isrEventQueue, callback(this, &BikeSystem::resetTask)); + resetEvent.post(); } -void BikeSystem::stop() { core_util_atomic_store_bool(&_stopFlag, true); } - #if defined(MBED_TEST_MODE) const advembsof::TaskLogger& BikeSystem::getTaskLogger() { return _taskLogger; } #endif // defined(MBED_TEST_MODE) @@ -166,8 +91,7 @@ void BikeSystem::gearTask() { _currentGearSize = _gearDevice.getCurrentGearSize(); _taskLogger.logPeriodAndExecutionTime( - _timer, advembsof::TaskLogger::kGearTaskIndex, taskStartTime - ); + _timer, advembsof::TaskLogger::kGearTaskIndex, taskStartTime); } void BikeSystem::speedDistanceTask() { @@ -177,29 +101,25 @@ void BikeSystem::speedDistanceTask() { _speedometer.setCurrentRotationTime(pedalRotationTime); _speedometer.setGearSize(_currentGearSize); - _currentSpeed = _speedometer.getCurrentSpeed(); + _currentSpeed = _speedometer.getCurrentSpeed(); _traveledDistance = _speedometer.getDistance(); _taskLogger.logPeriodAndExecutionTime( - _timer, advembsof::TaskLogger::kSpeedTaskIndex, taskStartTime - ); + _timer, advembsof::TaskLogger::kSpeedTaskIndex, taskStartTime); } void BikeSystem::temperatureTask() { auto taskStartTime = _timer.elapsed_time(); - //tr_warn("Tick1 %" PRIu64, _timer.elapsed_time().count()); + // tr_warn("Tick1 %" PRIu64, _timer.elapsed_time().count()); // no need to protect access to data members (single threaded) _currentTemperature = _sensorDevice.readTemperature(); - //tr_warn("Tick2 %" PRIu64, _timer.elapsed_time().count()); + // tr_warn("Tick2 %" PRIu64, _timer.elapsed_time().count()); - ThisThread::sleep_for( - std::chrono::duration_cast( - kTemperatureTaskComputationTime - (_timer.elapsed_time() - taskStartTime) - ) - ); + ThisThread::sleep_for(std::chrono::duration_cast( + kTemperatureTaskComputationTime - (_timer.elapsed_time() - taskStartTime))); _taskLogger.logPeriodAndExecutionTime( _timer, advembsof::TaskLogger::kTemperatureTaskIndex, taskStartTime); @@ -208,13 +128,8 @@ void BikeSystem::temperatureTask() { void BikeSystem::resetTask() { auto taskStartTime = _timer.elapsed_time(); - if (core_util_atomic_load_bool(&_resetFlag)) { - std::chrono::microseconds responseTime = _timer.elapsed_time() - _resetTime; - tr_info("Reset task: response time is %" PRIu64 " usecs", responseTime.count()); - _speedometer.reset(); - - core_util_atomic_store_bool(&_resetFlag, false); - } + tr_info("Reset task: response time is %" PRIu64 " usecs", responseTime.count()); + _speedometer.reset(); _taskLogger.logPeriodAndExecutionTime( _timer, advembsof::TaskLogger::kResetTaskIndex, taskStartTime); @@ -227,11 +142,8 @@ void BikeSystem::displayTask1() { _displayDevice.displaySpeed(_currentSpeed); _displayDevice.displayDistance(_traveledDistance); - ThisThread::sleep_for( - std::chrono::duration_cast( - kDisplayTask1ComputationTime - (_timer.elapsed_time() - taskStartTime) - ) - ); + ThisThread::sleep_for(std::chrono::duration_cast( + kDisplayTask1ComputationTime - (_timer.elapsed_time() - taskStartTime))); _taskLogger.logPeriodAndExecutionTime( _timer, advembsof::TaskLogger::kDisplayTask1Index, taskStartTime); @@ -242,18 +154,17 @@ void BikeSystem::displayTask2() { _displayDevice.displayTemperature(_currentTemperature); - ThisThread::sleep_for( - std::chrono::duration_cast( - kDisplayTask2ComputationTime - (_timer.elapsed_time() - taskStartTime) - ) - ); + ThisThread::sleep_for(std::chrono::duration_cast( + kDisplayTask2ComputationTime - (_timer.elapsed_time() - taskStartTime))); _taskLogger.logPeriodAndExecutionTime( _timer, advembsof::TaskLogger::kDisplayTask2Index, taskStartTime); } -void BikeSystem::cpuTask() { - _cpuLogger.printStats(); -} +void BikeSystem::cpuTask() { _cpuLogger.printStats(); } -} // namespace static_scheduling +void BikeSystem::dispatch_isr_events() { _isrEventQueue.dispatch_forever(); } + +void BikeSystem::dispatch_events() { _eventQueue.dispatch_forever(); } + +} // namespace multi_tasking diff --git a/multi_tasking/bike_system.hpp b/multi_tasking/bike_system.hpp index a4e057c..0cd81ee 100644 --- a/multi_tasking/bike_system.hpp +++ b/multi_tasking/bike_system.hpp @@ -26,9 +26,10 @@ // from advembsof #include "EventQueue.h" -#include "display_device.hpp" -#include "task_logger.hpp" #include "cpu_logger.hpp" +#include "display_device.hpp" +#include "mbed.h" +#include "task_logger.hpp" // from common #include "sensor_device.hpp" @@ -75,22 +76,16 @@ class BikeSystem { void displayTask2(); void cpuTask(); - // stop flag, used for stopping the super-loop (set in stop()) - bool _stopFlag = false; - - std::chrono::microseconds _resetTime = std::chrono::microseconds::zero(); - volatile bool _resetFlag = false; - // timer instance used for loggint task time and used by ResetDevice Timer _timer; // data member that represents the device for manipulating the gear GearDevice _gearDevice; - uint8_t _currentGear = bike_computer::kMinGear; + uint8_t _currentGear = bike_computer::kMinGear; uint8_t _currentGearSize = bike_computer::kMinGearSize; // data member that represents the device for manipulating the pedal rotation // speed/time PedalDevice _pedalDevice; - float _currentSpeed = 0.0f; + float _currentSpeed = 0.0f; float _traveledDistance = 0.0f; // data member that represents the device used for resetting ResetDevice _resetDevice; @@ -109,7 +104,15 @@ class BikeSystem { advembsof::CPULogger _cpuLogger; // Event queues - EventQueue * _isrEventQueue; + EventQueue _isrEventQueue; + EventQueue _eventQueue; + + // Tread for isr events + Thread _isrEventThread; + Thread _mainEventThread; + + void dispatch_isr_events(); + void dispatch_events(); }; -} // namespace static_scheduling +} // namespace multi_tasking diff --git a/multi_tasking/reset_device.cpp b/multi_tasking/reset_device.cpp index 65a6747..0d055ef 100644 --- a/multi_tasking/reset_device.cpp +++ b/multi_tasking/reset_device.cpp @@ -1,12 +1,12 @@ /**************************************************************************** -* @file reset_device.cpp -* @author Rémi Heredero -* @author Yann Sierro -* -* @brief Reset Device implementation (static scheduling with event) -* @date 2024-11-17 -* @version 1.1.0 -****************************************************************************/ + * @file reset_device.cpp + * @author Rémi Heredero + * @author Yann Sierro + * + * @brief Reset Device implementation (static scheduling with event) + * @date 2024-11-17 + * @version 1.1.0 + ****************************************************************************/ #include "reset_device.hpp" @@ -21,16 +21,14 @@ static constexpr uint8_t kPolarityPressed = 1; #endif - #if MBED_CONF_MBED_TRACE_ENABLE #define TRACE_GROUP "ResetDevice" #endif // MBED_CONF_MBED_TRACE_ENABLE namespace multi_tasking { - ResetDevice::ResetDevice(Callback cb) : _resetButton(PUSH_BUTTON) { - _resetButton.fall(cb); - } - - +ResetDevice::ResetDevice(Callback cb) : _resetButton(PUSH_BUTTON) { + _resetButton.fall(cb); } + +} // namespace multi_tasking