提交 b9241041 编写于 作者: B bernard

Add FINSH_USING_MSH_ONLY option

上级 9993c9e6
...@@ -2,13 +2,43 @@ Import('rtconfig') ...@@ -2,13 +2,43 @@ Import('rtconfig')
from building import * from building import *
cwd = GetCurrentDir() cwd = GetCurrentDir()
src = Glob('*.c') src = Split('''
shell.c
symbol.c
cmd.c
''')
fsh_src = Split('''
finsh_compiler.c
finsh_error.c
finsh_heap.c
finsh_init.c
finsh_node.c
finsh_ops.c
finsh_parser.c
finsh_var.c
finsh_vm.c
finsh_token.c
''')
msh_src = Split('''
msh_cmd.c
msh.c
''')
CPPPATH = [cwd] CPPPATH = [cwd]
if rtconfig.CROSS_TOOL == 'keil': if rtconfig.CROSS_TOOL == 'keil':
LINKFLAGS = ' --keep __fsym_* --keep __vsym_* ' LINKFLAGS = ' --keep __fsym_*'
if not GetDepend('FINSH_USING_MSH_ONLY'):
LINKFLAGS = LINKFLAGS + ' --keep __vsym_* '
else: else:
LINKFLAGS = '' LINKFLAGS = ''
src = src + msh_src
if not GetDepend('FINSH_USING_MSH_ONLY'):
src = src + fsh_src
group = DefineGroup('finsh', src, depend = ['RT_USING_FINSH'], CPPPATH = CPPPATH, LINKFLAGS = LINKFLAGS) group = DefineGroup('finsh', src, depend = ['RT_USING_FINSH'], CPPPATH = CPPPATH, LINKFLAGS = LINKFLAGS)
Return('group') Return('group')
...@@ -612,9 +612,11 @@ FINSH_FUNCTION_EXPORT(list_mod_detail, list module objects in system) ...@@ -612,9 +612,11 @@ FINSH_FUNCTION_EXPORT(list_mod_detail, list module objects in system)
long list(void) long list(void)
{ {
#ifndef FINSH_USING_MSH_ONLY
struct finsh_syscall_item *syscall_item; struct finsh_syscall_item *syscall_item;
struct finsh_sysvar_item *sysvar_item; struct finsh_sysvar_item *sysvar_item;
#endif
rt_kprintf("--Function List:\n"); rt_kprintf("--Function List:\n");
{ {
struct finsh_syscall *index; struct finsh_syscall *index;
...@@ -633,6 +635,7 @@ long list(void) ...@@ -633,6 +635,7 @@ long list(void)
} }
} }
#ifndef FINSH_USING_MSH_ONLY
/* list syscall list */ /* list syscall list */
syscall_item = global_syscall_list; syscall_item = global_syscall_list;
while (syscall_item != NULL) while (syscall_item != NULL)
...@@ -662,11 +665,13 @@ long list(void) ...@@ -662,11 +665,13 @@ long list(void)
rt_kprintf("[l] %s\n", sysvar_item->sysvar.name); rt_kprintf("[l] %s\n", sysvar_item->sysvar.name);
sysvar_item = sysvar_item->next; sysvar_item = sysvar_item->next;
} }
#endif
return 0; return 0;
} }
FINSH_FUNCTION_EXPORT(list, list all symbol in system) FINSH_FUNCTION_EXPORT(list, list all symbol in system)
#ifndef FINSH_USING_MSH_ONLY
static int str_is_prefix(const char *prefix, const char *str) static int str_is_prefix(const char *prefix, const char *str)
{ {
while ((*prefix) && (*prefix == *str)) while ((*prefix) && (*prefix == *str))
...@@ -865,8 +870,9 @@ void list_prefix(char *prefix) ...@@ -865,8 +870,9 @@ void list_prefix(char *prefix)
rt_strncpy(prefix, name_ptr, min_length); rt_strncpy(prefix, name_ptr, min_length);
} }
} }
#endif
#ifdef FINSH_USING_SYMTAB #if defined(FINSH_USING_SYMTAB) && !defined(FINSH_USING_MSH_ONLY)
static int dummy = 0; static int dummy = 0;
FINSH_VAR_EXPORT(dummy, finsh_type_int, dummy variable for finsh) FINSH_VAR_EXPORT(dummy, finsh_type_int, dummy variable for finsh)
#endif #endif
...@@ -35,6 +35,12 @@ ...@@ -35,6 +35,12 @@
typedef int (*cmd_function_t)(int argc, char** argv); typedef int (*cmd_function_t)(int argc, char** argv);
#ifdef FINSH_USING_MSH #ifdef FINSH_USING_MSH
#ifdef FINSH_USING_MSH_ONLY
rt_bool_t msh_is_used(void)
{
return RT_TRUE;
}
#else
#ifdef FINSH_USING_MSH_DEFAULT #ifdef FINSH_USING_MSH_DEFAULT
static rt_bool_t __msh_state = RT_TRUE; static rt_bool_t __msh_state = RT_TRUE;
#else #else
...@@ -61,6 +67,7 @@ static int msh_enter(void) ...@@ -61,6 +67,7 @@ static int msh_enter(void)
return 0; return 0;
} }
FINSH_FUNCTION_EXPORT_ALIAS(msh_enter, msh, use module shell); FINSH_FUNCTION_EXPORT_ALIAS(msh_enter, msh, use module shell);
#endif
int msh_help(int argc, char** argv) int msh_help(int argc, char** argv)
{ {
......
...@@ -183,7 +183,6 @@ rt_uint32_t finsh_get_echo() ...@@ -183,7 +183,6 @@ rt_uint32_t finsh_get_echo()
static void shell_auto_complete(char* prefix) static void shell_auto_complete(char* prefix)
{ {
extern void list_prefix(char* prefix);
rt_kprintf("\n"); rt_kprintf("\n");
#ifdef FINSH_USING_MSH #ifdef FINSH_USING_MSH
...@@ -194,12 +193,16 @@ static void shell_auto_complete(char* prefix) ...@@ -194,12 +193,16 @@ static void shell_auto_complete(char* prefix)
else else
#endif #endif
{ {
#ifndef FINSH_USING_MSH_ONLY
extern void list_prefix(char* prefix);
list_prefix(prefix); list_prefix(prefix);
#endif
} }
rt_kprintf("%s%s", FINSH_PROMPT, prefix); rt_kprintf("%s%s", FINSH_PROMPT, prefix);
} }
#ifndef FINSH_USING_MSH_ONLY
void finsh_run_line(struct finsh_parser* parser, const char *line) void finsh_run_line(struct finsh_parser* parser, const char *line)
{ {
const char* err_str; const char* err_str;
...@@ -242,6 +245,7 @@ void finsh_run_line(struct finsh_parser* parser, const char *line) ...@@ -242,6 +245,7 @@ void finsh_run_line(struct finsh_parser* parser, const char *line)
finsh_flush(parser); finsh_flush(parser);
} }
#endif
#ifdef FINSH_USING_HISTORY #ifdef FINSH_USING_HISTORY
static rt_bool_t shell_handle_history(struct finsh_shell* shell) static rt_bool_t shell_handle_history(struct finsh_shell* shell)
...@@ -304,7 +308,9 @@ void finsh_thread_entry(void* parameter) ...@@ -304,7 +308,9 @@ void finsh_thread_entry(void* parameter)
/* normal is echo mode */ /* normal is echo mode */
shell->echo_mode = 1; shell->echo_mode = 1;
#ifndef FINSH_USING_MSH_ONLY
finsh_init(&shell->parser); finsh_init(&shell->parser);
#endif
rt_kprintf(FINSH_PROMPT); rt_kprintf(FINSH_PROMPT);
/* set console device as shell device */ /* set console device as shell device */
...@@ -480,33 +486,31 @@ void finsh_thread_entry(void* parameter) ...@@ -480,33 +486,31 @@ void finsh_thread_entry(void* parameter)
/* handle end of line, break */ /* handle end of line, break */
if (ch == '\r' || ch == '\n') if (ch == '\r' || ch == '\n')
{ {
#ifdef FINSH_USING_MSH #ifdef FINSH_USING_HISTORY
if (msh_is_used() == RT_TRUE && shell->line_position != 0) shell_push_history(shell);
#endif
#ifdef FINSH_USING_MSH
if (msh_is_used() == RT_TRUE)
{ {
rt_kprintf("\n"); rt_kprintf("\n");
#ifdef FINSH_USING_HISTORY
shell_push_history(shell);
#endif
msh_exec(shell->line, shell->line_position); msh_exec(shell->line, shell->line_position);
} }
else else
#endif #endif
{ {
#ifndef FINSH_USING_MSH_ONLY
/* add ';' and run the command line */ /* add ';' and run the command line */
shell->line[shell->line_position] = ';'; shell->line[shell->line_position] = ';';
#ifdef FINSH_USING_HISTORY
shell_push_history(shell);
#endif
if (shell->line_position != 0) finsh_run_line(&shell->parser, shell->line); if (shell->line_position != 0) finsh_run_line(&shell->parser, shell->line);
else rt_kprintf("\n"); else rt_kprintf("\n");
#endif
} }
rt_kprintf(FINSH_PROMPT); rt_kprintf(FINSH_PROMPT);
memset(shell->line, 0, sizeof(shell->line)); memset(shell->line, 0, sizeof(shell->line));
shell->line_curpos = shell->line_position = 0; shell->line_curpos = shell->line_position = 0;
break; break;
} }
...@@ -605,7 +609,9 @@ int finsh_system_init(void) ...@@ -605,7 +609,9 @@ int finsh_system_init(void)
extern const int VSymTab$$Base; extern const int VSymTab$$Base;
extern const int VSymTab$$Limit; extern const int VSymTab$$Limit;
finsh_system_function_init(&FSymTab$$Base, &FSymTab$$Limit); finsh_system_function_init(&FSymTab$$Base, &FSymTab$$Limit);
#ifndef FINSH_USING_MSH_ONLY
finsh_system_var_init(&VSymTab$$Base, &VSymTab$$Limit); finsh_system_var_init(&VSymTab$$Base, &VSymTab$$Limit);
#endif
#elif defined (__ICCARM__) /* for IAR Compiler */ #elif defined (__ICCARM__) /* for IAR Compiler */
finsh_system_function_init(__section_begin("FSymTab"), finsh_system_function_init(__section_begin("FSymTab"),
__section_end("FSymTab")); __section_end("FSymTab"));
...@@ -638,15 +644,17 @@ int finsh_system_init(void) ...@@ -638,15 +644,17 @@ int finsh_system_init(void)
/* create or set shell structure */ /* create or set shell structure */
#ifdef RT_USING_HEAP #ifdef RT_USING_HEAP
shell = (struct finsh_shell*)rt_malloc(sizeof(struct finsh_shell)); shell = (struct finsh_shell*)rt_malloc(sizeof(struct finsh_shell));
#else
shell = &_shell;
#endif
if (shell == RT_NULL) if (shell == RT_NULL)
{ {
rt_kprintf("no memory for shell\n"); rt_kprintf("no memory for shell\n");
return -1; return -1;
} }
#else
shell = &_shell;
#endif
rt_kprintf("shell tcb size: %d\n", sizeof(struct finsh_shell));
memset(shell, 0, sizeof(struct finsh_shell)); memset(shell, 0, sizeof(struct finsh_shell));
rt_sem_init(&(shell->rx_sem), "shrx", 0, 0); rt_sem_init(&(shell->rx_sem), "shrx", 0, 0);
......
...@@ -77,7 +77,9 @@ struct finsh_shell ...@@ -77,7 +77,9 @@ struct finsh_shell
char cmd_history[FINSH_HISTORY_LINES][FINSH_CMD_SIZE]; char cmd_history[FINSH_HISTORY_LINES][FINSH_CMD_SIZE];
#endif #endif
#ifndef FINSH_USING_MSH_ONLY
struct finsh_parser parser; struct finsh_parser parser;
#endif
char line[FINSH_CMD_SIZE]; char line[FINSH_CMD_SIZE];
rt_uint8_t line_position; rt_uint8_t line_position;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册