调了有三四天u-boot了,但命令一直在往上加,只调u-boot,而命令成功之后就不用了,但又不想修改配置文件先把命令关掉,可是在调试的时候一运行help就显示一两屏的指令列表,超级终端本来就只能显示那么小,很不方便。

后来改了一个叫DNW 0.51A的软件,显示更好一些,但就是不支持kermit协议,不能发送文件,发送文件的时候还得再跑到超级终端,网卡好了之后通过网线下载,也就不用串口下程序了,但这是后话。即使是这样仍感觉列表太长。

于是想通过通配符*进行过滤,过滤后就可以通过

help i*

列出所有以i开头的指令,这样就少多了,基本上在同一屏上可以显完。于是找到do_help()函数,修改了代码,完整的u-boot 1.1.4的/common/command.c文件中的do_help()函数内容如下:

/*
* Use puts() instead of printf() to avoid printf buffer overflow
* for long help messages
*/

int do_help (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{
int i;
int rcode = 0;

if (argc < 3) { /*show list of commands */

  int cmd_items = &__u_boot_cmd_end -
    &__u_boot_cmd_start; /* pointer arith! */
  cmd_tbl_t *cmd_array[cmd_items];
  int i, j, swaps;

  /* Make array of commands from .uboot_cmd section */
  cmdtp = &__u_boot_cmd_start;
  for (i = 0; i < cmd_items; i++) {
   cmd_array[i] = cmdtp++;
  }

  /* Sort command list (trivial bubble sort) */
  for (i = cmd_items - 1; i > 0; --i) {
   swaps = 0;
   for (j = 0; j < i; ++j) {
    if (strcmp (cmd_array[j]->name,
         cmd_array[j + 1]->name) > 0) {
     cmd_tbl_t *tmp;
     tmp = cmd_array[j];
     cmd_array[j] = cmd_array[j + 1];
     cmd_array[j + 1] = tmp;
     ++swaps;
    }
   }
   if (!swaps)
    break;
  }

  /* print short help (usage) */

  /*
   * use a * to list all command
   * Nocky Tian 2006-08-25
   */
  if(argc == 2){
   int star;
   for(star=0; argv[1][star] != '*' && argv[1][star] != 0; star++){
   }
   if( star < strlen(argv[1])){
    for(i=0; i < cmd_items; i++){
     if(strncmp(cmd_array[i]->name, argv[1], star) == 0){
      puts(cmd_array[i]->usage);
     }
    }
    return 0;
   }

  }
  /* Nocky end */
  else{
   for (i = 0; i < cmd_items; i++) {
    const char *usage = cmd_array[i]->usage;

    /* allow user abort */
    if (ctrlc ())
     return 1;
    if (usage == NULL)
     continue;
    puts (usage);
   }
   puts("/n You can use /" help xx* /" to list all command starting with a xx, where xx can be any letters/n");
   return 0;
  }

}

/*
  * command help (long version)
  */
for (i = 1; i < argc; ++i) {
  if ((cmdtp = find_cmd (argv[i])) != NULL) {
#ifdef CFG_LONGHELP
   /* found - print (long) help info */
   puts (cmdtp->name);
   putc (' ');
   if (cmdtp->help) {
    puts (cmdtp->help);
   } else {
    puts ("- No help available./n");
    rcode = 1;
   }
   putc ('/n');
#else /* no long help available */
   if (cmdtp->usage)
    puts (cmdtp->usage);
#endif /* CFG_LONGHELP */
  } else {
   printf ("Unknown command '%s' - try 'help'"
    " without arguments for list of all"
    " known commands/n/n", argv[i]
     );
   rcode = 1;
  }
}
return rcode;
}

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐