summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzhangjun <[email protected]>2016-08-12 22:14:07 +0800
committerzhangjun <[email protected]>2016-08-12 22:14:07 +0800
commit65ac4a081070dd51553b1aea3cfb784ac0290d47 (patch)
tree1c102820ebf41f1dbaf2fe5f1375ff9bc5eb04cb
parent891050cb3d84f0592f8fc4c4345a86613fc12673 (diff)
增加rt_strnlen,lua采用单独的线程
-rw-r--r--components/external/lua/applications/lua_in_finsh.c101
-rw-r--r--src/kservice.c19
2 files changed, 100 insertions, 20 deletions
diff --git a/components/external/lua/applications/lua_in_finsh.c b/components/external/lua/applications/lua_in_finsh.c
index ecf9700d37..27eb746650 100644
--- a/components/external/lua/applications/lua_in_finsh.c
+++ b/components/external/lua/applications/lua_in_finsh.c
@@ -20,8 +20,12 @@ rt_err_t lua_rx_ind(rt_device_t dev, rt_size_t size)
return RT_EOK;
}
+struct para{
+ int argc;
+ char *argv[3];
+};
-void finsh_lua(int argc, char **argv)
+void finsh_lua(struct para *parameters)
{
rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
@@ -31,12 +35,21 @@ void finsh_lua(int argc, char **argv)
rx_indicate = dev4lua.device->rx_indicate;
/* set new rx_indicate */
- rt_device_set_rx_indicate(dev4lua.device, lua_rx_ind);
+ //rt_device_set_rx_indicate(dev4lua.device, lua_rx_ind);
{
- /* run lua interpreter */
- lua_main(argc, argv);
+ int argc = parameters->argc;
+ char **argv = parameters->argv;
+ /*
+ rt_kprintf("argc =%d, argv[1] =%d\n", argc, argv[1]);
+ while(1);
+ */
+ /* run lua interpreter */
+ lua_main(argc, argv);
}
+ if (parameters->argc > 1)
+ rt_free(parameters->argv[1]);
+ rt_free(parameters);
/* recover old rx_indicate */
rt_device_set_rx_indicate(dev4lua.device, rx_indicate);
@@ -44,6 +57,7 @@ void finsh_lua(int argc, char **argv)
static void lua(void *parameters)
{
+ rt_thread_t lua_thread;
const char* device_name = finsh_get_device();
rt_device_t device = rt_device_find(device_name);
if (device == RT_NULL)
@@ -52,29 +66,49 @@ static void lua(void *parameters)
return;
}
dev4lua.device = device;
- char *argv[] = {"lua", parameters, NULL};
-#if 0
+ /*prepare parameters*/
+ struct para *lua_parameters = rt_malloc(sizeof(struct para));
+ if ( lua_parameters == NULL ){
+ rt_kprintf("malloc failed at file: %s,line: %d", __FILE__, __LINE__);
+ return;
+ }
+ lua_parameters->argc = 2;
+ char **arg = lua_parameters->argv;
+
+ arg[0] = "lua";
+ if (parameters != NULL){
+ rt_size_t len = strnlen(parameters, 50);
+ arg[1] = rt_malloc(len + 1);
+ if (arg[1] == NULL ){
+ rt_kprintf("malloc failed at file: %s,line: %d", __FILE__, __LINE__);
+ return;
+ }
+ rt_memset(arg[1], 0, len+1);
+ strncpy(arg[1], parameters, len);
+ }else{
+ arg[1] = NULL;
+ }
+ arg[2] = NULL;
+
/* Run lua interpreter in separate thread */
lua_thread = rt_thread_create("lua",
- finsh_lua,
- 0,
- 2048,
+ (void (*)(void *))finsh_lua,
+ (void*)lua_parameters,
+ 10240,
rt_thread_self()->current_priority + 1,
20);
if (lua_thread != RT_NULL)
{
rt_thread_startup(lua_thread);
}
-#else
- /* Directly run lua interpreter in finsh */
- finsh_lua(2, argv);
-#endif
+ return;
}
FINSH_FUNCTION_EXPORT(lua, lua interpreter);
static void lua_msh(int argc, char **argv)
{
+ rt_thread_t lua_thread;
const char* device_name = finsh_get_device();
rt_device_t device = rt_device_find(device_name);
if (device == RT_NULL)
@@ -85,15 +119,42 @@ static void lua_msh(int argc, char **argv)
dev4lua.device = device;
/*prepare parameters*/
- int i;
- char **arg = rt_malloc((argc+1)*sizeof(char*));
- for (i=0; i<argc; i++){
- arg[i] = argv[i];
+ struct para *parameters = rt_malloc(sizeof(struct para));
+ if ( parameters == NULL ){
+ rt_kprintf("malloc failed at file: %s,line: %d", __FILE__, __LINE__);
+ return;
}
- arg[argc] = NULL;
+ //parameters->argc = 2;
+ parameters->argc = argc;
+ char **arg = parameters->argv;
- finsh_lua(argc, arg);
- rt_free(arg);
+ arg[0] = "lua";
+ if (argc > 1){
+ rt_size_t len = strnlen(argv[1], 50);
+ arg[1] = rt_malloc(len + 1);
+ if (arg[1] == NULL ){
+ rt_kprintf("malloc failed at file: %s,line: %d", __FILE__, __LINE__);
+ return;
+ }
+ rt_memset(arg[1], 0, len+1);
+ strncpy(arg[1], argv[1], len);
+ }else{
+ arg[1] = NULL;
+ }
+ arg[2] = NULL;
+
+
+ /* Run lua interpreter in separate thread */
+ lua_thread = rt_thread_create("lua_msh",
+ (void (*)(void *))(finsh_lua),
+ (void*)parameters,
+ 10240,
+ rt_thread_self()->current_priority - 1,
+ 20);
+ if (lua_thread != RT_NULL)
+ {
+ rt_thread_startup(lua_thread);
+ }
return;
}
MSH_CMD_EXPORT(lua_msh, lua in msh);
diff --git a/src/kservice.c b/src/kservice.c
index 7250639346..f5cd934e2d 100644
--- a/src/kservice.c
+++ b/src/kservice.c
@@ -462,7 +462,26 @@ rt_int32_t rt_strcmp(const char *cs, const char *ct)
return (*cs - *ct);
}
RTM_EXPORT(rt_strcmp);
+/**
+ * The strnlen() function returns the number of characters in the
+ * string pointed to by s, excluding the terminating null byte ('\0'),
+ * but at most maxlen. In doing this, strnlen() looks only at the
+ * first maxlen characters in the string pointed to by s and never
+ * beyond s+maxlen.
+ *
+ * @param s the string
+ * @param maxlen the max size
+ * @return the length of string
+ */
+rt_size_t rt_strnlen(const char *s, rt_ubase_t maxlen)
+{
+ const char *sc;
+
+ for (sc = s; *sc != '\0' && sc - s < maxlen; ++sc) /* nothing */
+ ;
+ return sc - s;
+}
/**
* This function will return the length of a string, which terminate will
* null character.