Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lfmiao0
rt-thread
提交
f9a7ba05
R
rt-thread
项目概览
lfmiao0
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f9a7ba05
编写于
3月 01, 2018
作者:
B
Bernard Xiong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[finsh] convert tab to space and split export API to finsh_api.h
上级
15fa3084
变更
20
展开全部
隐藏空白更改
内联
并排
Showing
20 changed file
with
2567 addition
and
2530 deletion
+2567
-2530
components/finsh/cmd.c
components/finsh/cmd.c
+6
-6
components/finsh/finsh.h
components/finsh/finsh.h
+93
-287
components/finsh/finsh_api.h
components/finsh/finsh_api.h
+231
-0
components/finsh/finsh_error.c
components/finsh/finsh_error.c
+20
-20
components/finsh/finsh_heap.c
components/finsh/finsh_heap.c
+70
-70
components/finsh/finsh_init.c
components/finsh/finsh_init.c
+18
-18
components/finsh/finsh_node.c
components/finsh/finsh_node.c
+118
-118
components/finsh/finsh_node.h
components/finsh/finsh_node.h
+36
-36
components/finsh/finsh_ops.c
components/finsh/finsh_ops.c
+289
-289
components/finsh/finsh_parser.c
components/finsh/finsh_parser.c
+697
-697
components/finsh/finsh_token.c
components/finsh/finsh_token.c
+479
-479
components/finsh/finsh_token.h
components/finsh/finsh_token.h
+31
-31
components/finsh/finsh_var.c
components/finsh/finsh_var.c
+92
-92
components/finsh/finsh_var.h
components/finsh/finsh_var.h
+10
-10
components/finsh/finsh_vm.c
components/finsh/finsh_vm.c
+324
-324
components/finsh/finsh_vm.h
components/finsh/finsh_vm.h
+8
-8
components/finsh/msh_cmd.c
components/finsh/msh_cmd.c
+27
-27
components/finsh/shell.c
components/finsh/shell.c
+1
-1
components/finsh/symbol.c
components/finsh/symbol.c
+16
-16
include/rtthread.h
include/rtthread.h
+1
-1
未找到文件。
components/finsh/cmd.c
浏览文件 @
f9a7ba05
...
...
@@ -106,11 +106,11 @@ static long _list_thread(struct rt_list_node *list)
rt_kprintf
(
" --- ------- ---------- ---------- ------ ---------- ---
\n
"
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
rt_uint8_t
stat
;
rt_uint8_t
stat
;
thread
=
rt_list_entry
(
node
,
struct
rt_thread
,
list
);
rt_kprintf
(
"%-*.*s %3d "
,
maxlen
,
RT_NAME_MAX
,
thread
->
name
,
thread
->
current_priority
);
stat
=
(
thread
->
stat
&
RT_THREAD_STAT_MASK
);
stat
=
(
thread
->
stat
&
RT_THREAD_STAT_MASK
);
if
(
stat
==
RT_THREAD_READY
)
rt_kprintf
(
" ready "
);
else
if
(
stat
==
RT_THREAD_SUSPEND
)
rt_kprintf
(
" suspend"
);
else
if
(
stat
==
RT_THREAD_INIT
)
rt_kprintf
(
" init "
);
...
...
@@ -607,7 +607,7 @@ int list_module(void)
{
module
=
(
struct
rt_module
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
rt_kprintf
(
"%-*.*s %-04d 0x%08x
\n
"
,
maxlen
,
RT_NAME_MAX
,
maxlen
,
RT_NAME_MAX
,
module
->
parent
.
name
,
module
->
nref
,
module
->
module_space
);
}
...
...
@@ -634,14 +634,14 @@ int list_mod_detail(const char *name)
/* list main thread in module */
if
(
module
->
module_thread
!=
RT_NULL
)
{
rt_uint8_t
stat
;
rt_uint8_t
stat
;
rt_kprintf
(
"main thread pri status sp stack size max used left tick error
\n
"
);
rt_kprintf
(
"------------- ---- ------- ---------- ---------- ---------- ---------- ---
\n
"
);
thread
=
module
->
module_thread
;
rt_kprintf
(
"%-8.*s 0x%02x"
,
RT_NAME_MAX
,
thread
->
name
,
thread
->
current_priority
);
stat
=
(
thread
->
stat
&
RT_THREAD_STAT_MASK
);
stat
=
(
thread
->
stat
&
RT_THREAD_STAT_MASK
);
if
(
stat
==
RT_THREAD_READY
)
rt_kprintf
(
" ready "
);
else
if
(
stat
==
RT_THREAD_SUSPEND
)
rt_kprintf
(
" suspend"
);
else
if
(
stat
==
RT_THREAD_INIT
)
rt_kprintf
(
" init "
);
...
...
components/finsh/finsh.h
浏览文件 @
f9a7ba05
/*
* File : finsh.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team
* COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Change Logs:
* Date Author Notes
...
...
@@ -15,11 +24,7 @@
#define __FINSH_H__
#include <rtthread.h>
#if defined(_MSC_VER)
#pragma section("FSymTab$f",read)
#pragma section("VSymTab",read)
#endif
#include "finsh_api.h"
/* -- the beginning of option -- */
#define FINSH_NAME_MAX 16
/* max length of identifier */
...
...
@@ -63,63 +68,47 @@
#include <stdint.h>
#include <string.h>
#define FINSH_VERSION_MAJOR
1
#define FINSH_VERSION_MINOR
0
#define FINSH_VERSION_MAJOR
1
#define FINSH_VERSION_MINOR
0
/**
* @addtogroup finsh
*/
/*@{*/
#define FINSH_ERROR_OK 0
/**< No error
*/
#define FINSH_ERROR_INVALID_TOKEN
1
/**< Invalid token
*/
#define FINSH_ERROR_EXPECT_TYPE
2
/**< Expect a type
*/
#define FINSH_ERROR_UNKNOWN_TYPE
3
/**< Unknown type
*/
#define FINSH_ERROR_VARIABLE_EXIST
4
/**< Variable exist
*/
#define FINSH_ERROR_EXPECT_OPERATOR
5
/**< Expect a operator
*/
#define FINSH_ERROR_MEMORY_FULL
6
/**< Memory full
*/
#define FINSH_ERROR_UNKNOWN_OP
7
/**< Unknown operator
*/
#define FINSH_ERROR_UNKNOWN_NODE
8
/**< Unknown node
*/
#define FINSH_ERROR_EXPECT_CHAR
9
/**< Expect a character */
#define FINSH_ERROR_UNEXPECT_END
10
/**< Unexpect end
*/
#define FINSH_ERROR_UNKNOWN_TOKEN
11
/**< Unknown token
*/
#define FINSH_ERROR_NO_FLOAT
12
/**< Float not supported */
#define FINSH_ERROR_UNKNOWN_SYMBOL
13
/**< Unknown symbol
*/
#define FINSH_ERROR_NULL_NODE
14
/**< Null node
*/
#define FINSH_ERROR_OK 0
/**< No error
*/
#define FINSH_ERROR_INVALID_TOKEN
1
/**< Invalid token
*/
#define FINSH_ERROR_EXPECT_TYPE
2
/**< Expect a type
*/
#define FINSH_ERROR_UNKNOWN_TYPE
3
/**< Unknown type
*/
#define FINSH_ERROR_VARIABLE_EXIST
4
/**< Variable exist
*/
#define FINSH_ERROR_EXPECT_OPERATOR
5
/**< Expect a operator
*/
#define FINSH_ERROR_MEMORY_FULL
6
/**< Memory full
*/
#define FINSH_ERROR_UNKNOWN_OP
7
/**< Unknown operator
*/
#define FINSH_ERROR_UNKNOWN_NODE
8
/**< Unknown node
*/
#define FINSH_ERROR_EXPECT_CHAR
9
/**< Expect a character */
#define FINSH_ERROR_UNEXPECT_END
10
/**< Unexpect end
*/
#define FINSH_ERROR_UNKNOWN_TOKEN
11
/**< Unknown token
*/
#define FINSH_ERROR_NO_FLOAT
12
/**< Float not supported */
#define FINSH_ERROR_UNKNOWN_SYMBOL
13
/**< Unknown symbol
*/
#define FINSH_ERROR_NULL_NODE
14
/**< Null node
*/
/*@}*/
typedef
long
(
*
syscall_func
)();
/* 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 */
};
/* system call item */
struct
finsh_syscall_item
{
struct
finsh_syscall_item
*
next
;
/* next item */
struct
finsh_syscall
syscall
;
/* syscall */
struct
finsh_syscall_item
*
next
;
/* next item */
struct
finsh_syscall
syscall
;
/* syscall */
};
extern
struct
finsh_syscall
*
_syscall_table_begin
,
*
_syscall_table_end
;
extern
struct
finsh_syscall_item
*
global_syscall_list
;
/* find out system call, which should be implemented in user program */
struct
finsh_syscall
*
finsh_syscall_lookup
(
const
char
*
name
);
/* system variable table */
struct
finsh_sysvar
{
const
char
*
name
;
/* the name of variable */
const
char
*
name
;
/* the name of variable */
#if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB)
const
char
*
desc
;
/* description of system variable */
const
char
*
desc
;
/* description of system variable */
#endif
uint8_t
type
;
/* the type of variable */
void
*
var
;
/* the address of variable */
uint8_t
type
;
/* the type of variable */
void
*
var
;
/* the address of variable */
};
#if defined(_MSC_VER) || (defined(__GNUC__) && defined(__x86_64__))
...
...
@@ -135,8 +124,8 @@ struct finsh_sysvar* finsh_sysvar_next(struct finsh_sysvar* call);
/* system variable item */
struct
finsh_sysvar_item
{
struct
finsh_sysvar_item
*
next
;
/* next item */
struct
finsh_sysvar
sysvar
;
/* system variable */
struct
finsh_sysvar_item
*
next
;
/* next item */
struct
finsh_sysvar
sysvar
;
/* system variable */
};
extern
struct
finsh_sysvar
*
_sysvar_table_begin
,
*
_sysvar_table_end
;
extern
struct
finsh_sysvar_item
*
global_sysvar_list
;
...
...
@@ -144,243 +133,60 @@ extern struct finsh_sysvar_item* global_sysvar_list;
/* find out system variable, which should be implemented in user program */
struct
finsh_sysvar
*
finsh_sysvar_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; \
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; \
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; \
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; \
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
struct
finsh_token
{
char
eof
;
char
replay
;
char
eof
;
char
replay
;
int
position
;
uint8_t
current_token
;
int
position
;
uint8_t
current_token
;
union
{
char
char_value
;
int
int_value
;
long
long_value
;
}
value
;
uint8_t
string
[
FINSH_STRING_MAX
];
union
{
char
char_value
;
int
int_value
;
long
long_value
;
}
value
;
uint8_t
string
[
FINSH_STRING_MAX
];
uint8_t
*
line
;
uint8_t
*
line
;
};
#define FINSH_IDTYPE_VAR
0x01
#define FINSH_IDTYPE_SYSVAR
0x02
#define FINSH_IDTYPE_SYSCALL
0x04
#define FINSH_IDTYPE_ADDRESS
0x08
#define FINSH_IDTYPE_VAR
0x01
#define FINSH_IDTYPE_SYSVAR
0x02
#define FINSH_IDTYPE_SYSCALL
0x04
#define FINSH_IDTYPE_ADDRESS
0x08
struct
finsh_node
{
uint8_t
node_type
;
/* node node_type */
uint8_t
data_type
;
/* node data node_type */
uint8_t
idtype
;
/* id node information */
union
{
/* value node */
char
char_value
;
short
short_value
;
int
int_value
;
long
long_value
;
void
*
ptr
;
}
value
;
union
{
/* point to variable identifier or function identifier */
struct
finsh_var
*
var
;
struct
finsh_sysvar
*
sysvar
;
struct
finsh_syscall
*
syscall
;
}
id
;
/* sibling and child node */
struct
finsh_node
*
sibling
,
*
child
;
uint8_t
node_type
;
/* node node_type */
uint8_t
data_type
;
/* node data node_type */
uint8_t
idtype
;
/* id node information */
union
{
/* value node */
char
char_value
;
short
short_value
;
int
int_value
;
long
long_value
;
void
*
ptr
;
}
value
;
union
{
/* point to variable identifier or function identifier */
struct
finsh_var
*
var
;
struct
finsh_sysvar
*
sysvar
;
struct
finsh_syscall
*
syscall
;
}
id
;
/* sibling and child node */
struct
finsh_node
*
sibling
,
*
child
;
};
struct
finsh_parser
{
uint8_t
*
parser_string
;
uint8_t
*
parser_string
;
struct
finsh_token
token
;
struct
finsh_node
*
root
;
struct
finsh_node
*
root
;
};
/**
...
...
@@ -389,21 +195,21 @@ struct finsh_parser
* The basic data type in finsh shell
*/
enum
finsh_type
{
finsh_type_unknown
=
0
,
/**< unknown data type */
finsh_type_void
,
/**< void
*/
finsh_type_voidp
,
/**< void pointer
*/
finsh_type_char
,
/**< char
*/
finsh_type_uchar
,
/**< unsigned char */
finsh_type_charp
,
/**< char pointer
*/
finsh_type_short
,
/**< short
*/
finsh_type_ushort
,
/**< unsigned short */
finsh_type_shortp
,
/**< short pointer */
finsh_type_int
,
/**< int
*/
finsh_type_uint
,
/**< unsigned int
*/
finsh_type_intp
,
/**< int pointer
*/
finsh_type_long
,
/**< long
*/
finsh_type_ulong
,
/**< unsigned long
*/
finsh_type_longp
/**< long pointer
*/
finsh_type_unknown
=
0
,
/**< unknown data type */
finsh_type_void
,
/**< void
*/
finsh_type_voidp
,
/**< void pointer
*/
finsh_type_char
,
/**< char
*/
finsh_type_uchar
,
/**< unsigned char */
finsh_type_charp
,
/**< char pointer
*/
finsh_type_short
,
/**< short
*/
finsh_type_ushort
,
/**< unsigned short */
finsh_type_shortp
,
/**< short pointer */
finsh_type_int
,
/**< int
*/
finsh_type_uint
,
/**< unsigned int
*/
finsh_type_intp
,
/**< int pointer
*/
finsh_type_long
,
/**< long
*/
finsh_type_ulong
,
/**< unsigned long
*/
finsh_type_longp
/**< long pointer
*/
};
/* init finsh environment */
...
...
components/finsh/finsh_api.h
0 → 100644
浏览文件 @
f9a7ba05
/*
* File : finsh_api.h
* COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 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; \
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; \
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; \
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; \
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
components/finsh/finsh_error.c
浏览文件 @
f9a7ba05
...
...
@@ -33,42 +33,42 @@ uint8_t global_errno;
static
const
char
*
finsh_error_string_table
[]
=
{
"No error"
,
"Invalid token"
,
"Expect a type"
,
"Unknown type"
,
"Variable exist"
,
"Expect a operater"
,
"Memory full"
,
"Unknown operator"
,
"Unknown node"
,
"Expect a character"
,
"Unexpect end"
,
"Unknown token"
,
"Float not supported"
,
"Unknown symbol"
,
"Null node"
"Invalid token"
,
"Expect a type"
,
"Unknown type"
,
"Variable exist"
,
"Expect a operater"
,
"Memory full"
,
"Unknown operator"
,
"Unknown node"
,
"Expect a character"
,
"Unexpect end"
,
"Unknown token"
,
"Float not supported"
,
"Unknown symbol"
,
"Null node"
};
int
finsh_error_init
()
{
global_errno
=
FINSH_ERROR_OK
;
global_errno
=
FINSH_ERROR_OK
;
return
0
;
return
0
;
}
int
finsh_error_set
(
uint8_t
type
)
{
global_errno
=
type
;
global_errno
=
type
;
return
0
;
return
0
;
}
uint8_t
finsh_errno
()
{
return
global_errno
;
return
global_errno
;
}
const
char
*
finsh_error_string
(
uint8_t
type
)
{
return
finsh_error_string_table
[
type
];
return
finsh_error_string_table
[
type
];
}
components/finsh/finsh_heap.c
浏览文件 @
f9a7ba05
...
...
@@ -34,13 +34,13 @@ ALIGN(RT_ALIGN_SIZE)
uint8_t
finsh_heap
[
FINSH_HEAP_MAX
];
struct
finsh_block_header
{
uint32_t
length
;
struct
finsh_block_header
*
next
;
uint32_t
length
;
struct
finsh_block_header
*
next
;
};
#define BLOCK_HEADER(x) (struct finsh_block_header*)(x)
#define finsh_block_get_header(data) (struct finsh_block_header*)((uint8_t*)data - sizeof(struct finsh_block_header))
#define finsh_block_get_data(header) (uint8_t*)((struct finsh_block_header*)header + 1)
#define HEAP_ALIGN_SIZE(size)
(((size) + HEAP_ALIGNMENT - 1) & ~(HEAP_ALIGNMENT-1))
#define HEAP_ALIGN_SIZE(size)
(((size) + HEAP_ALIGNMENT - 1) & ~(HEAP_ALIGNMENT-1))
static
struct
finsh_block_header
*
free_list
;
static
struct
finsh_block_header
*
allocate_list
;
...
...
@@ -54,12 +54,12 @@ static void finsh_block_merge(struct finsh_block_header** list, struct finsh_blo
int
finsh_heap_init
(
void
)
{
/* clear heap to zero */
memset
(
&
finsh_heap
[
0
],
0
,
sizeof
(
finsh_heap
));
/* clear heap to zero */
memset
(
&
finsh_heap
[
0
],
0
,
sizeof
(
finsh_heap
));
/* init free and alloc list */
/* init free and alloc list */
free_list
=
BLOCK_HEADER
(
&
finsh_heap
[
0
]);
free_list
->
length
=
FINSH_HEAP_MAX
-
sizeof
(
struct
finsh_block_header
);
free_list
->
length
=
FINSH_HEAP_MAX
-
sizeof
(
struct
finsh_block_header
);
free_list
->
next
=
NULL
;
allocate_list
=
NULL
;
...
...
@@ -72,41 +72,41 @@ int finsh_heap_init(void)
*/
void
*
finsh_heap_allocate
(
size_t
size
)
{
struct
finsh_block_header
*
header
;
struct
finsh_block_header
*
header
;
size
=
HEAP_ALIGN_SIZE
(
size
);
size
=
HEAP_ALIGN_SIZE
(
size
);
/* find the first fit block */
for
(
header
=
free_list
;
((
header
!=
NULL
)
&&
(
header
->
length
<=
size
+
sizeof
(
struct
finsh_block_header
)));
header
=
header
->
next
)
;
if
(
header
==
NULL
)
{
finsh_heap_gc
();
if
(
header
==
NULL
)
{
finsh_heap_gc
();
/* find the first fit block */
for
(
header
=
free_list
;
((
header
!=
NULL
)
&&
(
header
->
length
<
size
+
sizeof
(
struct
finsh_block_header
)));
header
=
header
->
next
)
;
/* find the first fit block */
for
(
header
=
free_list
;
((
header
!=
NULL
)
&&
(
header
->
length
<
size
+
sizeof
(
struct
finsh_block_header
)));
header
=
header
->
next
)
;
/* there is no memory */
if
(
header
==
NULL
)
return
NULL
;
}
/* there is no memory */
if
(
header
==
NULL
)
return
NULL
;
}
/* split block */
finsh_block_split
(
header
,
size
);
finsh_block_split
(
header
,
size
);
/* remove from free list */
finsh_block_remove
(
&
free_list
,
header
);
header
->
next
=
NULL
;
/* remove from free list */
finsh_block_remove
(
&
free_list
,
header
);
header
->
next
=
NULL
;
/* insert to allocate list */
finsh_block_insert
(
&
allocate_list
,
header
);
memset
(
finsh_block_get_data
(
header
),
0
,
size
);
memset
(
finsh_block_get_data
(
header
),
0
,
size
);
return
finsh_block_get_data
(
header
);
return
finsh_block_get_data
(
header
);
}
/**
...
...
@@ -117,14 +117,14 @@ void finsh_heap_free(void*ptr)
struct
finsh_block_header
*
header
;
/* get block header */
header
=
finsh_block_get_header
(
ptr
);
header
=
finsh_block_get_header
(
ptr
);
/* remove from allocate list */
finsh_block_remove
(
&
allocate_list
,
header
);
finsh_block_remove
(
&
allocate_list
,
header
);
/* insert to free list */
finsh_block_insert
(
&
free_list
,
header
);
finsh_block_merge
(
&
free_list
,
header
);
/* insert to free list */
finsh_block_insert
(
&
free_list
,
header
);
finsh_block_merge
(
&
free_list
,
header
);
}
/**
...
...
@@ -132,31 +132,31 @@ void finsh_heap_free(void*ptr)
*/
static
void
finsh_heap_gc
(
void
)
{
int
i
;
struct
finsh_block_header
*
header
,
*
temp
;
int
i
;
struct
finsh_block_header
*
header
,
*
temp
;
temp
=
NULL
;
temp
=
NULL
;
/* find the first fit block */
for
(
header
=
allocate_list
;
header
!=
NULL
;
)
{
for
(
i
=
0
;
i
<
FINSH_VARIABLE_MAX
;
i
++
)
{
if
(
global_variable
[
i
].
type
!=
finsh_type_unknown
)
{
if
(
global_variable
[
i
].
value
.
ptr
==
finsh_block_get_data
(
header
))
break
;
}
}
temp
=
header
;
header
=
header
->
next
;
/* this block is an unused block, release it */
if
(
i
==
FINSH_VARIABLE_MAX
)
{
finsh_heap_free
(
finsh_block_get_data
(
temp
));
}
for
(
i
=
0
;
i
<
FINSH_VARIABLE_MAX
;
i
++
)
{
if
(
global_variable
[
i
].
type
!=
finsh_type_unknown
)
{
if
(
global_variable
[
i
].
value
.
ptr
==
finsh_block_get_data
(
header
))
break
;
}
}
temp
=
header
;
header
=
header
->
next
;
/* this block is an unused block, release it */
if
(
i
==
FINSH_VARIABLE_MAX
)
{
finsh_heap_free
(
finsh_block_get_data
(
temp
));
}
}
}
...
...
@@ -174,25 +174,25 @@ void finsh_block_insert(struct finsh_block_header** list, struct finsh_block_hea
}
/* find out insert point */
node
=
*
list
;
if
(
node
>
header
)
{
/* insert node in the header of list */
header
->
next
=
node
;
*
list
=
header
;
return
;
}
else
{
for
(
node
=
*
list
;
node
;
node
=
node
->
next
)
{
if
(
node
->
next
>
header
)
break
;
if
(
node
->
next
==
NULL
)
break
;
}
}
node
=
*
list
;
if
(
node
>
header
)
{
/* insert node in the header of list */
header
->
next
=
node
;
*
list
=
header
;
return
;
}
else
{
for
(
node
=
*
list
;
node
;
node
=
node
->
next
)
{
if
(
node
->
next
>
header
)
break
;
if
(
node
->
next
==
NULL
)
break
;
}
}
/* insert node */
if
(
node
->
next
!=
NULL
)
header
->
next
=
node
->
next
;
...
...
@@ -276,7 +276,7 @@ void finsh_block_merge(struct finsh_block_header** list, struct finsh_block_head
==
(
uint8_t
*
)
next_node
))
{
/* merge three node */
prev_node
->
length
+=
header
->
length
+
next_node
->
length
+
prev_node
->
length
+=
header
->
length
+
next_node
->
length
+
2
*
sizeof
(
struct
finsh_block_header
);
prev_node
->
next
=
next_node
->
next
;
...
...
components/finsh/finsh_init.c
浏览文件 @
f9a7ba05
...
...
@@ -37,15 +37,15 @@
int
finsh_init
(
struct
finsh_parser
*
parser
)
{
finsh_parser_init
(
parser
);
finsh_parser_init
(
parser
);
/* finsh init */
finsh_node_init
();
finsh_var_init
();
finsh_error_init
();
finsh_heap_init
();
/* finsh init */
finsh_node_init
();
finsh_var_init
();
finsh_error_init
();
finsh_heap_init
();
return
0
;
return
0
;
}
long
finsh_stack_bottom
()
...
...
@@ -55,22 +55,22 @@ long finsh_stack_bottom()
int
finsh_flush
(
struct
finsh_parser
*
parser
)
{
finsh_parser_init
(
parser
);
finsh_parser_init
(
parser
);
/* finsh init */
finsh_node_init
();
finsh_error_init
();
/* finsh init */
finsh_node_init
();
finsh_error_init
();
return
0
;
return
0
;
}
int
finsh_reset
(
struct
finsh_parser
*
parser
)
{
/* finsh init */
finsh_node_init
();
finsh_var_init
();
finsh_error_init
();
finsh_heap_init
();
/* finsh init */
finsh_node_init
();
finsh_var_init
();
finsh_error_init
();
finsh_heap_init
();
return
0
;
return
0
;
}
components/finsh/finsh_node.c
浏览文件 @
f9a7ba05
...
...
@@ -37,166 +37,166 @@ struct finsh_node global_node_table[FINSH_NODE_MAX];
int
finsh_node_init
()
{
memset
(
global_node_table
,
0
,
sizeof
(
global_node_table
));
memset
(
global_node_table
,
0
,
sizeof
(
global_node_table
));
return
0
;
return
0
;
}
struct
finsh_node
*
finsh_node_allocate
(
uint8_t
type
)
{
int
i
;
int
i
;
/* find an empty entry */
for
(
i
=
0
;
i
<
FINSH_NODE_MAX
;
i
++
)
{
if
(
global_node_table
[
i
].
node_type
==
FINSH_NODE_UNKNOWN
)
break
;
}
/* find an empty entry */
for
(
i
=
0
;
i
<
FINSH_NODE_MAX
;
i
++
)
{
if
(
global_node_table
[
i
].
node_type
==
FINSH_NODE_UNKNOWN
)
break
;
}
if
(
i
==
FINSH_NODE_MAX
)
return
NULL
;
if
(
i
==
FINSH_NODE_MAX
)
return
NULL
;
/* fill type field */
global_node_table
[
i
].
node_type
=
type
;
/* fill type field */
global_node_table
[
i
].
node_type
=
type
;
/* return this allocated node */
return
&
global_node_table
[
i
];
/* return this allocated node */
return
&
global_node_table
[
i
];
}
struct
finsh_node
*
finsh_node_new_id
(
char
*
id
)
{
struct
finsh_node
*
node
;
void
*
symbol
;
unsigned
char
type
;
symbol
=
NULL
;
type
=
0
;
node
=
NULL
;
/* lookup variable firstly */
symbol
=
(
void
*
)
finsh_var_lookup
(
id
);
if
(
symbol
==
NULL
)
{
/* then lookup system variable */
symbol
=
(
void
*
)
finsh_sysvar_lookup
(
id
);
if
(
symbol
==
NULL
)
{
/* then lookup system call */
symbol
=
(
void
*
)
finsh_syscall_lookup
(
id
);
if
(
symbol
!=
NULL
)
type
=
FINSH_IDTYPE_SYSCALL
;
}
else
type
=
FINSH_IDTYPE_SYSVAR
;
}
else
type
=
FINSH_IDTYPE_VAR
;
if
(
symbol
!=
NULL
)
{
/* allocate a new node */
node
=
finsh_node_allocate
(
FINSH_NODE_ID
);
/* allocate node error */
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
/* fill node value according type */
switch
(
type
)
{
case
FINSH_IDTYPE_VAR
:
node
->
id
.
var
=
(
struct
finsh_var
*
)
symbol
;
break
;
case
FINSH_IDTYPE_SYSVAR
:
node
->
id
.
sysvar
=
(
struct
finsh_sysvar
*
)
symbol
;
break
;
case
FINSH_IDTYPE_SYSCALL
:
node
->
id
.
syscall
=
(
struct
finsh_syscall
*
)
symbol
;
break
;
}
/* fill identifier type */
node
->
idtype
=
type
;
}
else
finsh_error_set
(
FINSH_ERROR_UNKNOWN_SYMBOL
);
return
node
;
struct
finsh_node
*
node
;
void
*
symbol
;
unsigned
char
type
;
symbol
=
NULL
;
type
=
0
;
node
=
NULL
;
/* lookup variable firstly */
symbol
=
(
void
*
)
finsh_var_lookup
(
id
);
if
(
symbol
==
NULL
)
{
/* then lookup system variable */
symbol
=
(
void
*
)
finsh_sysvar_lookup
(
id
);
if
(
symbol
==
NULL
)
{
/* then lookup system call */
symbol
=
(
void
*
)
finsh_syscall_lookup
(
id
);
if
(
symbol
!=
NULL
)
type
=
FINSH_IDTYPE_SYSCALL
;
}
else
type
=
FINSH_IDTYPE_SYSVAR
;
}
else
type
=
FINSH_IDTYPE_VAR
;
if
(
symbol
!=
NULL
)
{
/* allocate a new node */
node
=
finsh_node_allocate
(
FINSH_NODE_ID
);
/* allocate node error */
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
/* fill node value according type */
switch
(
type
)
{
case
FINSH_IDTYPE_VAR
:
node
->
id
.
var
=
(
struct
finsh_var
*
)
symbol
;
break
;
case
FINSH_IDTYPE_SYSVAR
:
node
->
id
.
sysvar
=
(
struct
finsh_sysvar
*
)
symbol
;
break
;
case
FINSH_IDTYPE_SYSCALL
:
node
->
id
.
syscall
=
(
struct
finsh_syscall
*
)
symbol
;
break
;
}
/* fill identifier type */
node
->
idtype
=
type
;
}
else
finsh_error_set
(
FINSH_ERROR_UNKNOWN_SYMBOL
);
return
node
;
}
struct
finsh_node
*
finsh_node_new_char
(
char
c
)
{
struct
finsh_node
*
node
;
struct
finsh_node
*
node
;
node
=
finsh_node_allocate
(
FINSH_NODE_VALUE_CHAR
);
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
node
=
finsh_node_allocate
(
FINSH_NODE_VALUE_CHAR
);
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
node
->
value
.
char_value
=
c
;
return
node
;
node
->
value
.
char_value
=
c
;
return
node
;
}
struct
finsh_node
*
finsh_node_new_int
(
int
i
)
{
struct
finsh_node
*
node
;
struct
finsh_node
*
node
;
node
=
finsh_node_allocate
(
FINSH_NODE_VALUE_INT
);
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
node
=
finsh_node_allocate
(
FINSH_NODE_VALUE_INT
);
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
node
->
value
.
int_value
=
i
;
return
node
;
node
->
value
.
int_value
=
i
;
return
node
;
}
struct
finsh_node
*
finsh_node_new_long
(
long
l
)
{
struct
finsh_node
*
node
;
struct
finsh_node
*
node
;
node
=
finsh_node_allocate
(
FINSH_NODE_VALUE_LONG
);
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
node
=
finsh_node_allocate
(
FINSH_NODE_VALUE_LONG
);
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
node
->
value
.
long_value
=
l
;
return
node
;
node
->
value
.
long_value
=
l
;
return
node
;
}
struct
finsh_node
*
finsh_node_new_string
(
char
*
s
)
{
struct
finsh_node
*
node
;
struct
finsh_node
*
node
;
node
=
finsh_node_allocate
(
FINSH_NODE_VALUE_STRING
);
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
node
=
finsh_node_allocate
(
FINSH_NODE_VALUE_STRING
);
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
/* make string */
node
->
value
.
ptr
=
finsh_heap_allocate
(
strlen
(
s
)
+
1
);
strncpy
(
node
->
value
.
ptr
,
s
,
strlen
(
s
));
((
uint8_t
*
)
node
->
value
.
ptr
)[
strlen
(
s
)]
=
'\0'
;
/* make string */
node
->
value
.
ptr
=
finsh_heap_allocate
(
strlen
(
s
)
+
1
);
strncpy
(
node
->
value
.
ptr
,
s
,
strlen
(
s
));
((
uint8_t
*
)
node
->
value
.
ptr
)[
strlen
(
s
)]
=
'\0'
;
return
node
;
return
node
;
}
struct
finsh_node
*
finsh_node_new_ptr
(
void
*
ptr
)
{
struct
finsh_node
*
node
;
struct
finsh_node
*
node
;
node
=
finsh_node_allocate
(
FINSH_NODE_VALUE_NULL
);
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
node
=
finsh_node_allocate
(
FINSH_NODE_VALUE_NULL
);
if
(
node
==
NULL
)
{
finsh_error_set
(
FINSH_ERROR_MEMORY_FULL
);
return
NULL
;
}
node
->
value
.
ptr
=
ptr
;
return
node
;
node
->
value
.
ptr
=
ptr
;
return
node
;
}
components/finsh/finsh_node.h
浏览文件 @
f9a7ba05
...
...
@@ -31,46 +31,46 @@
#include <finsh.h>
#define FINSH_NODE_UNKNOWN
0
#define FINSH_NODE_ID
1
#define FINSH_NODE_UNKNOWN
0
#define FINSH_NODE_ID
1
#define FINSH_NODE_VALUE_CHAR
2
#define FINSH_NODE_VALUE_INT
3
#define FINSH_NODE_VALUE_LONG
4
#define FINSH_NODE_VALUE_STRING
5
#define FINSH_NODE_VALUE_NULL
6
#define FINSH_NODE_VALUE_CHAR
2
#define FINSH_NODE_VALUE_INT
3
#define FINSH_NODE_VALUE_LONG
4
#define FINSH_NODE_VALUE_STRING
5
#define FINSH_NODE_VALUE_NULL
6
#define FINSH_NODE_SYS_ADD
7
#define FINSH_NODE_SYS_SUB
8
#define FINSH_NODE_SYS_MUL
9
#define FINSH_NODE_SYS_DIV
10
#define FINSH_NODE_SYS_MOD
11
#define FINSH_NODE_SYS_AND
12
#define FINSH_NODE_SYS_OR
13
#define FINSH_NODE_SYS_XOR
14
#define FINSH_NODE_SYS_BITWISE
15
#define FINSH_NODE_SYS_SHL
16
#define FINSH_NODE_SYS_SHR
17
#define FINSH_NODE_SYS_FUNC
18
#define FINSH_NODE_SYS_ASSIGN
19
#define FINSH_NODE_SYS_CAST
20
#define FINSH_NODE_SYS_PREINC
21
#define FINSH_NODE_SYS_PREDEC
22
#define FINSH_NODE_SYS_INC
23
#define FINSH_NODE_SYS_DEC
24
#define FINSH_NODE_SYS_ADD
7
#define FINSH_NODE_SYS_SUB
8
#define FINSH_NODE_SYS_MUL
9
#define FINSH_NODE_SYS_DIV
10
#define FINSH_NODE_SYS_MOD
11
#define FINSH_NODE_SYS_AND
12
#define FINSH_NODE_SYS_OR
13
#define FINSH_NODE_SYS_XOR
14
#define FINSH_NODE_SYS_BITWISE
15
#define FINSH_NODE_SYS_SHL
16
#define FINSH_NODE_SYS_SHR
17
#define FINSH_NODE_SYS_FUNC
18
#define FINSH_NODE_SYS_ASSIGN
19
#define FINSH_NODE_SYS_CAST
20
#define FINSH_NODE_SYS_PREINC
21
#define FINSH_NODE_SYS_PREDEC
22
#define FINSH_NODE_SYS_INC
23
#define FINSH_NODE_SYS_DEC
24
#define FINSH_NODE_SYS_GETVALUE 25
#define FINSH_NODE_SYS_GETADDR 26
#define FINSH_NODE_SYS_NULL
27
#define FINSH_NODE_SYS_NULL
27
#define FINSH_DATA_TYPE_VOID
0x00
#define FINSH_DATA_TYPE_BYTE
0x01
#define FINSH_DATA_TYPE_WORD
0x02
#define FINSH_DATA_TYPE_DWORD
0x03
#define FINSH_DATA_TYPE_PTR
0x10
#define FINSH_DATA_TYPE_VOID
0x00
#define FINSH_DATA_TYPE_BYTE
0x01
#define FINSH_DATA_TYPE_WORD
0x02
#define FINSH_DATA_TYPE_DWORD
0x03
#define FINSH_DATA_TYPE_PTR
0x10
#define FINSH_NODE_VALUE
0
#define FINSH_NODE_ADDRESS
1
#define FINSH_NODE_FUNCTION
2
#define FINSH_NODE_VALUE
0
#define FINSH_NODE_ADDRESS
1
#define FINSH_NODE_FUNCTION
2
int
finsh_node_init
(
void
);
...
...
@@ -82,7 +82,7 @@ struct finsh_node* finsh_node_new_long(long l);
struct
finsh_node
*
finsh_node_new_string
(
char
*
s
);
struct
finsh_node
*
finsh_node_new_ptr
(
void
*
ptr
);
#define finsh_node_sibling(node)
((node)->sibling)
#define finsh_node_child(node)
((node)->child)
#define finsh_node_sibling(node)
((node)->sibling)
#define finsh_node_child(node)
((node)->child)
#endif
components/finsh/finsh_ops.c
浏览文件 @
f9a7ba05
...
...
@@ -47,8 +47,8 @@
/* --- noop --- */
void
OP_no_op
()
{
/* none */
return
;
/* none */
return
;
}
/* --- add --- */
...
...
@@ -56,87 +56,87 @@ void OP_add_byte()
{
OP_BIN_BYTE
(
+
);
return
;
return
;
}
void
OP_add_word
()
{
OP_BIN_WORD
(
+
);
return
;
return
;
}
void
OP_add_dword
()
{
OP_BIN_DWORD
(
+
);
return
;
return
;
}
/* --- sub --- */
void
OP_sub_byte
()
{
OP_BIN_BYTE
(
-
);
OP_BIN_BYTE
(
-
);
return
;
return
;
}
void
OP_sub_word
()
{
OP_BIN_WORD
(
-
);
OP_BIN_WORD
(
-
);
return
;
return
;
}
void
OP_sub_dword
()
{
OP_BIN_DWORD
(
-
);
OP_BIN_DWORD
(
-
);
return
;
return
;
}
/* --- div --- */
void
OP_div_byte
()
{
OP_BIN_BYTE
(
/
);
OP_BIN_BYTE
(
/
);
return
;
return
;
}
void
OP_div_word
()
{
OP_BIN_WORD
(
/
);
OP_BIN_WORD
(
/
);
return
;
return
;
}
void
OP_div_dword
()
{
OP_BIN_DWORD
(
/
);
OP_BIN_DWORD
(
/
);
return
;
return
;
}
/* --- mod --- */
void
OP_mod_byte
()
{
OP_BIN_BYTE
(
%
);
OP_BIN_BYTE
(
%
);
return
;
return
;
}
void
OP_mod_word
()
{
OP_BIN_WORD
(
%
);
OP_BIN_WORD
(
%
);
return
;
return
;
}
void
OP_mod_dword
()
{
OP_BIN_DWORD
(
%
);
OP_BIN_DWORD
(
%
);
return
;
return
;
}
/* --- mul --- */
...
...
@@ -144,256 +144,256 @@ void OP_mul_byte()
{
OP_BIN_BYTE
(
*
);
return
;
return
;
}
void
OP_mul_word
()
{
OP_BIN_WORD
(
*
);
OP_BIN_WORD
(
*
);
return
;
return
;
}
void
OP_mul_dword
()
{
OP_BIN_DWORD
(
*
);
OP_BIN_DWORD
(
*
);
return
;
return
;
}
/* --- and --- */
void
OP_and_byte
()
{
OP_BIN_BYTE
(
&
);
OP_BIN_BYTE
(
&
);
return
;
return
;
}
void
OP_and_word
()
{
OP_BIN_WORD
(
&
);
OP_BIN_WORD
(
&
);
return
;
return
;
}
void
OP_and_dword
()
{
OP_BIN_DWORD
(
&
);
OP_BIN_DWORD
(
&
);
return
;
return
;
}
/* --- or --- */
void
OP_or_byte
()
{
OP_BIN_BYTE
(
|
);
OP_BIN_BYTE
(
|
);
return
;
return
;
}
void
OP_or_word
()
{
OP_BIN_WORD
(
|
);
OP_BIN_WORD
(
|
);
return
;
return
;
}
void
OP_or_dword
()
{
OP_BIN_DWORD
(
|
);
OP_BIN_DWORD
(
|
);
return
;
return
;
}
/* --- xor --- */
void
OP_xor_byte
()
{
OP_BIN_BYTE
(
^
);
OP_BIN_BYTE
(
^
);
return
;
return
;
}
void
OP_xor_word
()
{
OP_BIN_WORD
(
^
);
OP_BIN_WORD
(
^
);
return
;
return
;
}
void
OP_xor_dword
()
{
OP_BIN_DWORD
(
^
);
OP_BIN_DWORD
(
^
);
return
;
return
;
}
/* --- bw --- */
void
OP_bw_byte
()
{
(
finsh_sp
-
1
)
->
char_value
=
~
((
finsh_sp
-
1
)
->
char_value
);
(
finsh_sp
-
1
)
->
char_value
=
~
((
finsh_sp
-
1
)
->
char_value
);
return
;
return
;
}
void
OP_bw_word
()
{
(
finsh_sp
-
1
)
->
short_value
=
~
((
finsh_sp
-
1
)
->
short_value
);
(
finsh_sp
-
1
)
->
short_value
=
~
((
finsh_sp
-
1
)
->
short_value
);
return
;
return
;
}
void
OP_bw_dword
()
{
(
finsh_sp
-
1
)
->
long_value
=
~
((
finsh_sp
-
1
)
->
long_value
);
(
finsh_sp
-
1
)
->
long_value
=
~
((
finsh_sp
-
1
)
->
long_value
);
return
;
return
;
}
/* --- shl --- */
void
OP_shl_byte
()
{
OP_BIN_BYTE
(
<<
);
OP_BIN_BYTE
(
<<
);
return
;
return
;
}
void
OP_shl_word
()
{
OP_BIN_WORD
(
<<
);
OP_BIN_WORD
(
<<
);
return
;
return
;
}
void
OP_shl_dword
()
{
OP_BIN_DWORD
(
<<
);
OP_BIN_DWORD
(
<<
);
return
;
return
;
}
/* --- shr --- */
void
OP_shr_byte
()
{
OP_BIN_BYTE
(
>>
);
OP_BIN_BYTE
(
>>
);
return
;
return
;
}
void
OP_shr_word
()
{
OP_BIN_WORD
(
>>
);
OP_BIN_WORD
(
>>
);
return
;
return
;
}
void
OP_shr_dword
()
{
OP_BIN_DWORD
(
>>
);
OP_BIN_DWORD
(
>>
);
return
;
return
;
}
/* --- ld --- */
void
OP_ld_byte
()
{
finsh_sp
->
char_value
=
*
finsh_pc
;
finsh_sp
->
char_value
=
*
finsh_pc
;
finsh_sp
++
;
finsh_pc
++
;
finsh_sp
++
;
finsh_pc
++
;
return
;
return
;
}
void
OP_ld_word
()
{
finsh_sp
->
short_value
=
FINSH_GET16
(
finsh_pc
);
finsh_sp
->
short_value
=
FINSH_GET16
(
finsh_pc
);
finsh_sp
++
;
finsh_pc
+=
2
;
finsh_sp
++
;
finsh_pc
+=
2
;
return
;
return
;
}
void
OP_ld_dword
()
{
finsh_sp
->
long_value
=
FINSH_GET32
(
finsh_pc
);
finsh_sp
->
long_value
=
FINSH_GET32
(
finsh_pc
);
finsh_sp
++
;
finsh_pc
+=
4
;
finsh_sp
++
;
finsh_pc
+=
4
;
return
;
return
;
}
void
OP_ld_value_byte
()
{
char
*
c
;
char
*
c
;
c
=
(
char
*
)
(
FINSH_GET32
(
finsh_pc
));
c
=
(
char
*
)
(
FINSH_GET32
(
finsh_pc
));
finsh_sp
->
char_value
=
*
c
;
finsh_sp
->
char_value
=
*
c
;
finsh_sp
++
;
finsh_pc
+=
4
;
finsh_sp
++
;
finsh_pc
+=
4
;
return
;
return
;
}
void
OP_ld_value_byte_stack
()
{
char
*
c
;
char
*
c
;
c
=
(
char
*
)(
finsh_sp
-
1
)
->
long_value
;
(
finsh_sp
-
1
)
->
char_value
=
*
c
;
c
=
(
char
*
)(
finsh_sp
-
1
)
->
long_value
;
(
finsh_sp
-
1
)
->
char_value
=
*
c
;
return
;
return
;
}
void
OP_ld_value_word
()
{
short
*
s
;
short
*
s
;
s
=
(
short
*
)
(
FINSH_GET32
(
finsh_pc
));
s
=
(
short
*
)
(
FINSH_GET32
(
finsh_pc
));
finsh_sp
->
short_value
=
*
s
;
finsh_sp
->
short_value
=
*
s
;
finsh_sp
++
;
finsh_pc
+=
4
;
finsh_sp
++
;
finsh_pc
+=
4
;
return
;
return
;
}
void
OP_ld_value_word_stack
()
{
short
*
s
;
short
*
s
;
s
=
(
short
*
)(
finsh_sp
-
1
)
->
long_value
;
(
finsh_sp
-
1
)
->
short_value
=
*
s
;
s
=
(
short
*
)(
finsh_sp
-
1
)
->
long_value
;
(
finsh_sp
-
1
)
->
short_value
=
*
s
;
return
;
return
;
}
void
OP_ld_value_dword
()
{
long
*
l
;
long
*
l
;
l
=
(
long
*
)
(
FINSH_GET32
(
finsh_pc
));
l
=
(
long
*
)
(
FINSH_GET32
(
finsh_pc
));
finsh_sp
->
long_value
=
*
l
;
finsh_sp
->
long_value
=
*
l
;
finsh_sp
++
;
finsh_pc
+=
4
;
finsh_sp
++
;
finsh_pc
+=
4
;
return
;
return
;
}
void
OP_ld_value_dword_stack
()
{
long
*
l
;
long
*
l
;
l
=
(
long
*
)(
finsh_sp
-
1
)
->
long_value
;
(
finsh_sp
-
1
)
->
long_value
=
*
l
;
l
=
(
long
*
)(
finsh_sp
-
1
)
->
long_value
;
(
finsh_sp
-
1
)
->
long_value
=
*
l
;
return
;
return
;
}
/* --- st --- */
...
...
@@ -403,10 +403,10 @@ void OP_ld_value_dword_stack()
*/
void
OP_st_byte
()
{
*
(
char
*
)((
finsh_sp
-
2
)
->
long_value
)
=
(
finsh_sp
-
1
)
->
char_value
;
finsh_sp
--
;
*
(
char
*
)((
finsh_sp
-
2
)
->
long_value
)
=
(
finsh_sp
-
1
)
->
char_value
;
finsh_sp
--
;
return
;
return
;
}
/*
...
...
@@ -415,10 +415,10 @@ void OP_st_byte()
*/
void
OP_st_word
()
{
*
(
short
*
)((
finsh_sp
-
2
)
->
long_value
)
=
(
finsh_sp
-
1
)
->
short_value
;
finsh_sp
--
;
*
(
short
*
)((
finsh_sp
-
2
)
->
long_value
)
=
(
finsh_sp
-
1
)
->
short_value
;
finsh_sp
--
;
return
;
return
;
}
/*
...
...
@@ -427,196 +427,196 @@ void OP_st_word()
*/
void
OP_st_dword
()
{
*
(
long
*
)((
finsh_sp
-
2
)
->
long_value
)
=
(
finsh_sp
-
1
)
->
long_value
;
finsh_sp
--
;
*
(
long
*
)((
finsh_sp
-
2
)
->
long_value
)
=
(
finsh_sp
-
1
)
->
long_value
;
finsh_sp
--
;
return
;
return
;
}
/* --- pop --- */
void
OP_pop
()
{
finsh_sp
--
;
return
;
finsh_sp
--
;
return
;
}
/* --- call --- */
void
OP_call
()
{
/* the max number of arg*/
unsigned
long
parameterv
[
16
];
unsigned
int
parameters
,
i
;
typedef
unsigned
long
var_t
;
typedef
var_t
(
*
op_func
)();
op_func
f
;
var_t
r
;
parameters
=
*
finsh_pc
++
;
i
=
0
;
finsh_sp
--
;
while
(
i
<
parameters
)
{
parameterv
[
parameters
-
1
-
i
]
=
finsh_sp
->
long_value
;
finsh_sp
--
;
i
++
;
}
f
=
(
op_func
)(
finsh_sp
->
long_value
);
switch
(
parameters
)
{
case
0
:
r
=
f
(
0
);
break
;
case
1
:
r
=
f
(
parameterv
[
0
]);
break
;
case
2
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
]);
break
;
case
3
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
]);
break
;
case
4
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
]);
break
;
case
5
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
]);
break
;
case
6
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
]);
break
;
case
7
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
]);
break
;
case
8
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
]);
break
;
case
9
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
]);
break
;
case
10
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
]);
break
;
case
11
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
]);
break
;
case
12
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
],
parameterv
[
11
]);
break
;
case
13
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
],
parameterv
[
11
],
parameterv
[
12
]);
break
;
case
14
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
],
parameterv
[
11
],
parameterv
[
12
],
parameterv
[
13
]);
break
;
case
15
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
],
parameterv
[
11
],
parameterv
[
12
],
parameterv
[
13
],
parameterv
[
14
]);
break
;
case
16
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
],
parameterv
[
11
],
parameterv
[
12
],
parameterv
[
13
],
parameterv
[
14
],
parameterv
[
15
]);
break
;
default:
r
=
0
;
break
;
}
finsh_sp
->
long_value
=
r
;
finsh_sp
++
;
return
;
/* the max number of arg*/
unsigned
long
parameterv
[
16
];
unsigned
int
parameters
,
i
;
typedef
unsigned
long
var_t
;
typedef
var_t
(
*
op_func
)();
op_func
f
;
var_t
r
;
parameters
=
*
finsh_pc
++
;
i
=
0
;
finsh_sp
--
;
while
(
i
<
parameters
)
{
parameterv
[
parameters
-
1
-
i
]
=
finsh_sp
->
long_value
;
finsh_sp
--
;
i
++
;
}
f
=
(
op_func
)(
finsh_sp
->
long_value
);
switch
(
parameters
)
{
case
0
:
r
=
f
(
0
);
break
;
case
1
:
r
=
f
(
parameterv
[
0
]);
break
;
case
2
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
]);
break
;
case
3
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
]);
break
;
case
4
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
]);
break
;
case
5
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
]);
break
;
case
6
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
]);
break
;
case
7
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
]);
break
;
case
8
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
]);
break
;
case
9
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
]);
break
;
case
10
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
]);
break
;
case
11
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
]);
break
;
case
12
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
],
parameterv
[
11
]);
break
;
case
13
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
],
parameterv
[
11
],
parameterv
[
12
]);
break
;
case
14
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
],
parameterv
[
11
],
parameterv
[
12
],
parameterv
[
13
]);
break
;
case
15
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
],
parameterv
[
11
],
parameterv
[
12
],
parameterv
[
13
],
parameterv
[
14
]);
break
;
case
16
:
r
=
f
(
parameterv
[
0
],
parameterv
[
1
],
parameterv
[
2
],
parameterv
[
3
],
parameterv
[
4
],
parameterv
[
5
],
parameterv
[
6
],
parameterv
[
7
],
parameterv
[
8
],
parameterv
[
9
],
parameterv
[
10
],
parameterv
[
11
],
parameterv
[
12
],
parameterv
[
13
],
parameterv
[
14
],
parameterv
[
15
]);
break
;
default:
r
=
0
;
break
;
}
finsh_sp
->
long_value
=
r
;
finsh_sp
++
;
return
;
}
const
op_func
op_table
[]
=
{
/* 00 */
OP_no_op
,
/* 01 */
OP_add_byte
,
/* 02 */
OP_add_word
,
/* 03 */
OP_add_dword
,
/* 04 */
OP_sub_byte
,
/* 05 */
OP_sub_word
,
/* 06 */
OP_sub_dword
,
/* 07 */
OP_div_byte
,
/* 08 */
OP_div_word
,
/* 09 */
OP_div_dword
,
/* 10 */
OP_mod_byte
,
/* 11 */
OP_mod_word
,
/* 12 */
OP_mod_dword
,
/* 13 */
OP_mul_byte
,
/* 14 */
OP_mul_word
,
/* 15 */
OP_mul_dword
,
/* 16 */
OP_and_byte
,
/* 17 */
OP_and_word
,
/* 18 */
OP_and_dword
,
/* 19 */
OP_or_byte
,
/* 20 */
OP_or_word
,
/* 21 */
OP_or_dword
,
/* 22 */
OP_xor_byte
,
/* 23 */
OP_xor_word
,
/* 24 */
OP_xor_dword
,
/* 25 */
OP_bw_byte
,
/* 26 */
OP_bw_word
,
/* 27 */
OP_bw_dword
,
/* 28 */
OP_shl_byte
,
/* 29 */
OP_shl_word
,
/* 30 */
OP_shl_dword
,
/* 31 */
OP_shr_byte
,
/* 32 */
OP_shr_word
,
/* 33 */
OP_shr_dword
,
/* 34 */
OP_ld_byte
,
/* 35 */
OP_ld_word
,
/* 36 */
OP_ld_dword
,
/* 37 */
OP_ld_value_byte
,
/* 38 */
OP_ld_value_word
,
/* 39 */
OP_ld_value_dword
,
/* 40 */
OP_st_byte
,
/* 41 */
OP_st_word
,
/* 42 */
OP_st_dword
,
/* 43 */
OP_pop
,
/* 44 */
OP_call
,
/* 45 */
OP_ld_value_byte_stack
,
/* 46 */
OP_ld_value_word_stack
,
/* 47 */
OP_ld_value_dword_stack
,
NULL
/* 00 */
OP_no_op
,
/* 01 */
OP_add_byte
,
/* 02 */
OP_add_word
,
/* 03 */
OP_add_dword
,
/* 04 */
OP_sub_byte
,
/* 05 */
OP_sub_word
,
/* 06 */
OP_sub_dword
,
/* 07 */
OP_div_byte
,
/* 08 */
OP_div_word
,
/* 09 */
OP_div_dword
,
/* 10 */
OP_mod_byte
,
/* 11 */
OP_mod_word
,
/* 12 */
OP_mod_dword
,
/* 13 */
OP_mul_byte
,
/* 14 */
OP_mul_word
,
/* 15 */
OP_mul_dword
,
/* 16 */
OP_and_byte
,
/* 17 */
OP_and_word
,
/* 18 */
OP_and_dword
,
/* 19 */
OP_or_byte
,
/* 20 */
OP_or_word
,
/* 21 */
OP_or_dword
,
/* 22 */
OP_xor_byte
,
/* 23 */
OP_xor_word
,
/* 24 */
OP_xor_dword
,
/* 25 */
OP_bw_byte
,
/* 26 */
OP_bw_word
,
/* 27 */
OP_bw_dword
,
/* 28 */
OP_shl_byte
,
/* 29 */
OP_shl_word
,
/* 30 */
OP_shl_dword
,
/* 31 */
OP_shr_byte
,
/* 32 */
OP_shr_word
,
/* 33 */
OP_shr_dword
,
/* 34 */
OP_ld_byte
,
/* 35 */
OP_ld_word
,
/* 36 */
OP_ld_dword
,
/* 37 */
OP_ld_value_byte
,
/* 38 */
OP_ld_value_word
,
/* 39 */
OP_ld_value_dword
,
/* 40 */
OP_st_byte
,
/* 41 */
OP_st_word
,
/* 42 */
OP_st_dword
,
/* 43 */
OP_pop
,
/* 44 */
OP_call
,
/* 45 */
OP_ld_value_byte_stack
,
/* 46 */
OP_ld_value_word_stack
,
/* 47 */
OP_ld_value_dword_stack
,
NULL
};
components/finsh/finsh_parser.c
浏览文件 @
f9a7ba05
此差异已折叠。
点击以展开。
components/finsh/finsh_token.c
浏览文件 @
f9a7ba05
此差异已折叠。
点击以展开。
components/finsh/finsh_token.h
浏览文件 @
f9a7ba05
此差异已折叠。
点击以展开。
components/finsh/finsh_var.c
浏览文件 @
f9a7ba05
此差异已折叠。
点击以展开。
components/finsh/finsh_var.h
浏览文件 @
f9a7ba05
...
...
@@ -37,18 +37,18 @@
*/
struct
finsh_var
{
char
name
[
FINSH_NAME_MAX
+
1
];
/* the name of variable */
char
name
[
FINSH_NAME_MAX
+
1
];
/* the name of variable */
uint8_t
type
;
/* the type of variable */
uint8_t
type
;
/* the type of variable */
/* variable value */
union
{
char
char_value
;
short
short_value
;
int
int_value
;
long
long_value
;
void
*
ptr
;
}
value
;
/* variable value */
union
{
char
char_value
;
short
short_value
;
int
int_value
;
long
long_value
;
void
*
ptr
;
}
value
;
};
extern
struct
finsh_var
global_variable
[];
...
...
components/finsh/finsh_vm.c
浏览文件 @
f9a7ba05
此差异已折叠。
点击以展开。
components/finsh/finsh_vm.h
浏览文件 @
f9a7ba05
此差异已折叠。
点击以展开。
components/finsh/msh_cmd.c
浏览文件 @
f9a7ba05
此差异已折叠。
点击以展开。
components/finsh/shell.c
浏览文件 @
f9a7ba05
...
...
@@ -233,7 +233,7 @@ static void finsh_wait_auth(void)
rt_size_t
cur_pos
=
0
;
/* password not set */
if
(
rt_strlen
(
finsh_get_password
())
==
0
)
return
;
while
(
1
)
{
rt_kprintf
(
"Password for login: "
);
...
...
components/finsh/symbol.c
浏览文件 @
f9a7ba05
此差异已折叠。
点击以展开。
include/rtthread.h
浏览文件 @
f9a7ba05
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录