From c4dc5ab0f8b5caae55efdbedf59ab07f5006f6c2 Mon Sep 17 00:00:00 2001 From: lnlan Date: Sat, 21 Aug 2021 07:36:41 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84m=E6=A0=B8qemu?= =?UTF-8?q?=E4=B8=B2=E5=8F=A3=E9=A9=B1=E5=8A=A8=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?shell=E8=BE=93=E5=85=A5=20=E3=80=90=E8=83=8C=E6=99=AF=E3=80=91?= =?UTF-8?q?=20m=E6=A0=B8qemu=E9=9C=80=E5=AE=8C=E5=96=84=E4=B8=B2=E5=8F=A3?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=EF=BC=8C=E6=94=AF=E6=8C=81shell=E8=BE=93?= =?UTF-8?q?=E5=85=A5=20=E3=80=90=E4=BF=AE=E6=94=B9=E6=96=B9=E6=A1=88?= =?UTF-8?q?=E3=80=91=201.=E5=AE=8C=E5=96=84=E4=B8=B2=E5=8F=A3=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8=202.=E6=B7=BB=E5=8A=A0shell=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=EF=BC=8C=E8=8E=B7=E5=8F=96=E4=B8=B2=E5=8F=A3=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E5=B9=B6=E4=B8=8B=E5=8F=91=E5=A4=84=E7=90=86=20=E3=80=90?= =?UTF-8?q?=E5=BD=B1=E5=93=8D=E3=80=91=20=E5=AF=B9=E7=8E=B0=E6=9C=89?= =?UTF-8?q?=E7=9A=84=E4=BA=A7=E5=93=81=E7=BC=96=E8=AF=91=E4=B8=8D=E4=BC=9A?= =?UTF-8?q?=E6=9C=89=E5=BD=B1=E5=93=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit re #I46N7F Signed-off-by: lanleinan Change-Id: Ib58d4e633081743e64412cb65aa209d3356d6c1c --- components/shell/src/base/shmsg.c | 120 ++++++++++++++++------ components/shell/src/cmds/task_shellcmd.c | 2 +- kernel/include/los_config.h | 19 ++++ 3 files changed, 111 insertions(+), 30 deletions(-) diff --git a/components/shell/src/base/shmsg.c b/components/shell/src/base/shmsg.c index eb1c15c5..2e3e7ca6 100755 --- a/components/shell/src/base/shmsg.c +++ b/components/shell/src/base/shmsg.c @@ -29,11 +29,18 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include "shmsg.h" +#include "securec.h" #include "shcmd.h" #include "show.h" -#include "securec.h" +#if (LOSCFG_USE_SHELL == 1) +#include "uart.h" +#endif +#include "los_event.h" +#include "los_task.h" + +EVENT_CB_S g_shellInputEvent; +#define SHELL_CMD_MAX_SIZE 64 UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR *cmdType) { @@ -60,17 +67,17 @@ UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR *cmdType) return OS_INVALID; } -char *GetCmdName(const char *cmdline, unsigned int len) +CHAR *GetCmdName(const CHAR *cmdline, UINT32 len) { - unsigned int loop; - const char *tmpStr = NULL; + UINT32 loop; + const CHAR *tmpStr = NULL; BOOL quotes = FALSE; - char *cmdName = NULL; + CHAR *cmdName = NULL; if (cmdline == NULL) { return NULL; } - cmdName = (char *)malloc(len + 1); + cmdName = (CHAR *)malloc(len + 1); if (cmdName == NULL) { PRINTK("malloc failure in %s[%d]\n", __FUNCTION__, __LINE__); return NULL; @@ -99,9 +106,9 @@ char *GetCmdName(const char *cmdline, unsigned int len) return cmdName; } -int ShellCmdExec(const char *msgName, const char *cmdString) +INT32 ShellCmdExec(const CHAR *msgName, const CHAR *cmdString) { - unsigned int uintRet; + UINT32 uintRet; errno_t err; CmdParsed cmdParsed; @@ -118,24 +125,24 @@ int ShellCmdExec(const char *msgName, const char *cmdString) PRINTK("%s:command not found\n", msgName); return -EFAULT; } else { - (void)OsCmdExec(&cmdParsed, (char *)cmdString); + (VOID)OsCmdExec(&cmdParsed, (CHAR *)cmdString); } return 0; } -unsigned int PreHandleCmdline(const char *input, char **output, unsigned int *outputlen) +UINT32 PreHandleCmdline(const CHAR *input, CHAR **output, UINT32 *outputlen) { - unsigned int shiftLen; - unsigned int ret; - const char *cmdBuf = input; - unsigned int cmdBufLen = strlen(cmdBuf); - char *shiftStr = (char *)malloc(cmdBufLen + 1); + UINT32 shiftLen; + UINT32 ret; + const CHAR *cmdBuf = input; + UINT32 cmdBufLen = strlen(cmdBuf); + CHAR *shiftStr = (CHAR *)malloc(cmdBufLen + 1); if (shiftStr == NULL) { PRINTK("malloc failure in %s[%d]\n", __FUNCTION__, __LINE__); return SH_NOK; } - (void)memset_s(shiftStr, cmdBufLen + 1, 0, cmdBufLen + 1); + (VOID)memset_s(shiftStr, cmdBufLen + 1, 0, cmdBufLen + 1); /* Call function 'OsCmdKeyShift' to squeeze and clear useless or overmuch space if string buffer */ ret = OsCmdKeyShift(cmdBuf, shiftStr, cmdBufLen + 1); @@ -156,12 +163,12 @@ END: return ret; } -static void ParseAndExecCmdline(CmdParsed *cmdParsed, const char *cmdline, unsigned int len) +static VOID ParseAndExecCmdline(CmdParsed *cmdParsed, const CHAR *cmdline, UINT32 len) { - int i; - unsigned int ret; - char *cmdlineOrigin = NULL; - char *cmdName = NULL; + INT32 i; + UINT32 ret; + CHAR *cmdlineOrigin = NULL; + CHAR *cmdName = NULL; cmdlineOrigin = strdup(cmdline); if (cmdlineOrigin == NULL) { @@ -176,13 +183,13 @@ static void ParseAndExecCmdline(CmdParsed *cmdParsed, const char *cmdline, unsig return; } - ret = OsCmdParse((char *)cmdline, cmdParsed); + ret = OsCmdParse((CHAR *)cmdline, cmdParsed); if (ret != SH_OK) { PRINTK("cmd parse failure in %s[%d]\n", __FUNCTION__, __LINE__); goto OUT; } - (void)ShellCmdExec(cmdName, cmdlineOrigin); + (VOID)ShellCmdExec(cmdName, cmdlineOrigin); OUT: for (i = 0; i < cmdParsed->paramCnt; i++) { @@ -195,11 +202,11 @@ OUT: free(cmdlineOrigin); } -LITE_OS_SEC_TEXT_MINOR void ExecCmdline(const char *cmdline) +LITE_OS_SEC_TEXT_MINOR VOID ExecCmdline(const CHAR *cmdline) { - unsigned int ret; - char *output = NULL; - unsigned int outputlen; + UINT32 ret; + CHAR *output = NULL; + UINT32 outputlen; CmdParsed cmdParsed; if (cmdline == NULL) { @@ -214,8 +221,63 @@ LITE_OS_SEC_TEXT_MINOR void ExecCmdline(const char *cmdline) return; } - (void)memset_s(&cmdParsed, sizeof(CmdParsed), 0, sizeof(CmdParsed)); + (VOID)memset_s(&cmdParsed, sizeof(CmdParsed), 0, sizeof(CmdParsed)); ParseAndExecCmdline(&cmdParsed, output, outputlen); free(output); } +#if (LOSCFG_USE_SHELL == 1) +VOID ShellTaskEntry(VOID) +{ + CHAR buf[SHELL_CMD_MAX_SIZE] = {0}; + CHAR *ptr = buf; + PRINTK("OHOS # "); + while(1) { + (VOID)LOS_EventRead(&g_shellInputEvent, 0x1, LOS_WAITMODE_AND | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER); + while((*ptr = (UINT8)UartGetc()) != 0 && *ptr != 13) { + PRINTK("%c", *ptr); + if ((ptr - buf) == (sizeof(buf) - 1)) { + break; + } + ptr++; + } + if (ptr != buf) { + if (*ptr == 13 || ((ptr - buf) == (sizeof(buf) - 1))) { + PRINTK("%c", *ptr); + *ptr = '\0'; + ptr = buf; + PRINTK("\n\r", buf); + ExecCmdline(buf); + PRINTK("OHOS # "); + } + } else { + PRINTK("\n\rOHOS # "); + } + } +} + +LITE_OS_SEC_TEXT_MINOR UINT32 LosShellInit(VOID) +{ + UINT32 ret; + UINT32 taskID1, taskID2; + TSK_INIT_PARAM_S task1 = { 0 }; + + ret = LOS_EventInit(&g_shellInputEvent); + if (ret != LOS_OK) { + PRINTK("Init shellInputEvent failed! ERROR: 0x%x\n", ret); + return ret; + } + + task1.pfnTaskEntry = (TSK_ENTRY_FUNC)ShellTaskEntry; + task1.uwStackSize = 0x1000; + task1.pcName = "ShellTaskEntry"; + task1.usTaskPrio = LOSCFG_SHELL_PRIO; + ret = LOS_TaskCreate(&taskID1, &task1); + if (ret != LOS_OK) { + PRINTK("Create Shell Task failed! ERROR: 0x%x\n", ret); + return ret; + } + + return ret; +} +#endif diff --git a/components/shell/src/cmds/task_shellcmd.c b/components/shell/src/cmds/task_shellcmd.c index 53efaad2..286fa6fe 100755 --- a/components/shell/src/cmds/task_shellcmd.c +++ b/components/shell/src/cmds/task_shellcmd.c @@ -62,7 +62,7 @@ LITE_OS_SEC_TEXT_MINOR UINT8 *OsShellCmdConvertTskStatus(UINT16 taskStatus) LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitle(VOID) { - PRINTK("\r\nName TaskEntryAddr TID "); + PRINTK("Name TaskEntryAddr TID "); PRINTK("Priority Status " "StackSize StackPoint TopOfStack"); diff --git a/kernel/include/los_config.h b/kernel/include/los_config.h index a4b768f9..467c01bc 100644 --- a/kernel/include/los_config.h +++ b/kernel/include/los_config.h @@ -781,6 +781,25 @@ extern UINT8 *m_aucSysMem0; #define LOSCFG_MPU_ENABLE 0 #endif +/*============================================================================= + shell module configuration +=============================================================================*/ +/** + * @ingroup los_config + * Configuration item for shell. + */ +#ifndef LOSCFG_USE_SHELL +#define LOSCFG_USE_SHELL 0 +#endif + +/** + * @ingroup los_config + * Configuration shell task priority. + */ +#ifndef LOSCFG_SHELL_PRIO +#define LOSCFG_SHELL_PRIO 3 +#endif + #ifdef __cplusplus #if __cplusplus }