⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 capture-cli.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -