summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-10-12 08:26:39 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-10-25 08:01:02 +0200
commit0221da5f56353c9b238ef51d5a24802ba67b8c56 (patch)
tree4823b8d298eb678c20db4078c2ec8e1e13fa52e5 /cpukit/rtems
parentscore: Optimize default idle task stack allocator (diff)
downloadrtems-0221da5f56353c9b238ef51d5a24802ba67b8c56.tar.bz2
rtems: Fix rate monotonic statistics
The rate monotonic period statistics were affected by rtems_cpu_usage_reset(). The logic to detect and work around a CPU usage reset was broken. The Thread_Contol::cpu_time_used is changed to contain the processor time used throughout the entire lifetime of the thread. The new member Thread_Contol::cpu_time_used_at_last_reset is added to contain the processor time used at the time of the last reset through rtems_cpu_usage_reset(). This decouples the resets of the CPU usage and the rate monotonic period statistics. Update #4528.
Diffstat (limited to 'cpukit/rtems')
-rw-r--r--cpukit/rtems/src/ratemongetstatus.c28
-rw-r--r--cpukit/rtems/src/ratemonperiod.c21
2 files changed, 14 insertions, 35 deletions
diff --git a/cpukit/rtems/src/ratemongetstatus.c b/cpukit/rtems/src/ratemongetstatus.c
index 745b52f026..5b46a7a435 100644
--- a/cpukit/rtems/src/ratemongetstatus.c
+++ b/cpukit/rtems/src/ratemongetstatus.c
@@ -31,7 +31,6 @@ rtems_status_code rtems_rate_monotonic_get_status(
{
Rate_monotonic_Control *the_period;
ISR_lock_Context lock_context;
- rtems_status_code status;
if ( period_status == NULL ) {
return RTEMS_INVALID_ADDRESS;
@@ -54,35 +53,28 @@ rtems_status_code rtems_rate_monotonic_get_status(
*/
_Timespec_Set_to_zero( &period_status->since_last_period );
_Timespec_Set_to_zero( &period_status->executed_since_last_period );
- status = RTEMS_SUCCESSFUL;
} else {
Timestamp_Control wall_since_last_period;
Timestamp_Control cpu_since_last_period;
- bool valid_status;
/*
* Grab the current status.
*/
- valid_status = _Rate_monotonic_Get_status(
+ _Rate_monotonic_Get_status(
the_period,
&wall_since_last_period,
&cpu_since_last_period
);
- if ( valid_status ) {
- _Timestamp_To_timespec(
- &wall_since_last_period,
- &period_status->since_last_period
- );
- _Timestamp_To_timespec(
- &cpu_since_last_period,
- &period_status->executed_since_last_period
- );
- status = RTEMS_SUCCESSFUL;
- } else {
- status = RTEMS_NOT_DEFINED;
- }
+ _Timestamp_To_timespec(
+ &wall_since_last_period,
+ &period_status->since_last_period
+ );
+ _Timestamp_To_timespec(
+ &cpu_since_last_period,
+ &period_status->executed_since_last_period
+ );
}
_Rate_monotonic_Release( the_period, &lock_context );
- return status;
+ return RTEMS_SUCCESSFUL;
}
diff --git a/cpukit/rtems/src/ratemonperiod.c b/cpukit/rtems/src/ratemonperiod.c
index 7f0d302583..32ac688a7f 100644
--- a/cpukit/rtems/src/ratemonperiod.c
+++ b/cpukit/rtems/src/ratemonperiod.c
@@ -26,7 +26,7 @@
#include <rtems/score/schedulerimpl.h>
#include <rtems/score/todimpl.h>
-bool _Rate_monotonic_Get_status(
+void _Rate_monotonic_Get_status(
const Rate_monotonic_Control *the_period,
Timestamp_Control *wall_since_last_period,
Timestamp_Control *cpu_since_last_period
@@ -47,14 +47,7 @@ bool _Rate_monotonic_Get_status(
/*
* Determine cpu usage since period initiated.
*/
- _Thread_Get_CPU_time_used( owning_thread, &used );
-
- /*
- * The cpu usage info was reset while executing. Can't
- * determine a status.
- */
- if ( _Timestamp_Less_than( &used, &the_period->cpu_usage_period_initiated ) )
- return false;
+ used = _Thread_Get_CPU_time_used( owning_thread );
/* used = current cpu usage - cpu usage at start of period */
_Timestamp_Subtract(
@@ -62,8 +55,6 @@ bool _Rate_monotonic_Get_status(
&used,
cpu_since_last_period
);
-
- return true;
}
static void _Rate_monotonic_Release_postponed_job(
@@ -130,7 +121,7 @@ void _Rate_monotonic_Restart(
* Set the starting point and the CPU time used for the statistics.
*/
_TOD_Get_uptime( &the_period->time_period_initiated );
- _Thread_Get_CPU_time_used( owner, &the_period->cpu_usage_period_initiated );
+ the_period->cpu_usage_period_initiated = _Thread_Get_CPU_time_used( owner );
_Rate_monotonic_Release_job(
the_period,
@@ -147,7 +138,6 @@ static void _Rate_monotonic_Update_statistics(
Timestamp_Control executed;
Timestamp_Control since_last_period;
Rate_monotonic_Statistics *stats;
- bool valid_status;
/*
* Assume we are only called in states where it is appropriate
@@ -167,10 +157,7 @@ static void _Rate_monotonic_Update_statistics(
/*
* Grab status for time statistics.
*/
- valid_status =
- _Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
- if (!valid_status)
- return;
+ _Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
/*
* Update CPU time