git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6040 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
ca4b2f91b7
commit
f569bcec23
|
@ -55,12 +55,15 @@
|
|||
* @brief Type of a kernel statistics structure.
|
||||
*/
|
||||
typedef struct {
|
||||
ucnt_t nirq; /**< @brief IRQ number.
|
||||
@note Fast Interrupts are not
|
||||
accounted for. */
|
||||
ucnt_t nctxswc; /**< @brief Context switch number. */
|
||||
time_measurement_t critical; /**< @brief Critical zones measurement. */
|
||||
time_measurement_t isr; /**< @brief ISR measurement. */
|
||||
time_measurement_t *current; /**< @brief Currently under measurement.*/
|
||||
ucnt_t n_irq; /**< @brief Number of IRQs. */
|
||||
ucnt_t n_ctxswc; /**< @brief Number of context switches. */
|
||||
time_measurement_t m_crit_thd; /**< @brief Measurement of threads
|
||||
critical zones duration. */
|
||||
time_measurement_t m_crit_isr; /**< @brief Measurement of ISRs critical
|
||||
zones duration. */
|
||||
time_measurement_t m_isr; /**< @brief Measurement of ISRs total
|
||||
duration. */
|
||||
} kernel_stats_t;
|
||||
|
||||
/*===========================================================================*/
|
||||
|
@ -70,12 +73,12 @@ typedef struct {
|
|||
/**
|
||||
* @brief Increases the IRQ counter.
|
||||
*/
|
||||
#define _stats_increase_irq() kernel_stats.nirq++
|
||||
#define _stats_increase_irq() kernel_stats.n_irq++
|
||||
|
||||
/**
|
||||
* @brief Increases the context switch counter.
|
||||
*/
|
||||
#define _stats_increase_ctxswc() kernel_stats.nctxswc++
|
||||
#define _stats_increase_ctxswc() kernel_stats.n_ctxswc++
|
||||
|
||||
/*===========================================================================*/
|
||||
/* External declarations. */
|
||||
|
|
|
@ -182,18 +182,16 @@
|
|||
|
||||
/**
|
||||
* @brief Returns the current value of the system real time counter.
|
||||
* @note This function can be called from any context.
|
||||
* @note This function is only available if the port layer supports the
|
||||
* option @p CH_PORT_SUPPORTS_RT.
|
||||
*
|
||||
* @return The value of the system realtime counter of
|
||||
* type rtcnt_t. If the port does not support a
|
||||
* realtime counter then zero is returned.
|
||||
* type rtcnt_t.
|
||||
*
|
||||
* @xclass
|
||||
*/
|
||||
#if CH_PORT_SUPPORTS_RT || defined(__DOXYGEN__)
|
||||
#define chSysGetRealtimeCounterX() (rtcnt_t)port_rt_get_counter_value()
|
||||
#else
|
||||
#define chSysGetRealtimeCounterX() 0
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
|
@ -208,6 +206,10 @@ extern "C" {
|
|||
void chSysTimerHandlerI(void);
|
||||
syssts_t chSysGetAndLockX(void);
|
||||
void chSysRestoreLockX(syssts_t sts);
|
||||
#if CH_PORT_SUPPORTS_RT
|
||||
bool chSysIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end);
|
||||
void chSysPolledDelayX(rtcnt_t cycles);
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -81,13 +81,11 @@ typedef struct {
|
|||
extern "C" {
|
||||
#endif
|
||||
void _tm_init(void);
|
||||
bool chTMIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end);
|
||||
void chTMPolledDelayX(rtcnt_t cycles);
|
||||
void chTMObjectInit(time_measurement_t *tmp);
|
||||
NOINLINE void chTMStartX(time_measurement_t *tmp);
|
||||
NOINLINE void chTMStopX(time_measurement_t *tmp);
|
||||
NOINLINE void chTMChainToX(time_measurement_t *tmp1,
|
||||
time_measurement_t *tmp2);
|
||||
NOINLINE void chTMStartMeasurementX(time_measurement_t *tmp);
|
||||
NOINLINE void chTMStopMeasurementX(time_measurement_t *tmp);
|
||||
NOINLINE void chTMChainMeasurementToX(time_measurement_t *tmp1,
|
||||
time_measurement_t *tmp2);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -67,10 +67,11 @@ kernel_stats_t kernel_stats;
|
|||
*/
|
||||
void _stats_init(void) {
|
||||
|
||||
kernel_stats.nirq = 0;
|
||||
kernel_stats.nctxswc = 0;
|
||||
chTMObjectInit(&kernel_stats.isr);
|
||||
chTMObjectInit(&kernel_stats.critical);
|
||||
kernel_stats.n_irq = 0;
|
||||
kernel_stats.n_ctxswc = 0;
|
||||
chTMObjectInit(&kernel_stats.m_isr);
|
||||
chTMObjectInit(&kernel_stats.m_crit_thd);
|
||||
chTMObjectInit(&kernel_stats.m_crit_isr);
|
||||
}
|
||||
|
||||
#endif /* CH_DBG_STATISTICS */
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
* - Interrupt Handling.
|
||||
* - Power Management.
|
||||
* - Abnormal Termination.
|
||||
* - Realtime counter.
|
||||
* .
|
||||
* @{
|
||||
*/
|
||||
|
@ -245,4 +246,49 @@ void chSysRestoreLockX(syssts_t sts) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#if CH_PORT_SUPPORTS_RT || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Realtime window test.
|
||||
* @details This function verifies if the current realtime counter value
|
||||
* lies within the specified range or not. The test takes care
|
||||
* of the realtime counter wrapping to zero on overflow.
|
||||
* @note When start==end then the function returns always true because the
|
||||
* whole time range is specified.
|
||||
* @note This function is only available if the port layer supports the
|
||||
* option @p CH_PORT_SUPPORTS_RT.
|
||||
*
|
||||
* @param[in] cnt the counter value to be tested
|
||||
* @param[in] start the start of the time window (inclusive)
|
||||
* @param[in] end the end of the time window (non inclusive)
|
||||
* @retval true current time within the specified time window.
|
||||
* @retval false current time not within the specified time window.
|
||||
*
|
||||
* @xclass
|
||||
*/
|
||||
bool chSysIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end) {
|
||||
|
||||
return end > start ? (cnt >= start) && (cnt < end) :
|
||||
(cnt >= start) || (cnt < end);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Polled delay.
|
||||
* @note The real delay is always few cycles in excess of the specified
|
||||
* value.
|
||||
* @note This function is only available if the port layer supports the
|
||||
* option @p CH_PORT_SUPPORTS_RT.
|
||||
*
|
||||
* @param[in] cycles number of cycles
|
||||
*
|
||||
* @xclass
|
||||
*/
|
||||
void chSysPolledDelayX(rtcnt_t cycles) {
|
||||
rtcnt_t start = chSysGetRealtimeCounterX();
|
||||
rtcnt_t end = start + cycles;
|
||||
while (chSysIsCounterWithinX(chSysGetRealtimeCounterX(), start, end))
|
||||
;
|
||||
}
|
||||
#endif /* CH_PORT_SUPPORTS_RT */
|
||||
|
||||
/** @} */
|
||||
|
|
|
@ -83,49 +83,11 @@ void _tm_init(void) {
|
|||
measurements.*/
|
||||
measurement_offset = 0;
|
||||
chTMObjectInit(&tm);
|
||||
chTMStartX(&tm);
|
||||
chTMStopX(&tm);
|
||||
chTMStartMeasurementX(&tm);
|
||||
chTMStopMeasurementX(&tm);
|
||||
measurement_offset = tm.last;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Realtime window test.
|
||||
* @details This function verifies if the current realtime counter value
|
||||
* lies within the specified range or not. The test takes care
|
||||
* of the realtime counter wrapping to zero on overflow.
|
||||
* @note When start==end then the function returns always true because the
|
||||
* whole time range is specified.
|
||||
*
|
||||
* @param[in] cnt the counter value to be tested
|
||||
* @param[in] start the start of the time window (inclusive)
|
||||
* @param[in] end the end of the time window (non inclusive)
|
||||
* @retval true current time within the specified time window.
|
||||
* @retval false current time not within the specified time window.
|
||||
*
|
||||
* @xclass
|
||||
*/
|
||||
bool chTMIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end) {
|
||||
|
||||
return end > start ? (cnt >= start) && (cnt < end) :
|
||||
(cnt >= start) || (cnt < end);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Polled delay.
|
||||
* @note The real delay is always few cycles in excess of the specified
|
||||
* value.
|
||||
*
|
||||
* @param[in] cycles number of cycles
|
||||
*
|
||||
* @xclass
|
||||
*/
|
||||
void chTMPolledDelayX(rtcnt_t cycles) {
|
||||
rtcnt_t start = chSysGetRealtimeCounterX();
|
||||
rtcnt_t end = start + cycles;
|
||||
while (chTMIsCounterWithinX(chSysGetRealtimeCounterX(), start, end))
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Initializes a @p TimeMeasurement object.
|
||||
*
|
||||
|
@ -149,7 +111,7 @@ void chTMObjectInit(time_measurement_t *tmp) {
|
|||
*
|
||||
* @xclass
|
||||
*/
|
||||
NOINLINE void chTMStartX(time_measurement_t *tmp) {
|
||||
NOINLINE void chTMStartMeasurementX(time_measurement_t *tmp) {
|
||||
|
||||
tmp->last = chSysGetRealtimeCounterX();
|
||||
}
|
||||
|
@ -162,7 +124,7 @@ NOINLINE void chTMStartX(time_measurement_t *tmp) {
|
|||
*
|
||||
* @xclass
|
||||
*/
|
||||
NOINLINE void chTMStopX(time_measurement_t *tmp) {
|
||||
NOINLINE void chTMStopMeasurementX(time_measurement_t *tmp) {
|
||||
|
||||
tm_stop(tmp, chSysGetRealtimeCounterX());
|
||||
}
|
||||
|
@ -181,8 +143,8 @@ NOINLINE void chTMStopX(time_measurement_t *tmp) {
|
|||
*
|
||||
* @xclass
|
||||
*/
|
||||
NOINLINE void chTMChainToX(time_measurement_t *tmp1,
|
||||
time_measurement_t *tmp2) {
|
||||
NOINLINE void chTMChainMeasurementToX(time_measurement_t *tmp1,
|
||||
time_measurement_t *tmp2) {
|
||||
|
||||
/* Starts new measurement.*/
|
||||
tmp2->last = chSysGetRealtimeCounterX();
|
||||
|
|
Loading…
Reference in New Issue