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