📄 capture-cli.c
字号:
printf ("error: watch floor failed: %s\n", rtems_status_text (sc)); return; } printf ("watch floor is %i.\n", priority);}/* * rtems_capture_cli_trigger_set * * DESCRIPTION: * * This function is a monitor command that sets a trigger. * */static char const *trigger_set_usage = "usage: ctrig type [from] [fromid] [to] [to id]\n";static voidrtems_capture_cli_trigger_set ( int argc, char **argv, unsigned32 command_arg, boolean verbose ){ rtems_status_code sc; int arg; rtems_capture_trigger_t trigger = rtems_capture_from_to; rtems_boolean trigger_set = 0; rtems_name name = 0; rtems_id id = 0; rtems_boolean valid_name = 0; rtems_boolean valid_id = 0; rtems_name from_name = 0; rtems_id from_id = 0; rtems_boolean from_valid_name = 0; rtems_boolean from_valid_id = 0; rtems_name to_name = 0; rtems_id to_id = 0; rtems_boolean to_valid_name = 0; rtems_boolean to_valid_id = 0; if (argc <= 2) { printf (trigger_set_usage); return; } for (arg = 1; arg < argc; arg++) { if (argv[arg][0] == '-') { printf ("warning: option -%c ignored\n", argv[arg][1]); } else { if (!trigger_set) { if (strcmp (argv[arg], "from") == 0) trigger = rtems_capture_to_any; else if (strcmp (argv[arg], "to") == 0) trigger = rtems_capture_from_any; else if (strcmp (argv[arg], "edge") == 0) trigger = rtems_capture_from_any; else { printf ("error: the first argument is the trigger type (from/to/edge)\n"); return; } trigger_set = 1; } else { if (trigger == rtems_capture_to_any) { if (from_valid_name && from_valid_id) printf ("warning: extra arguments ignored\n"); else if (!rtems_capture_cli_get_name_id (argv[arg], &from_valid_name, &from_valid_id, &from_name, &from_id)) return; } else if (trigger == rtems_capture_from_any) { if (to_valid_name && to_valid_id) printf ("warning: extra arguments ignored\n"); else if (!rtems_capture_cli_get_name_id (argv[arg], &to_valid_name, &to_valid_id, &to_name, &to_id)) return; } else if (trigger == rtems_capture_from_to) { if (from_valid_name && from_valid_id && to_valid_name && to_valid_id) printf ("warning: extra arguments ignored\n"); else { if (!rtems_capture_cli_get_name_id (argv[arg], &valid_name, &valid_id, &name, &id)) return; if (valid_name) { if (!from_valid_name && !from_valid_id) { from_valid_name = 1; from_name = name; } else if (to_valid_name) printf ("warning: extra arguments ignored\n"); else { to_valid_name = 1; to_name = name; } } if (valid_id) { if (!from_valid_id && !to_valid_name) { from_valid_id = 1; from_id = id; } else if (to_valid_id) printf ("warning: extra arguments ignored\n"); else { to_valid_id = 1; to_id = id; } } } } } } } if ((trigger == rtems_capture_to_any) && !from_valid_name && !from_valid_id) { printf ("error: a from trigger need a to name or id\n"); return; } if ((trigger == rtems_capture_from_any) && !to_valid_name && !to_valid_id) { printf ("error: a to trigger need a from name or id\n"); return; } if ((trigger == rtems_capture_from_to) && ((!from_valid_name && !from_valid_id) || (!to_valid_name && !to_valid_id))) { printf ("error: an edge trigger need a from and to name or id\n"); return; } sc = rtems_capture_set_trigger (from_name, from_id, to_name, to_id, trigger); if (sc != RTEMS_SUCCESSFUL) { printf ("error: setting the trigger failed: %s\n", rtems_status_text (sc)); return; } printf ("trigger set.\n");}/* * rtems_capture_cli_trace_records * * DESCRIPTION: * * This function is a monitor command that dumps trace records. * */static voidrtems_capture_cli_trace_records ( int argc, char **argv, unsigned32 command_arg, boolean verbose ){ rtems_status_code sc; rtems_boolean csv = 0; static int dump_total = 32; int total; int count; rtems_unsigned32 read; rtems_capture_record_t* rec; int arg; for (arg = 1; arg < argc; arg++) { if (argv[arg][0] == '-') { if (argv[arg][1] == 'c') csv = 1; else if (argv[arg][1] == 'r') { int i; int l; arg++; if (arg == argc) { printf ("error: option -r requires number\n"); return; } l = strlen (argv[arg]); for (i = 0; i < l; i++) if (!isdigit (argv[arg][i])) { printf ("error: option -r requires number and currently it is not\n"); return; } dump_total = strtoul (argv[arg], 0, 0); } else printf ("warning: option -%c ignored\n", argv[arg][1]); } } total = dump_total; while (total) { sc = rtems_capture_read (0, 0, &read, &rec); if (sc != RTEMS_SUCCESSFUL) { printf ("error: trace read failed: %s\n", rtems_status_text (sc)); rtems_capture_flush (0); return; } if (read == 0) break; for (count = 0; count < read; count++, rec++) { if (csv) printf ("%08x,%03d,%03d,%04x,%d,%d\n", (rtems_unsigned32) rec->task, (rec->events >> RTEMS_CAPTURE_REAL_PRIORITY_EVENT) & 0xff, (rec->events >> RTEMS_CAPTURE_CURR_PRIORITY_EVENT) & 0xff, (rec->events >> RTEMS_CAPTURE_EVENT_START), rec->ticks, rec->tick_offset); else { unsigned long long t; rtems_unsigned32 event; int e; event = rec->events >> RTEMS_CAPTURE_EVENT_START; t = rec->ticks; t *= rtems_capture_tick_time (); t += rec->tick_offset; for (e = RTEMS_CAPTURE_EVENT_START; e < RTEMS_CAPTURE_EVENT_END; e++) { if (event & 1) { printf ("%9li.%06li ", (unsigned long) (t / 1000000), (unsigned long) (t % 1000000)); rtems_monitor_dump_id (rtems_capture_task_id (rec->task)); printf (" "); rtems_monitor_dump_name (rtems_capture_task_name (rec->task)); printf (" %3i %3i %s\n", (rec->events >> RTEMS_CAPTURE_REAL_PRIORITY_EVENT) & 0xff, (rec->events >> RTEMS_CAPTURE_CURR_PRIORITY_EVENT) & 0xff, rtems_capture_event_text (e)); } event >>= 1; } } } if (read < total) total -= read; else total = 0; rtems_capture_release (read); }}/* * rtems_capture_cli_flush * * DESCRIPTION: * * This function is a monitor command that flushes and primes the capture * engine. * */static voidrtems_capture_cli_flush ( int argc, char **argv, unsigned32 command_arg, boolean verbose ){ rtems_status_code sc; rtems_boolean prime = 1; int arg; for (arg = 1; arg < argc; arg++) { if (argv[arg][0] == '-') { if (argv[arg][1] == 'n') prime = 0; else printf ("warning: option -%c ignored\n", argv[arg][1]); } } sc = rtems_capture_flush (prime); if (sc != RTEMS_SUCCESSFUL) { printf ("error: flush failed: %s\n", rtems_status_text (sc)); return; } printf ("trace buffer flushed and %s.\n", prime ? "primed" : "not primed");}static rtems_monitor_command_entry_t rtems_capture_cli_cmds[] ={ { "copen", "usage: copen [-i] size\n", 0, rtems_capture_cli_open, 0, 0 }, { "cclose", "usage: cclose\n", 0, rtems_capture_cli_close, 0, 0 }, { "cenable", "usage: cenable\n", 0, rtems_capture_cli_enable, 0, 0 }, { "cdisable", "usage: cdisable\n", 0, rtems_capture_cli_disable, 0, 0 }, { "ctlist", "usage: ctlist \n", 0, rtems_capture_cli_task_list, 0, 0 }, { "ctload", "usage: ctload \n", 0, rtems_capture_cli_task_load, 0, 0 }, { "cwlist", "usage: cwlist\n", 0, rtems_capture_cli_watch_list, 0, 0 }, { "cwadd", "usage: cwadd [task name] [id]\n", 0, rtems_capture_cli_watch_add, 0, 0 }, { "cwdel", "usage: cwdel [task name] [id]\n", 0, rtems_capture_cli_watch_del, 0, 0 }, { "cwctl", "usage: cwctl [task name] [id] on/off\n", 0, rtems_capture_cli_watch_control, 0, 0 }, { "cwglob", "usage: cwglob on/off\n", 0, rtems_capture_cli_watch_global, 0, 0 }, { "cwceil", "usage: cwceil priority\n", 0, rtems_capture_cli_watch_ceiling, 0, 0 }, { "cwfloor", "usage: cwfloor priority\n", 0, rtems_capture_cli_watch_floor, 0, 0 }, { "ctrace", "usage: ctrace [-c] [-r records]\n", 0, rtems_capture_cli_trace_records, 0, 0 }, { "ctrig", "usage: ctrig type [from name] [from id] [to name] [to id]\n", 0, rtems_capture_cli_trigger_set, 0, 0 }, { "cflush", "usage: cflush [-n]\n", 0, rtems_capture_cli_flush, 0, 0 }};/* * rtems_capture_cli_init * * DESCRIPTION: * * This function initialises the command line interface to the capture * engine. * */rtems_status_codertems_capture_cli_init (rtems_capture_timestamp timestamp){ int cmd; capture_timestamp = timestamp; for (cmd = 0; cmd < sizeof (rtems_capture_cli_cmds) / sizeof (rtems_monitor_command_entry_t); cmd++) rtems_monitor_insert_cmd (&rtems_capture_cli_cmds[cmd]); return RTEMS_SUCCESSFUL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -