finsh(c-style)中增加命令/变量

finsh支持两种方式向finsh中输出符号(函数或变量),下面将分别介绍这两种方式。

宏方式

需要在rtconfig.h中定义宏FINSH_USING_SYMTAB。

  1. #include <finsh.h>
  2. FINSH_FUNCTION_EXPORT(name, desc)

  1. 参数 描述

  1. name 函数指针,一般为函数名;
  2.  
  3. desc 针对这个函数命令的描述信息;

desc一般为一段字符串,中间不可以有逗号,两边也没有引号。

  1. FINSH_VAR_EXPORT(name, type, desc)

  1. 参数 描述

  1. name 变量名;
  2.  
  3. type 变量类型;
  4.  
  5. desc 变量描述;

type的包括以下类型:

  1. enum finsh_type{
  2. finsh_type_unknown = 0, /**< unknown data type */
  3. finsh_type_void, /**< void */
  4. finsh_type_voidp, /**< void pointer */
  5. finsh_type_char, /**< char */
  6. finsh_type_uchar, /**< unsigned char */
  7. finsh_type_charp, /**< char pointer */
  8. finsh_type_short, /**< short */
  9. finsh_type_ushort, /**< unsigned short */
  10. finsh_type_shortp, /**< short pointer */
  11. finsh_type_int, /**< int */
  12. finsh_type_uint, /**< unsigned int */
  13. finsh_type_intp, /**< int pointer */
  14. finsh_type_long, /**< long */
  15. finsh_type_ulong, /**< unsigned long */
  16. finsh_type_longp, /**< long pointer */
  17. };

此外FINSH还提供了另外一个宏,它在输出函数为命令时,可以指定命令的名字。

  1. #include <finsh.h>
  2. FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc)

  1. 参数 描述

  1. name 函数指针,一般为函数名;
  2.  
  3. alias 输出到finsh中的命令名;
  4.  
  5. desc 函数描述;

当函数名字过长时,可以利用上面这个宏导出一个简短的名字以方便输入。

  • 说明: FINSH的函数名字长度有一定限制,它由finsh.h中的宏定义FINSH_NAME_MAX控制,默认是16字节。意味着finsh命令长度不会超过16字节。这里有个潜在的问题。当一个函数名长度超过FINSH_NAME_MAX时,使用FINSH_FUNCTION_EXPORT导出这个函数到命令表中后,在finsh符号表中看到完整的函数名,但是完整输入执行会出现null node错误。这是因为虽然显示了完整的函数名,但是实际上finsh中却保存了前16字节作为命令,过多的输入会导致无法正确找到命令,这时就可以使用FINSH_FUNCTION_EXPORT_ALIAS来对导出的命令进行重命名。
    一个简单的输出函数和变量到finsh的例子:
  1. #include <finsh.h>
  2.  
  3. int var;
  4.  
  5. int hello_rtt(int a)
  6. {
  7. rt_kprintf("hello, world! I am %d\n", a);
  8. return a;
  9. }
  10. FINSH_FUNCTION_EXPORT(hello_rtt, say hello to rtt)
  11. FINSH_FUNCTION_EXPORT_ALIAS(hello_rtt, hr, say hello to rtt)
  12.  
  13. FINSH_VAR_EXPORT(var, finsh_type_int, just a var for test)

编译后运行,可以看到finsh中增加了两个命令,一个变量var。

函数方式

  1. #include <finsh.h>
  2. void finsh_syscall_append(const char* name, syscall_func func)

  1. 参数 描述

  1. name 函数在finsh中访问的名称,即命令名;
  2.  
  3. func 函数地址,一般为函数名;

这个函数可以输出一个函数到finsh中,使之可以在finsh命令行中使用。

  1. #include <finsh.h>
  2. void finsh_sysvar_append(const char* name, u_char type, void* addr)

  1. 参数 描述

  1. name 变量在finsh中访问的名称,即命令名;
  2.  
  3. type 变量的类型;
  4.  
  5. addr 变量地址;

这个函数用于输出一个变量到finsh中。