Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

finsh_api.h 9.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2010-03-22 Bernard first version
  9. */
  10. #ifndef FINSH_API_H__
  11. #define FINSH_API_H__
  12. #include "finsh_config.h"
  13. #if defined(_MSC_VER)
  14. #pragma section("FSymTab$f",read)
  15. #pragma section("VSymTab",read)
  16. #endif
  17. typedef long (*syscall_func)(void);
  18. /* system call table */
  19. struct finsh_syscall
  20. {
  21. const char* name; /* the name of system call */
  22. #if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB)
  23. const char* desc; /* description of system call */
  24. #endif
  25. syscall_func func; /* the function address of system call */
  26. };
  27. extern struct finsh_syscall *_syscall_table_begin, *_syscall_table_end;
  28. /* find out system call, which should be implemented in user program */
  29. struct finsh_syscall* finsh_syscall_lookup(const char* name);
  30. #ifdef FINSH_USING_SYMTAB
  31. #ifdef __TI_COMPILER_VERSION__
  32. #define __TI_FINSH_EXPORT_FUNCTION(f) PRAGMA(DATA_SECTION(f,"FSymTab"))
  33. #define __TI_FINSH_EXPORT_VAR(v) PRAGMA(DATA_SECTION(v,"VSymTab"))
  34. #endif
  35. #ifdef FINSH_USING_DESCRIPTION
  36. #ifdef _MSC_VER
  37. #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \
  38. const char __fsym_##cmd##_name[] = #cmd; \
  39. const char __fsym_##cmd##_desc[] = #desc; \
  40. __declspec(allocate("FSymTab$f")) \
  41. const struct finsh_syscall __fsym_##cmd = \
  42. { \
  43. __fsym_##cmd##_name, \
  44. __fsym_##cmd##_desc, \
  45. (syscall_func)&name \
  46. };
  47. #pragma comment(linker, "/merge:FSymTab=mytext")
  48. #define FINSH_VAR_EXPORT(name, type, desc) \
  49. const char __vsym_##name##_name[] = #name; \
  50. const char __vsym_##name##_desc[] = #desc; \
  51. __declspec(allocate("VSymTab")) \
  52. const struct finsh_sysvar __vsym_##name = \
  53. { \
  54. __vsym_##name##_name, \
  55. __vsym_##name##_desc, \
  56. type, \
  57. (void*)&name \
  58. };
  59. #elif defined(__TI_COMPILER_VERSION__)
  60. #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \
  61. __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd); \
  62. const char __fsym_##cmd##_name[] = #cmd; \
  63. const char __fsym_##cmd##_desc[] = #desc; \
  64. const struct finsh_syscall __fsym_##cmd = \
  65. { \
  66. __fsym_##cmd##_name, \
  67. __fsym_##cmd##_desc, \
  68. (syscall_func)&name \
  69. };
  70. #define FINSH_VAR_EXPORT(name, type, desc) \
  71. __TI_FINSH_EXPORT_VAR(__vsym_##name); \
  72. const char __vsym_##name##_name[] = #name; \
  73. const char __vsym_##name##_desc[] = #desc; \
  74. const struct finsh_sysvar __vsym_##name = \
  75. { \
  76. __vsym_##name##_name, \
  77. __vsym_##name##_desc, \
  78. type, \
  79. (void*)&name \
  80. };
  81. #else
  82. #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \
  83. const char __fsym_##cmd##_name[] SECTION(".rodata.name") = #cmd; \
  84. const char __fsym_##cmd##_desc[] SECTION(".rodata.name") = #desc; \
  85. RT_USED const struct finsh_syscall __fsym_##cmd SECTION("FSymTab")= \
  86. { \
  87. __fsym_##cmd##_name, \
  88. __fsym_##cmd##_desc, \
  89. (syscall_func)&name \
  90. };
  91. #define FINSH_VAR_EXPORT(name, type, desc) \
  92. const char __vsym_##name##_name[] SECTION(".rodata.name") = #name; \
  93. const char __vsym_##name##_desc[] SECTION(".rodata.name") = #desc; \
  94. RT_USED const struct finsh_sysvar __vsym_##name SECTION("VSymTab")= \
  95. { \
  96. __vsym_##name##_name, \
  97. __vsym_##name##_desc, \
  98. type, \
  99. (void*)&name \
  100. };
  101. #endif
  102. #else
  103. #ifdef _MSC_VER
  104. #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \
  105. const char __fsym_##cmd##_name[] = #cmd; \
  106. __declspec(allocate("FSymTab$f")) \
  107. const struct finsh_syscall __fsym_##cmd = \
  108. { \
  109. __fsym_##cmd##_name, \
  110. (syscall_func)&name \
  111. };
  112. #pragma comment(linker, "/merge:FSymTab=mytext")
  113. #define FINSH_VAR_EXPORT(name, type, desc) \
  114. const char __vsym_##name##_name[] = #name; \
  115. __declspec(allocate("VSymTab")) const struct finsh_sysvar __vsym_##name = \
  116. { \
  117. __vsym_##name##_name, \
  118. type, \
  119. (void*)&name \
  120. };
  121. #elif defined(__TI_COMPILER_VERSION__)
  122. #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \
  123. __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd); \
  124. const char __fsym_##cmd##_name[] = #cmd; \
  125. const struct finsh_syscall __fsym_##cmd = \
  126. { \
  127. __fsym_##cmd##_name, \
  128. (syscall_func)&name \
  129. };
  130. #define FINSH_VAR_EXPORT(name, type, desc) \
  131. __TI_FINSH_EXPORT_VAR(__vsym_##name); \
  132. const char __vsym_##name##_name[] = #name; \
  133. const struct finsh_sysvar __vsym_##name = \
  134. { \
  135. __vsym_##name##_name, \
  136. type, \
  137. (void*)&name \
  138. };
  139. #else
  140. #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \
  141. const char __fsym_##cmd##_name[] = #cmd; \
  142. RT_USED const struct finsh_syscall __fsym_##cmd SECTION("FSymTab")= \
  143. { \
  144. __fsym_##cmd##_name, \
  145. (syscall_func)&name \
  146. };
  147. #define FINSH_VAR_EXPORT(name, type, desc) \
  148. const char __vsym_##name##_name[] = #name; \
  149. RT_USED const struct finsh_sysvar __vsym_##name SECTION("VSymTab")= \
  150. { \
  151. __vsym_##name##_name, \
  152. type, \
  153. (void*)&name \
  154. };
  155. #endif
  156. #endif /* end of FINSH_USING_DESCRIPTION */
  157. #endif /* end of FINSH_USING_SYMTAB */
  158. /**
  159. * @ingroup finsh
  160. *
  161. * This macro exports a system function to finsh shell.
  162. *
  163. * @param name the name of function.
  164. * @param desc the description of function, which will show in help.
  165. */
  166. #define FINSH_FUNCTION_EXPORT(name, desc) \
  167. FINSH_FUNCTION_EXPORT_CMD(name, name, desc)
  168. /**
  169. * @ingroup finsh
  170. *
  171. * This macro exports a system function with an alias name to finsh shell.
  172. *
  173. * @param name the name of function.
  174. * @param alias the alias name of function.
  175. * @param desc the description of function, which will show in help.
  176. */
  177. #define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \
  178. FINSH_FUNCTION_EXPORT_CMD(name, alias, desc)
  179. /**
  180. * @ingroup finsh
  181. *
  182. * This macro exports a command to module shell.
  183. *
  184. * @param command the name of command.
  185. * @param desc the description of command, which will show in help.
  186. */
  187. #ifdef FINSH_USING_MSH
  188. #define MSH_CMD_EXPORT(command, desc) \
  189. FINSH_FUNCTION_EXPORT_CMD(command, __cmd_##command, desc)
  190. #define MSH_CMD_EXPORT_ALIAS(command, alias, desc) \
  191. FINSH_FUNCTION_EXPORT_ALIAS(command, __cmd_##alias, desc)
  192. #else
  193. #define MSH_CMD_EXPORT(command, desc)
  194. #define MSH_CMD_EXPORT_ALIAS(command, alias, desc)
  195. #endif
  196. #endif