|
RTEMS CPU Kit with SuperCore
4.10.99.0
|
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
1.7.5