xref: /nrf52832-nimble/rt-thread/components/finsh/finsh_api.h (revision 104654410c56c573564690304ae786df310c91fc)
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