74 if ((
string == NULL) || (strlen(
string) == 0)) {
79 if (cmdHistory->
count != 0) {
81 if (strcmp(
string, cmdNxt->
cmdString) == 0) {
88 if (cmdHistory->
count == CMD_HISTORY_LEN) {
137 }
else if (ch == 0x5b) {
142 }
else if (ch == 0x41) {
148 }
else if (ch == 0x42) {
154 }
else if (ch == 0x43) {
159 }
else if (ch == 0x44) {
173 if ((shellCB->
shellBufOffset == 0) && (ch !=
'\n') && (ch !=
'\0')) {
174 (VOID)memset_s(shellCB->
shellBuf, SHOW_MAX_LEN, 0, SHOW_MAX_LEN);
177 if ((ch ==
'\r') || (ch ==
'\n')) {
187 }
else if ((ch ==
'\b') || (ch == 0x7F)) {
194 }
else if (ch == 0x09) {
198 outputFunc(
"OHOS # %s", shellCB->
shellBuf);
209 if ((ch !=
'\n') && (ch !=
'\0')) {
213 shellCB->
shellBuf[SHOW_MAX_LEN - 1] =
'\0';
216 outputFunc(
"%c", ch);
229 if ((cmdParsed == NULL) || (cmdType == NULL)) {
233 len = strlen(cmdType);
235 if ((len == strlen(curCmdItem->
cmd->
cmdKey)) &&
236 (strncmp((
CHAR *)(curCmdItem->
cmd->
cmdKey), cmdType, len) == 0)) {
237 minLen = (len < CMD_KEY_LEN) ? len : CMD_KEY_LEN;
238 (VOID)memcpy_s((
CHAR *)(cmdParsed->
cmdKeyword), CMD_KEY_LEN, cmdType, minLen);
251 const CHAR *tmpStr = NULL;
254 if (msgName == NULL) {
255 PRINTK(
"malloc failure in %s[%d]\n", __FUNCTION__, __LINE__);
260 for (tmpStr = output, loop = 0; (*tmpStr !=
'\0') && (loop < len);) {
262 if (*tmpStr ==
'\"') {
263 SWITCH_QUOTES_STATUS(quotes);
270 if ((*tmpStr ==
' ') && (QUOTES_STATUS_CLOSE(quotes))) {
273 msgName[loop] = *tmpStr++;
276 msgName[loop] =
'\0';
281 PRINTK(
"%s:command not found", msgName);
292 UINT32 len, cmdLen, newLen;
305 if ((len > 2) && (buf[0] ==
'.') && (buf[1] ==
'/')) {
306 cmdLen = strlen(cmd);
307 newLen = len + 1 + cmdLen + 1;
309 if (newMsg == NULL) {
310 PRINTK(
"malloc failure in %s[%d]\n", __FUNCTION__, __LINE__);
313 (VOID)memcpy_s(newMsg, newLen, cmd, cmdLen);
314 newMsg[cmdLen] =
' ';
315 (VOID)memcpy_s(newMsg + cmdLen + 1, newLen - cmdLen - 1, (
CHAR *)msg + 1, len);
320 if (output == NULL) {
321 PRINTK(
"malloc failure in %s[%d]\n", __FUNCTION__, __LINE__);
326 if ((ret != LOS_OK) || (strlen(output) == 0)) {
328 goto END_FREE_OUTPUT;
338 if (newMsg != NULL) {
352 if (consoleCB == NULL) {
353 PRINT_ERR(
"Shell task init error!\n");
357 (VOID)memset_s(shellCB->
shellBuf, SHOW_MAX_LEN, 0, SHOW_MAX_LEN);
360#ifdef LOSCFG_PLATFORM_CONSOLE
364 n = read(consoleCB->
fd, &ch, 1);
371#ifdef LOSCFG_PLATFORM_CONSOLE
406 0xFFF, LOS_WAITMODE_OR | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER);
407 if (ret == SHELL_CMD_PARSE_EVENT) {
409 }
else if (ret == CONSOLE_SHELL_KEY_EVENT) {
420#define SERIAL_SHELL_TASK_NAME "SerialShellTask"
421#define SERIAL_ENTRY_TASK_NAME "SerialEntryTask"
422#define TELNET_SHELL_TASK_NAME "TelnetShellTask"
423#define TELNET_ENTRY_TASK_NAME "TelnetEntryTask"
430 if (shellCB->
consoleID == CONSOLE_SERIAL) {
431 name = SERIAL_SHELL_TASK_NAME;
432 }
else if (shellCB->
consoleID == CONSOLE_TELNET) {
433 name = TELNET_SHELL_TASK_NAME;
443 initParam.
uwResved = LOS_TASK_STATUS_DETACHED;
456 if (shellCB->
consoleID == CONSOLE_SERIAL) {
457 name = SERIAL_ENTRY_TASK_NAME;
458 }
else if (shellCB->
consoleID == CONSOLE_TELNET) {
459 name = TELNET_ENTRY_TASK_NAME;
469 initParam.
uwResved = LOS_TASK_STATUS_DETACHED;
472#ifdef LOSCFG_PLATFORM_CONSOLE
unsigned int OsCmdExec(CmdParsed *cmdParsed, char *cmdStr)
执行命令,shell是运行程序的程序.
void OsShellHistoryShow(unsigned int value, ShellCB *shellCB)
显示shell命令历史记录,支持上下键方式
void OsShellCmdPush(const char *string, CmdKeyLink *cmdKeyLink)
将shell命令 string 以 CmdKeyLink 方式加入链表
int OsTabCompletion(char *cmdKey, unsigned int *len)
tab键
void OsShellKeyDeInit(CmdKeyLink *cmdKeyLink)
shell的析构函数
unsigned int OsCmdKeyShift(const char *cmdKey, char *cmdOut, unsigned int size)
void * ShellTask(void *argv)
void ShellEntry(ShellCB *shellCB)
int ShellTaskInit(ShellCB *shellCB)
给控制台注册一个shell客户端任务
void ShellCmdLineParse(char c, OutputFunc outputFunc, ShellCB *shellCB)
int ShellNotify(ShellCB *shellCB)
@ STAT_ESC_KEY
<ESC>键,支持VT规范
@ STAT_MULTI_KEY
组合键 例如: <ESC>[30m
INT32 ConsoleTaskReg(INT32 consoleID, UINT32 taskID)
任务注册控制台,每个shell任务都有属于自己的控制台
BOOL is_nonblock(const CONSOLE_CB *consoleCB)
BOOL IsConsoleOccupied(const CONSOLE_CB *consoleCB)
控制台是否被占用
CONSOLE_CB * OsGetConsoleByID(INT32 consoleID)
获取参数控制台ID 获取对应的控制台控制块(描述符)
LITE_OS_SEC_TEXT_MINOR VOID LOS_Msleep(UINT32 msecs)
Sleep the current task.
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventDestroy(PEVENT_CB_S eventCB)
销毁指定的事件控制块
LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeout)
读取指定事件类型,超时时间为相对时间:单位为Tick
LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events)
写指定的事件类型
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB)
初始化一个事件控制块
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListTailInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a node to the tail of a doubly linked list.
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
void dprintf(const char *fmt,...)
Format and print data.
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *initParam)
创建任务,并使该任务进入ready状态,如果就绪队列中没有更高优先级的任务,则运行该任务
VOID *(* TSK_ENTRY_FUNC)(UINTPTR param1, UINTPTR param2, UINTPTR param3, UINTPTR param4)
Define the type of a task entrance function.
双向链表由内联函数实现 http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-apx-dll....
VOID(* pf_OUTPUT)(const CHAR *fmt,...)
int pthread_mutex_lock(pthread_mutex_t *mutex)
互斥锁加锁操作
int pthread_mutex_unlock(pthread_mutex_t *mutex)
解锁互斥锁
CmdModInfo * OsCmdInfoGet(VOID)
获取全局变量
STATIC UINT32 ShellMsgNameGetAndExec(CmdParsed *cmdParsed, const CHAR *output, UINT32 len)
获取命令名称和参数,并执行
CHAR * ShellGetInputBuf(ShellCB *shellCB)
STATIC VOID ShellSaveHistoryCmd(const CHAR *string, ShellCB *shellCB)
保存命令历史记录,这个函数写的不太好
LITE_OS_SEC_TEXT_MINOR UINT32 ShellMsgParse(const VOID *msg)
命令内容解析
LITE_OS_SEC_TEXT_MINOR UINT32 ShellEntryInit(ShellCB *shellCB)
进入shell客户端任务初始化,这个任务负责编辑命令,处理命令产生的过程,例如如何处理方向键,退格键,回车键等
STATIC VOID ShellCmdProcess(ShellCB *shellCB)
STATIC INT32 ShellCmdLineCheckUDRL(const CHAR ch, ShellCB *shellCB)
LITE_OS_SEC_TEXT_MINOR UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR *cmdType)
获取shell消息类型
const CHAR * cmdKey
命令关键字,例如:ls 函数在Shell中访问的名称。
char cmdString[0]
字符串,可变数组的一种实现方式.
char cmdKeyword[CMD_KEY_LEN]
char shellBuf[SHOW_MAX_LEN]
接受shell命令 buf大小
unsigned int consoleID
控制台ID
pthread_t shellEntryHandle
shell客户端任务
EVENT_CB_S shellEvent
事件类型触发
void * cmdKeyLink
命令链表,所有敲过的命令链表
void * cmdHistoryKeyLink
命令的历史记录链表,去重,10个
unsigned int shellBufOffset
buf偏移量
pthread_mutex_t historyMutex
操作cmdHistoryKeyLink的互斥量
void * cmdMaskKeyLink
主要用于方向键上下遍历历史命令
unsigned int shellKeyType
按键类型
pthread_mutex_t keyMutex
操作cmdKeyLink的互斥量
pthread_t shellTaskHandle
shell服务端任务
TSK_ENTRY_FUNC pfnTaskEntry