ADD measure time call

This commit is contained in:
fastium
2025-01-04 15:51:51 +01:00
parent 4fb09c690c
commit b9c129e872
6 changed files with 125 additions and 92 deletions

View File

@@ -62,15 +62,28 @@ static constexpr std::chrono::milliseconds kCPUTaskDelay = 0
static constexpr std::chrono::milliseconds kCPUTaskComputationTime = 0ms;
BikeSystem::BikeSystem()
: _gearDevice(&_mailGearDevice),
_pedalDevice(&_mailPedalDevice),
_resetDevice(callback(this, &BikeSystem::onReset)),
_speedometer(_timer),
_cpuLogger(_timer),
: _timer(),
_isrEventQueue(),
_eventQueue(),
_mailPedalDevice(),
_mailGearDevice(),
_mutexGearSize(),
_mutexGear(),
_mutexSpeed(),
_mutexDistance(),
_mutexSpeedometer(),
_isrEventThread(osPriorityAboveNormal, OS_STACK_SIZE, nullptr, "ISR_Event"),
_speedDistanceThread(
osPriorityNormal, OS_STACK_SIZE, nullptr, "Speed_distance_Task"),
_gearTaskThread(osPriorityNormal, OS_STACK_SIZE, nullptr, "Gear_Task") {}
_gearTaskThread(osPriorityNormal, OS_STACK_SIZE, nullptr, "Gear_Task"),
_gearDevice(&_mailGearDevice, _timer),
_pedalDevice(&_mailPedalDevice, _timer),
_resetDevice(callback(this, &BikeSystem::onReset)),
_displayDevice(),
_speedometer(_timer),
_sensorDevice(),
_taskLogger(),
_cpuLogger(_timer) {}
#if defined(MBED_TEST_MODE)
const advembsof::TaskLogger& BikeSystem::getTaskLogger() { return _taskLogger; }
@@ -99,21 +112,16 @@ void BikeSystem::init() {
void BikeSystem::start() {
init();
Event<void()> display1Event(&_eventQueue, callback(this, &BikeSystem::displayTask1));
display1Event.delay(kDisplayTask1Delay);
display1Event.period(kDisplayTask1Period);
display1Event.post();
Event<void()> temperatureEvent(&_eventQueue,
callback(this, &BikeSystem::temperatureTask));
temperatureEvent.delay(kTemperatureTaskDelay);
temperatureEvent.period(kTemperatureTaskPeriod);
temperatureEvent.post();
Event<void()> display2Event(&_eventQueue, callback(this, &BikeSystem::displayTask2));
display2Event.delay(kDisplayTask2Delay);
display2Event.period(kDisplayTask2Period);
display2Event.post();
Event<void()> displayEvent(&_eventQueue, callback(this, &BikeSystem::displayTask));
displayEvent.delay(kDisplayTask1Delay);
displayEvent.period(kDisplayTask1Period);
displayEvent.post();
osStatus status =
_isrEventThread.start(callback(this, &BikeSystem::dispatch_isr_events));
@@ -132,6 +140,13 @@ void BikeSystem::start() {
tr_error("Thread %s started with status %d", _gearTaskThread.get_name(), status);
}
#if !defined(MBED_TEST_MODE)
Event<void()> cpuEvent(&_eventQueue, callback(this, &BikeSystem::cpuTask));
cpuEvent.delay(kCPUTaskDelay);
cpuEvent.period(kCPUTaskPeriod);
cpuEvent.post();
#endif
// dispatch the main queue in the main thread
dispatch_events();
}
@@ -167,26 +182,30 @@ void BikeSystem::resetTask() {
void BikeSystem::speedDistanceTask() {
auto taskStartTime = _timer.elapsed_time();
uint32_t* currentStep = _mailPedalDevice.try_get();
pedalMail_t* currentStep = _mailPedalDevice.try_get();
if (currentStep != nullptr) {
const auto pedalRotationTime = PedalDevice::getCurrentRotationTime(*currentStep);
osStatus status = _mailPedalDevice.free(currentStep);
if (status != osOK) {
tr_error("free current step in the speed distance tasks doesn't work !");
}
const auto pedalRotationTime =
PedalDevice::getCurrentRotationTime(currentStep->step);
// ENTER CRITICAL SECTION
_mutexSpeedometer.lock();
_speedometer.setCurrentRotationTime(pedalRotationTime);
_mutexSpeedometer.unlock();
// END CRITICAL SECTION
std::chrono::microseconds responseTime =
_timer.elapsed_time() - currentStep->callTime;
tr_info("Reset task: response time is %" PRIu64 " usecs", responseTime.count());
osStatus status = _mailPedalDevice.free(currentStep);
if (status != osOK) {
tr_error("free current step in the speed distance tasks doesn't work !");
}
}
// ENTER CRITICAL SECTION
_mutexSpeedometer.lock();
tr_info("%d", getCurrentGearSize());
_speedometer.setGearSize(getCurrentGearSize());
_mutexSpeed.lock();
_currentSpeed = _speedometer.getCurrentSpeed();
@@ -205,21 +224,25 @@ void BikeSystem::speedDistanceTask() {
void BikeSystem::gearTask() {
auto taskStartTime = _timer.elapsed_time();
uint8_t* currentGear = _mailGearDevice.try_get();
gearMail_t* currentGear = _mailGearDevice.try_get();
if (currentGear != nullptr) {
// ENTER CRITICAL SECTION
_mutexGear.lock();
_currentGear = *currentGear;
_currentGear = currentGear->gear;
_mutexGear.unlock();
_mutexGearSize.lock();
_currentGearSize = bike_computer::kMaxGearSize - *currentGear;
_currentGearSize = bike_computer::kMaxGearSize - currentGear->gear;
_mutexGearSize.unlock();
// END CRITICAL SECTION
std::chrono::microseconds responseTime =
_timer.elapsed_time() - currentGear->callTime;
tr_info("Reset task: response time is %" PRIu64 " usecs", responseTime.count());
osStatus status = _mailGearDevice.free(currentGear);
if (status != osOK) {
tr_error("free current step in the speed distance tasks doesn't work !");
tr_error("free current gear in the gear tasks doesn't work !");
}
}
_taskLogger.logPeriodAndExecutionTime(
@@ -241,7 +264,7 @@ void BikeSystem::temperatureTask() {
_timer, advembsof::TaskLogger::kTemperatureTaskIndex, taskStartTime);
}
void BikeSystem::displayTask1() {
void BikeSystem::displayTask() {
auto taskStartTime = _timer.elapsed_time();
// ENTER CRITICAL SECTION
@@ -250,25 +273,15 @@ void BikeSystem::displayTask1() {
_displayDevice.displayDistance(getCurrentDistance());
// END CRITICAL SECTION
ThisThread::sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(
kDisplayTask1ComputationTime - (_timer.elapsed_time() - taskStartTime)));
_displayDevice.displayTemperature(_currentTemperature);
// ThisThread::sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(kDisplayTask1ComputationTime
// - (_timer.elapsed_time() - taskStartTime)));
_taskLogger.logPeriodAndExecutionTime(
_timer, advembsof::TaskLogger::kDisplayTask1Index, taskStartTime);
}
void BikeSystem::displayTask2() {
auto taskStartTime = _timer.elapsed_time();
_displayDevice.displayTemperature(_currentTemperature);
ThisThread::sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(
kDisplayTask2ComputationTime - (_timer.elapsed_time() - taskStartTime)));
_taskLogger.logPeriodAndExecutionTime(
_timer, advembsof::TaskLogger::kDisplayTask2Index, taskStartTime);
}
void BikeSystem::cpuTask() { _cpuLogger.printStats(); }
void BikeSystem::dispatch_isr_events() {
@@ -321,8 +334,8 @@ uint8_t BikeSystem::getCurrentGearSize() {
return currentGearSize;
}
uint32_t BikeSystem::getCurrentSpeed() {
uint32_t currentSpeed;
float BikeSystem::getCurrentSpeed() {
float currentSpeed;
// ENTER CRITICAL SECTION
_mutexSpeed.lock();
@@ -333,8 +346,8 @@ uint32_t BikeSystem::getCurrentSpeed() {
return currentSpeed;
}
uint32_t BikeSystem::getCurrentDistance() {
uint32_t currentDistance;
float BikeSystem::getCurrentDistance() {
float currentDistance;
// ENTER CRITICAL SECTION
_mutexDistance.lock();