219 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			219 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2006-2018, RT-Thread Development Team
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * SPDX-License-Identifier: Apache-2.0
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Change Logs:
							 | 
						||
| 
								 | 
							
								 * Date           Author       Notes
							 | 
						||
| 
								 | 
							
								 * 2010-03-22     Bernard      first version
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#ifndef FINSH_API_H__
							 | 
						||
| 
								 | 
							
								#define FINSH_API_H__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(_MSC_VER)
							 | 
						||
| 
								 | 
							
								#pragma section("FSymTab$f",read)
							 | 
						||
| 
								 | 
							
								#pragma section("VSymTab",read)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef long (*syscall_func)(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* system call table */
							 | 
						||
| 
								 | 
							
								struct finsh_syscall
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    const char*     name;       /* the name of system call */
							 | 
						||
| 
								 | 
							
								#if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB)
							 | 
						||
| 
								 | 
							
								    const char*     desc;       /* description of system call */
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    syscall_func func;      /* the function address of system call */
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								extern struct finsh_syscall *_syscall_table_begin, *_syscall_table_end;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* find out system call, which should be implemented in user program */
							 | 
						||
| 
								 | 
							
								struct finsh_syscall* finsh_syscall_lookup(const char* name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef FINSH_USING_SYMTAB
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __TI_COMPILER_VERSION__
							 | 
						||
| 
								 | 
							
								#define __TI_FINSH_EXPORT_FUNCTION(f)  PRAGMA(DATA_SECTION(f,"FSymTab"))
							 | 
						||
| 
								 | 
							
								#define __TI_FINSH_EXPORT_VAR(v)       PRAGMA(DATA_SECTION(v,"VSymTab"))
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef FINSH_USING_DESCRIPTION
							 | 
						||
| 
								 | 
							
								        #ifdef _MSC_VER
							 | 
						||
| 
								 | 
							
								            #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc)      \
							 | 
						||
| 
								 | 
							
								                const char __fsym_##cmd##_name[] = #cmd;            \
							 | 
						||
| 
								 | 
							
								                const char __fsym_##cmd##_desc[] = #desc;           \
							 | 
						||
| 
								 | 
							
								                __declspec(allocate("FSymTab$f"))                   \
							 | 
						||
| 
								 | 
							
								                const struct finsh_syscall __fsym_##cmd =           \
							 | 
						||
| 
								 | 
							
								                {                           \
							 | 
						||
| 
								 | 
							
								                    __fsym_##cmd##_name,    \
							 | 
						||
| 
								 | 
							
								                    __fsym_##cmd##_desc,    \
							 | 
						||
| 
								 | 
							
								                    (syscall_func)&name     \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								            #pragma comment(linker, "/merge:FSymTab=mytext")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            #define FINSH_VAR_EXPORT(name, type, desc)              \
							 | 
						||
| 
								 | 
							
								                const char __vsym_##name##_name[] = #name;          \
							 | 
						||
| 
								 | 
							
								                const char __vsym_##name##_desc[] = #desc;          \
							 | 
						||
| 
								 | 
							
								                __declspec(allocate("VSymTab"))                     \
							 | 
						||
| 
								 | 
							
								                const struct finsh_sysvar __vsym_##name =           \
							 | 
						||
| 
								 | 
							
								                {                           \
							 | 
						||
| 
								 | 
							
								                    __vsym_##name##_name,   \
							 | 
						||
| 
								 | 
							
								                    __vsym_##name##_desc,   \
							 | 
						||
| 
								 | 
							
								                    type,                   \
							 | 
						||
| 
								 | 
							
								                    (void*)&name            \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #elif defined(__TI_COMPILER_VERSION__)
							 | 
						||
| 
								 | 
							
								            #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc)      \
							 | 
						||
| 
								 | 
							
								                __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd);           \
							 | 
						||
| 
								 | 
							
								                const char __fsym_##cmd##_name[] = #cmd;            \
							 | 
						||
| 
								 | 
							
								                const char __fsym_##cmd##_desc[] = #desc;           \
							 | 
						||
| 
								 | 
							
								                const struct finsh_syscall __fsym_##cmd =           \
							 | 
						||
| 
								 | 
							
								                {                           \
							 | 
						||
| 
								 | 
							
								                    __fsym_##cmd##_name,    \
							 | 
						||
| 
								 | 
							
								                    __fsym_##cmd##_desc,    \
							 | 
						||
| 
								 | 
							
								                    (syscall_func)&name     \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            #define FINSH_VAR_EXPORT(name, type, desc)              \
							 | 
						||
| 
								 | 
							
								                __TI_FINSH_EXPORT_VAR(__vsym_##name);               \
							 | 
						||
| 
								 | 
							
								                const char __vsym_##name##_name[] = #name;          \
							 | 
						||
| 
								 | 
							
								                const char __vsym_##name##_desc[] = #desc;          \
							 | 
						||
| 
								 | 
							
								                const struct finsh_sysvar __vsym_##name =           \
							 | 
						||
| 
								 | 
							
								                {                           \
							 | 
						||
| 
								 | 
							
								                    __vsym_##name##_name,   \
							 | 
						||
| 
								 | 
							
								                    __vsym_##name##_desc,   \
							 | 
						||
| 
								 | 
							
								                    type,                   \
							 | 
						||
| 
								 | 
							
								                    (void*)&name            \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #else
							 | 
						||
| 
								 | 
							
								            #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc)                      \
							 | 
						||
| 
								 | 
							
								                const char __fsym_##cmd##_name[] SECTION(".rodata.name") = #cmd;    \
							 | 
						||
| 
								 | 
							
								                const char __fsym_##cmd##_desc[] SECTION(".rodata.name") = #desc;   \
							 | 
						||
| 
								 | 
							
								                RT_USED const struct finsh_syscall __fsym_##cmd SECTION("FSymTab")= \
							 | 
						||
| 
								 | 
							
								                {                           \
							 | 
						||
| 
								 | 
							
								                    __fsym_##cmd##_name,    \
							 | 
						||
| 
								 | 
							
								                    __fsym_##cmd##_desc,    \
							 | 
						||
| 
								 | 
							
								                    (syscall_func)&name     \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            #define FINSH_VAR_EXPORT(name, type, desc)                              \
							 | 
						||
| 
								 | 
							
								                const char __vsym_##name##_name[] SECTION(".rodata.name") = #name;  \
							 | 
						||
| 
								 | 
							
								                const char __vsym_##name##_desc[] SECTION(".rodata.name") = #desc;  \
							 | 
						||
| 
								 | 
							
								                RT_USED const struct finsh_sysvar __vsym_##name SECTION("VSymTab")= \
							 | 
						||
| 
								 | 
							
								                {                           \
							 | 
						||
| 
								 | 
							
								                    __vsym_##name##_name,   \
							 | 
						||
| 
								 | 
							
								                    __vsym_##name##_desc,   \
							 | 
						||
| 
								 | 
							
								                    type,                   \
							 | 
						||
| 
								 | 
							
								                    (void*)&name            \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #endif
							 | 
						||
| 
								 | 
							
								    #else
							 | 
						||
| 
								 | 
							
								        #ifdef _MSC_VER
							 | 
						||
| 
								 | 
							
								            #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc)      \
							 | 
						||
| 
								 | 
							
								                const char __fsym_##cmd##_name[] = #cmd;            \
							 | 
						||
| 
								 | 
							
								                __declspec(allocate("FSymTab$f"))                   \
							 | 
						||
| 
								 | 
							
								                const struct finsh_syscall __fsym_##cmd =           \
							 | 
						||
| 
								 | 
							
								                {                           \
							 | 
						||
| 
								 | 
							
								                    __fsym_##cmd##_name,    \
							 | 
						||
| 
								 | 
							
								                    (syscall_func)&name     \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								            #pragma comment(linker, "/merge:FSymTab=mytext")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            #define FINSH_VAR_EXPORT(name, type, desc)              \
							 | 
						||
| 
								 | 
							
								                const char __vsym_##name##_name[] = #name;          \
							 | 
						||
| 
								 | 
							
								                __declspec(allocate("VSymTab")) const struct finsh_sysvar __vsym_##name = \
							 | 
						||
| 
								 | 
							
								                {                                                                         \
							 | 
						||
| 
								 | 
							
								                    __vsym_##name##_name,                                                 \
							 | 
						||
| 
								 | 
							
								                    type,                                                                 \
							 | 
						||
| 
								 | 
							
								                    (void*)&name                                                          \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #elif defined(__TI_COMPILER_VERSION__)
							 | 
						||
| 
								 | 
							
								            #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc)      \
							 | 
						||
| 
								 | 
							
								                __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd);           \
							 | 
						||
| 
								 | 
							
								                const char __fsym_##cmd##_name[] = #cmd;            \
							 | 
						||
| 
								 | 
							
								                const struct finsh_syscall __fsym_##cmd =           \
							 | 
						||
| 
								 | 
							
								                {                           \
							 | 
						||
| 
								 | 
							
								                    __fsym_##cmd##_name,    \
							 | 
						||
| 
								 | 
							
								                    (syscall_func)&name     \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            #define FINSH_VAR_EXPORT(name, type, desc)              \
							 | 
						||
| 
								 | 
							
								                __TI_FINSH_EXPORT_VAR(__vsym_##name);               \
							 | 
						||
| 
								 | 
							
								                const char __vsym_##name##_name[] = #name;          \
							 | 
						||
| 
								 | 
							
								                const struct finsh_sysvar __vsym_##name =           \
							 | 
						||
| 
								 | 
							
								                {                                                   \
							 | 
						||
| 
								 | 
							
								                    __vsym_##name##_name,                           \
							 | 
						||
| 
								 | 
							
								                    type,                                           \
							 | 
						||
| 
								 | 
							
								                    (void*)&name                                    \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #else
							 | 
						||
| 
								 | 
							
								            #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc)                      \
							 | 
						||
| 
								 | 
							
								                const char __fsym_##cmd##_name[] = #cmd;                            \
							 | 
						||
| 
								 | 
							
								                RT_USED const struct finsh_syscall __fsym_##cmd SECTION("FSymTab")= \
							 | 
						||
| 
								 | 
							
								                {                                                                   \
							 | 
						||
| 
								 | 
							
								                    __fsym_##cmd##_name,                                            \
							 | 
						||
| 
								 | 
							
								                    (syscall_func)&name                                             \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            #define FINSH_VAR_EXPORT(name, type, desc)                              \
							 | 
						||
| 
								 | 
							
								                const char __vsym_##name##_name[] = #name;                          \
							 | 
						||
| 
								 | 
							
								                RT_USED const struct finsh_sysvar __vsym_##name SECTION("VSymTab")= \
							 | 
						||
| 
								 | 
							
								                {                                                                   \
							 | 
						||
| 
								 | 
							
								                    __vsym_##name##_name,                                           \
							 | 
						||
| 
								 | 
							
								                    type,                                                           \
							 | 
						||
| 
								 | 
							
								                    (void*)&name                                                    \
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #endif
							 | 
						||
| 
								 | 
							
								    #endif /* end of FINSH_USING_DESCRIPTION */
							 | 
						||
| 
								 | 
							
								#endif /* end of FINSH_USING_SYMTAB */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @ingroup finsh
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This macro exports a system function to finsh shell.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param name the name of function.
							 | 
						||
| 
								 | 
							
								 * @param desc the description of function, which will show in help.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define FINSH_FUNCTION_EXPORT(name, desc)   \
							 | 
						||
| 
								 | 
							
								    FINSH_FUNCTION_EXPORT_CMD(name, name, desc)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @ingroup finsh
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This macro exports a system function with an alias name to finsh shell.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param name the name of function.
							 | 
						||
| 
								 | 
							
								 * @param alias the alias name of function.
							 | 
						||
| 
								 | 
							
								 * @param desc the description of function, which will show in help.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc)  \
							 | 
						||
| 
								 | 
							
								        FINSH_FUNCTION_EXPORT_CMD(name, alias, desc)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @ingroup finsh
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This macro exports a command to module shell.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param command the name of command.
							 | 
						||
| 
								 | 
							
								 * @param desc the description of command, which will show in help.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#ifdef FINSH_USING_MSH
							 | 
						||
| 
								 | 
							
								#define MSH_CMD_EXPORT(command, desc)   \
							 | 
						||
| 
								 | 
							
								    FINSH_FUNCTION_EXPORT_CMD(command, __cmd_##command, desc)
							 | 
						||
| 
								 | 
							
								#define MSH_CMD_EXPORT_ALIAS(command, alias, desc)  \
							 | 
						||
| 
								 | 
							
								    FINSH_FUNCTION_EXPORT_ALIAS(command, __cmd_##alias, desc)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define MSH_CMD_EXPORT(command, desc)
							 | 
						||
| 
								 | 
							
								#define MSH_CMD_EXPORT_ALIAS(command, alias, desc)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |