RTEMS CPU Kit with SuperCore  4.10.99.0
rtems/capture.h
Go to the documentation of this file.
00001 
00011 /*
00012   ------------------------------------------------------------------------
00013 
00014   Copyright Objective Design Systems Pty Ltd, 2002
00015   All rights reserved Objective Design Systems Pty Ltd, 2002
00016   Chris Johns (ccj@acm.org)
00017 
00018   COPYRIGHT (c) 1989-1998.
00019   On-Line Applications Research Corporation (OAR).
00020 
00021   The license and distribution terms for this file may be
00022   found in the file LICENSE in this distribution.
00023 
00024   This software with is provided ``as is'' and with NO WARRANTY.
00025 
00026   ------------------------------------------------------------------------
00027 
00028   RTEMS Performance Monitoring and Measurement Framework.
00029   This is the Capture Engine component.
00030 
00031 */
00032 
00033 #ifndef __CAPTURE_H_
00034 #define __CAPTURE_H_
00035 
00036 #ifdef __cplusplus
00037 extern "C" {
00038 #endif
00039 
00040 #include <rtems.h>
00041 
00045 #define RTEMS_CAPTURE_TRIGGER_TASKS (32)
00046 
00058 typedef struct rtems_capture_from_s
00059 {
00060   rtems_name name;
00061   rtems_id   id;
00062   uint32_t   trigger;
00063 } rtems_capture_from_t;
00064 
00078 typedef struct rtems_capture_control_s
00079 {
00080   rtems_name                      name;
00081   rtems_id                        id;
00082   uint32_t                        flags;
00083   uint32_t                        to_triggers;
00084   uint32_t                        from_triggers;
00085   uint32_t                        by_triggers;
00086   uint32_t                        by_valid;
00087   rtems_capture_from_t            by[RTEMS_CAPTURE_TRIGGER_TASKS];
00088   struct rtems_capture_control_s* next;
00089 } rtems_capture_control_t;
00090 
00094 #define RTEMS_CAPTURE_CONTROL_FROM_MASK(_s) \
00095  (UINT32_C(1) << (RTEMS_CAPTURE_TRIGGER_TASKS - ((_s) + 1)))
00096 
00100 #define RTEMS_CAPTURE_WATCH         (1U << 0)
00101 
00105 #define RTEMS_CAPTURE_SWITCH        (1 << 0)
00106 #define RTEMS_CAPTURE_CREATE        (1 << 1)
00107 #define RTEMS_CAPTURE_START         (1 << 2)
00108 #define RTEMS_CAPTURE_RESTART       (1 << 3)
00109 #define RTEMS_CAPTURE_DELETE        (1 << 4)
00110 #define RTEMS_CAPTURE_BEGIN         (1 << 5)
00111 #define RTEMS_CAPTURE_EXITTED       (1 << 6)
00112 
00113 #define RTEMS_CAPTURE_FROM_TRIGS    (RTEMS_CAPTURE_SWITCH  | \
00114                                      RTEMS_CAPTURE_CREATE | \
00115                                      RTEMS_CAPTURE_START | \
00116                                      RTEMS_CAPTURE_RESTART | \
00117                                      RTEMS_CAPTURE_DELETE)
00118 
00119 #define RTEMS_CAPTURE_TO_TRIGS      (RTEMS_CAPTURE_SWITCH | \
00120                                      RTEMS_CAPTURE_CREATE | \
00121                                      RTEMS_CAPTURE_START | \
00122                                      RTEMS_CAPTURE_RESTART | \
00123                                      RTEMS_CAPTURE_DELETE | \
00124                                      RTEMS_CAPTURE_BEGIN | \
00125                                      RTEMS_CAPTURE_EXITTED)
00126 
00147 typedef struct rtems_capture_task_s
00148 {
00149   rtems_name                   name;
00150   rtems_id                     id;
00151   uint32_t                     flags;
00152   uint32_t                     refcount;
00153   rtems_tcb*                   tcb;
00154   uint32_t                     in;
00155   uint32_t                     out;
00156   rtems_task_priority          start_priority;
00157   uint32_t                     stack_size;
00158   uint32_t                     stack_clean;
00159   uint32_t                     ticks;
00160   uint32_t                     tick_offset;
00161   uint32_t                     ticks_in;
00162   uint32_t                     tick_offset_in;
00163   uint32_t                     last_ticks;
00164   uint32_t                     last_tick_offset;
00165   rtems_capture_control_t*     control;
00166   struct rtems_capture_task_s* forw;
00167   struct rtems_capture_task_s* back;
00168 } rtems_capture_task_t;
00169 
00173 #define RTEMS_CAPTURE_TRACED  (1U << 0)
00174 
00175 /*
00176  * rtems_capture_record_t
00177  *
00178  *  DESCRIPTION:
00179  *
00180  * RTEMS capture record. This is a record that is written into
00181  * the buffer. The events includes the priority of the task
00182  * at the time of the context switch.
00183  */
00184 typedef struct rtems_capture_record_s
00185 {
00186   rtems_capture_task_t* task;
00187   uint32_t              events;
00188   uint32_t              ticks;
00189   uint32_t              tick_offset;
00190 } rtems_capture_record_t;
00191 
00195 #define RTEMS_CAPTURE_REAL_PRI_EVENT_MASK UINT32_C (0x000000ff)
00196 #define RTEMS_CAPTURE_CURR_PRI_EVENT_MASK UINT32_C (0x0000ff00)
00197 #define RTEMS_CAPTURE_REAL_PRIORITY_EVENT (0)
00198 #define RTEMS_CAPTURE_CURR_PRIORITY_EVENT (8)
00199 #define RTEMS_CAPTURE_EVENT_START         (16)
00200 #define RTEMS_CAPTURE_CREATED_BY_EVENT    UINT32_C (0x00010000)
00201 #define RTEMS_CAPTURE_CREATED_EVENT       UINT32_C (0x00020000)
00202 #define RTEMS_CAPTURE_STARTED_BY_EVENT    UINT32_C (0x00040000)
00203 #define RTEMS_CAPTURE_STARTED_EVENT       UINT32_C (0x00080000)
00204 #define RTEMS_CAPTURE_RESTARTED_BY_EVENT  UINT32_C (0x00100000)
00205 #define RTEMS_CAPTURE_RESTARTED_EVENT     UINT32_C (0x00200000)
00206 #define RTEMS_CAPTURE_DELETED_BY_EVENT    UINT32_C (0x00400000)
00207 #define RTEMS_CAPTURE_DELETED_EVENT       UINT32_C (0x00800000)
00208 #define RTEMS_CAPTURE_BEGIN_EVENT         UINT32_C (0x01000000)
00209 #define RTEMS_CAPTURE_EXITTED_EVENT       UINT32_C (0x02000000)
00210 #define RTEMS_CAPTURE_SWITCHED_OUT_EVENT  UINT32_C (0x04000000)
00211 #define RTEMS_CAPTURE_SWITCHED_IN_EVENT   UINT32_C (0x08000000)
00212 #define RTEMS_CAPTURE_TIMESTAMP           UINT32_C (0x10000000)
00213 #define RTEMS_CAPTURE_EVENT_END           (28)
00214 
00222 typedef enum rtems_capture_trigger_mode_e
00223 {
00224   rtems_capture_to_any,
00225   rtems_capture_from_any,
00226   rtems_capture_from_to
00227 } rtems_capture_trigger_mode_t;
00228 
00236 typedef enum rtems_capture_trigger_e
00237 {
00238   rtems_capture_switch,
00239   rtems_capture_create,
00240   rtems_capture_start,
00241   rtems_capture_restart,
00242   rtems_capture_delete,
00243   rtems_capture_begin,
00244   rtems_capture_exitted
00245 } rtems_capture_trigger_t;
00246 
00257 typedef void (*rtems_capture_timestamp)
00258                 (uint32_t* ticks, uint32_t* micro);
00259 
00270 rtems_status_code
00271 rtems_capture_open (uint32_t                size,
00272                     rtems_capture_timestamp timestamp);
00273 
00282 rtems_status_code
00283 rtems_capture_close (void);
00284 
00292 rtems_status_code
00293 rtems_capture_control (bool enable);
00294 
00304 rtems_status_code
00305 rtems_capture_monitor (bool enable);
00306 
00307 /*
00308  * rtems_capture_flush
00309  *
00310  *  DESCRIPTION:
00311  *
00312  * This function flushes the trace buffer. The prime parameter allows the
00313  * capture engine to also be primed again.
00314  */
00315 rtems_status_code
00316 rtems_capture_flush (bool prime);
00317 
00328 rtems_status_code
00329 rtems_capture_watch_add (rtems_name name, rtems_id id);
00330 
00340 rtems_status_code
00341 rtems_capture_watch_del (rtems_name name, rtems_id id);
00342 
00351 rtems_status_code
00352 rtems_capture_watch_ctrl (rtems_name    name,
00353                           rtems_id      id,
00354                           bool enable);
00355 
00365 rtems_status_code
00366 rtems_capture_watch_global (bool enable);
00367 
00375 bool
00376 rtems_capture_watch_global_on (void);
00377 
00388 rtems_status_code
00389 rtems_capture_watch_ceiling (rtems_task_priority ceiling);
00390 
00398 rtems_task_priority
00399 rtems_capture_watch_get_ceiling (void);
00400 
00411 rtems_status_code
00412 rtems_capture_watch_floor (rtems_task_priority floor);
00413 
00421 rtems_task_priority
00422 rtems_capture_watch_get_floor (void);
00423 
00439 rtems_status_code
00440 rtems_capture_set_trigger (rtems_name                   from_name,
00441                            rtems_id                     from_id,
00442                            rtems_name                   to_name,
00443                            rtems_id                     to_id,
00444                            rtems_capture_trigger_mode_t mode,
00445                            rtems_capture_trigger_t      trigger);
00446 
00456 rtems_status_code
00457 rtems_capture_clear_trigger (rtems_name                   from_name,
00458                              rtems_id                     from_id,
00459                              rtems_name                   to_name,
00460                              rtems_id                     to_id,
00461                              rtems_capture_trigger_mode_t mode,
00462                              rtems_capture_trigger_t      trigger);
00463 
00495 rtems_status_code
00496 rtems_capture_read (uint32_t                 threshold,
00497                     uint32_t                 timeout,
00498                     uint32_t*                read,
00499                     rtems_capture_record_t** recs);
00500 
00509 rtems_status_code
00510 rtems_capture_release (uint32_t count);
00511 
00519 uint32_t
00520 rtems_capture_tick_time (void);
00521 
00522 /*
00523  * rtems_capture_tick_time
00524  *
00525  *  DESCRIPTION:
00526  *
00527  * This function returns the tick period in micro-seconds.
00528  */
00529 uint32_t
00530 rtems_capture_tick_time (void);
00531 
00541 const char*
00542 rtems_capture_event_text (int event);
00543 
00552 rtems_capture_task_t*
00553 rtems_capture_get_task_list (void);
00554 
00563 static inline rtems_capture_task_t*
00564 rtems_capture_next_task (rtems_capture_task_t* task)
00565 {
00566   return task->forw;
00567 }
00568 
00577 static inline bool
00578 rtems_capture_task_valid (rtems_capture_task_t* task)
00579 {
00580   return task->tcb != NULL;
00581 }
00582 
00590 static inline rtems_id
00591 rtems_capture_task_id (rtems_capture_task_t* task)
00592 {
00593   return task->id;
00594 }
00595 
00603 static inline States_Control
00604 rtems_capture_task_state (rtems_capture_task_t* task)
00605 {
00606   if (rtems_capture_task_valid (task))
00607     return task->tcb->current_state;
00608   return 0;
00609 }
00610 
00618 static inline rtems_name
00619 rtems_capture_task_name (rtems_capture_task_t* task)
00620 {
00621   return task->name;
00622 }
00623 
00631 static inline uint32_t
00632 rtems_capture_task_flags (rtems_capture_task_t* task)
00633 {
00634   return task->flags;
00635 }
00636 
00644 static inline rtems_capture_control_t*
00645 rtems_capture_task_control (rtems_capture_task_t* task)
00646 {
00647   return task->control;
00648 }
00649 
00657 static inline uint32_t
00658 rtems_capture_task_control_flags (rtems_capture_task_t* task)
00659 {
00660   if (!task->control)
00661     return 0;
00662   return task->control->flags;
00663 }
00664 
00673 static inline uint32_t
00674 rtems_capture_task_switched_in (rtems_capture_task_t* task)
00675 {
00676   return task->in;
00677 }
00678 
00687 static inline uint32_t
00688 rtems_capture_task_switched_out (rtems_capture_task_t* task)
00689 {
00690   return task->out;
00691 }
00692 
00701 static inline rtems_task_priority
00702 rtems_capture_task_start_priority (rtems_capture_task_t* task)
00703 {
00704   return task->start_priority;
00705 }
00706 
00714 static inline rtems_task_priority
00715 rtems_capture_task_real_priority (rtems_capture_task_t* task)
00716 {
00717   if (rtems_capture_task_valid (task))
00718     return task->tcb->real_priority;
00719   return 0;
00720 }
00721 
00729 static inline rtems_task_priority
00730 rtems_capture_task_curr_priority (rtems_capture_task_t* task)
00731 {
00732   if (rtems_capture_task_valid (task))
00733     return task->tcb->current_priority;
00734   return 0;
00735 }
00736 
00745 uint32_t
00746 rtems_capture_task_stack_usage (rtems_capture_task_t* task);
00747 
00755 static inline uint32_t
00756 rtems_capture_task_stack_size (rtems_capture_task_t* task)
00757 {
00758   return task->stack_size;
00759 }
00760 
00768 static inline uint32_t
00769 rtems_capture_task_stack_used (rtems_capture_task_t* task)
00770 {
00771   return task->stack_size - task->stack_clean;
00772 }
00773 
00781 static inline uint32_t
00782 rtems_capture_task_ticks (rtems_capture_task_t* task)
00783 {
00784   return task->ticks;
00785 }
00786 
00794 static inline uint32_t
00795 rtems_capture_task_tick_offset (rtems_capture_task_t* task)
00796 {
00797   return task->tick_offset;
00798 }
00799 
00807 static inline unsigned long long
00808 rtems_capture_task_time (rtems_capture_task_t* task)
00809 {
00810   unsigned long long t = task->ticks;
00811   return (t * rtems_capture_tick_time ()) + task->tick_offset;;
00812 }
00813 
00822 static inline unsigned long long
00823 rtems_capture_task_delta_time (rtems_capture_task_t* task)
00824 {
00825   unsigned long long t = task->ticks - task->last_ticks;
00826   uint32_t     o = task->tick_offset - task->last_tick_offset;
00827 
00828   task->last_ticks       = task->ticks;
00829   task->last_tick_offset = task->tick_offset;
00830 
00831   return (t * rtems_capture_tick_time ()) + o;
00832 }
00833 
00842 static inline uint32_t
00843 rtems_capture_task_count (void)
00844 {
00845   rtems_capture_task_t* task = rtems_capture_get_task_list ();
00846   uint32_t        count = 0;
00847 
00848   while (task)
00849   {
00850     count++;
00851     task = rtems_capture_next_task (task);
00852   }
00853 
00854   return count;
00855 }
00856 
00865 rtems_capture_control_t*
00866 rtems_capture_get_control_list (void);
00867 
00876 static inline rtems_capture_control_t*
00877 rtems_capture_next_control (rtems_capture_control_t* control)
00878 {
00879   return control->next;
00880 }
00881 
00889 static inline rtems_id
00890 rtems_capture_control_id (rtems_capture_control_t* control)
00891 {
00892   return control->id;
00893 }
00894 
00902 static inline rtems_name
00903 rtems_capture_control_name (rtems_capture_control_t* control)
00904 {
00905   return control->name;
00906 }
00907 
00915 static inline uint32_t
00916 rtems_capture_control_flags (rtems_capture_control_t* control)
00917 {
00918   return control->flags;
00919 }
00920 
00928 static inline uint32_t
00929 rtems_capture_control_to_triggers (rtems_capture_control_t* control)
00930 {
00931   return control->to_triggers;
00932 }
00933 
00941 static inline uint32_t
00942 rtems_capture_control_from_triggers (rtems_capture_control_t* control)
00943 {
00944   return control->from_triggers;
00945 }
00946 
00954 static inline uint32_t
00955 rtems_capture_control_all_by_triggers (rtems_capture_control_t* control)
00956 {
00957   return control->by_triggers;
00958 }
00959 
00967 static inline int
00968 rtems_capture_control_by_valid (rtems_capture_control_t* control, int slot)
00969 {
00970   return control->by_valid & RTEMS_CAPTURE_CONTROL_FROM_MASK (slot);
00971 }
00972 
00980 static inline rtems_name
00981 rtems_capture_control_by_name (rtems_capture_control_t* control, int by)
00982 {
00983   if (by < RTEMS_CAPTURE_TRIGGER_TASKS)
00984     return control->by[by].name;
00985   return control->by[0].name;
00986 }
00987 
00995 static inline rtems_id
00996 rtems_capture_control_by_id (rtems_capture_control_t* control, int by)
00997 {
00998   if (by < RTEMS_CAPTURE_TRIGGER_TASKS)
00999     return control->by[by].id;
01000   return control->by[0].id;
01001 }
01002 
01010 static inline uint32_t
01011 rtems_capture_control_by_triggers (rtems_capture_control_t* control,
01012                                    int                      by)
01013 {
01014   if (by < RTEMS_CAPTURE_TRIGGER_TASKS)
01015     return control->by[by].trigger;
01016   return control->by[0].trigger;
01017 }
01018 
01027 static inline uint32_t
01028 rtems_capture_control_count (void)
01029 {
01030   rtems_capture_control_t* control = rtems_capture_get_control_list ();
01031   uint32_t                 count = 0;
01032 
01033   while (control)
01034   {
01035     count++;
01036     control = rtems_capture_next_control (control);
01037   }
01038 
01039   return count;
01040 }
01041 
01042 #ifdef __cplusplus
01043 }
01044 #endif
01045 
01046 #endif