From 65ac4a081070dd51553b1aea3cfb784ac0290d47 Mon Sep 17 00:00:00 2001 From: zhangjun <2281979437@qq.com> Date: Fri, 12 Aug 2016 22:14:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0rt=5Fstrnlen,lua=E9=87=87?= =?UTF-8?q?=E7=94=A8=E5=8D=95=E7=8B=AC=E7=9A=84=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../external/lua/applications/lua_in_finsh.c | 103 ++++++++++++++---- src/kservice.c | 19 ++++ 2 files changed, 101 insertions(+), 21 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; iargc = 2; + parameters->argc = argc; + char **arg = parameters->argv; + + 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); } - arg[argc] = NULL; - - finsh_lua(argc, arg); - rt_free(arg); 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. -- GitLab