diff options
Diffstat (limited to 'cpukit/score/include')
-rw-r--r-- | cpukit/score/include/rtems/score/thread.h | 37 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/timespec.h | 23 |
2 files changed, 56 insertions, 4 deletions
diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h index c23f9cf05c..1d8ba50705 100644 --- a/cpukit/score/include/rtems/score/thread.h +++ b/cpukit/score/include/rtems/score/thread.h @@ -31,6 +31,20 @@ extern "C" { #endif +/* + * The user can define this at configure time and go back to ticks + * resolution. + */ +#ifndef __RTEMS_USE_TICKS_CPU_USAGE_STATISTICS__ + /* + * Enable the nanosecond accurate statistics + * + * When not defined, the older style tick accurate granularity + * is used. + */ + #define RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS +#endif + #include <rtems/score/context.h> #include <rtems/score/cpu.h> #if defined(RTEMS_MULTIPROCESSING) @@ -44,6 +58,10 @@ extern "C" { #include <rtems/score/tqdata.h> #include <rtems/score/watchdog.h> +#ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS + /* XXX include something for timespec */ +#endif + /** * The following defines the "return type" of a thread. * @@ -318,10 +336,14 @@ struct Thread_Control_struct { /** This field is the method invoked with the budgeted time is consumed. */ Thread_CPU_budget_algorithm_callout budget_callout; - /** This field is the number of clock ticks executed by this thread + /** This field is the amount of CPU time consumed by this thread * since it was created. */ - uint32_t ticks_executed; + #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS + struct timespec cpu_time_used; + #else + uint32_t ticks_executed; + #endif /** This field points to the Ready FIFO for this priority. */ Chain_Control *ready; /** This field contains precalculated priority map indices. */ @@ -435,6 +457,17 @@ SCORE_EXTERN Thread_Control *_Thread_Allocated_fp; */ SCORE_EXTERN struct _reent **_Thread_libc_reent; +#ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS + + /** + * This contains the time since boot when the last context switch occurred. + * By placing it in the BSS, it will automatically be zeroed out at + * system initialization and does not need to be known outside this + * file. + */ + SCORE_EXTERN struct timespec _Thread_Time_of_last_context_switch; +#endif + /** * This routine performs the initialization necessary for this handler. */ diff --git a/cpukit/score/include/rtems/score/timespec.h b/cpukit/score/include/rtems/score/timespec.h index 2ffde63fc2..cc65e4084a 100644 --- a/cpukit/score/include/rtems/score/timespec.h +++ b/cpukit/score/include/rtems/score/timespec.h @@ -135,7 +135,7 @@ void _Timespec_Subtract( struct timespec *result ); -/** @brief Divide Timespec +/** @brief Divide Timespec By Integet * * This routine divides a timespec by an integer value. The expected * use is to assist in benchmark calculations where you typically @@ -147,12 +147,31 @@ void _Timespec_Subtract( * * @return This method fills in @a result. */ -void _Timespec_Divide( +void _Timespec_Divide_by_integer( const struct timespec *time, uint32_t iterations, struct timespec *result ); +/** @brief Divide Timespec + * + * This routine divides a timespec by another timespec. The + * intended use is for calculating percentages to three decimal points. + * + * @param[in] lhs is the left hand number + * @param[in] rhs is the righ hand number + * @param[in] ival_percentage is the integer portion of the average + * @param[in] fval_percentage is the thousandths of percentage + * + * @return This method fills in @a result. + */ +void _Timespec_Divide( + const struct timespec *lhs, + const struct timespec *rhs, + uint32_t *ival_percentage, + uint32_t *fval_percentage +); + #ifdef __cplusplus } #endif |