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