更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
shmsg.h 文件参考

浏览源代码.

函数

UINT32 ShellMsgParse (const VOID *msg)
 命令内容解析 更多...
 
UINT32 ShellTaskInit (ShellCB *shellCB)
 给控制台注册一个shell客户端任务 更多...
 
UINT32 ShellEntryInit (ShellCB *shellCB)
 进入shell客户端任务初始化,这个任务负责编辑命令,处理命令产生的过程,例如如何处理方向键,退格键,回车键等 更多...
 
VOID ShellCmdLineParse (CHAR c, pf_OUTPUT outputFunc, ShellCB *shellCB)
 对命令行内容解析 更多...
 
UINT32 ShellMsgTypeGet (CmdParsed *cmdParsed, const CHAR *cmdType)
 获取shell消息类型 更多...
 

函数说明

◆ ShellCmdLineParse()

VOID ShellCmdLineParse ( CHAR  c,
pf_OUTPUT  outputFunc,
ShellCB shellCB 
)

对命令行内容解析

在文件 shmsg.c168 行定义.

169{
170 const CHAR ch = c;
171 INT32 ret;
172 //不是回车键和字符串结束,且偏移量为0
173 if ((shellCB->shellBufOffset == 0) && (ch != '\n') && (ch != '\0')) {
174 (VOID)memset_s(shellCB->shellBuf, SHOW_MAX_LEN, 0, SHOW_MAX_LEN);//重置buf
175 }
176 //遇到回车或换行
177 if ((ch == '\r') || (ch == '\n')) {
178 if (shellCB->shellBufOffset < (SHOW_MAX_LEN - 1)) {
179 shellCB->shellBuf[shellCB->shellBufOffset] = '\0';//字符串结束
180 }
181 shellCB->shellBufOffset = 0;
182 (VOID)pthread_mutex_lock(&shellCB->keyMutex);
183 OsShellCmdPush(shellCB->shellBuf, shellCB->cmdKeyLink);//解析回车或换行
184 (VOID)pthread_mutex_unlock(&shellCB->keyMutex);
185 ShellNotify(shellCB);//通知任务解析shell命令
186 return;
187 } else if ((ch == '\b') || (ch == 0x7F)) { /* backspace or delete(0x7F) */ //遇到删除键
188 if ((shellCB->shellBufOffset > 0) && (shellCB->shellBufOffset < (SHOW_MAX_LEN - 1))) {
189 shellCB->shellBuf[shellCB->shellBufOffset - 1] = '\0';//填充`\0`
190 shellCB->shellBufOffset--;//buf减少
191 outputFunc("\b \b");//回调入参函数
192 }
193 return;
194 } else if (ch == 0x09) { /* 0x09: tab *///遇到tab键
195 if ((shellCB->shellBufOffset > 0) && (shellCB->shellBufOffset < (SHOW_MAX_LEN - 1))) {
196 ret = OsTabCompletion(shellCB->shellBuf, &shellCB->shellBufOffset);//解析tab键
197 if (ret > 1) {
198 outputFunc("OHOS # %s", shellCB->shellBuf);//回调入参函数
199 }
200 }
201 return;
202 }
203 /* parse the up/down/right/left key */
204 ret = ShellCmdLineCheckUDRL(ch, shellCB);//解析上下左右键
205 if (ret == LOS_OK) {
206 return;
207 }
208
209 if ((ch != '\n') && (ch != '\0')) {//普通的字符的处理
210 if (shellCB->shellBufOffset < (SHOW_MAX_LEN - 1)) {//buf范围
211 shellCB->shellBuf[shellCB->shellBufOffset] = ch;//直接加入
212 } else {
213 shellCB->shellBuf[SHOW_MAX_LEN - 1] = '\0';//加入字符串结束符
214 }
215 shellCB->shellBufOffset++;//偏移量增加
216 outputFunc("%c", ch);//向终端输出字符
217 }
218
219 shellCB->shellKeyType = STAT_NORMAL_KEY;//普通字符
220}
void OsShellCmdPush(const char *string, CmdKeyLink *cmdKeyLink)
将shell命令 string 以 CmdKeyLink 方式加入链表
Definition: shcmd.c:514
int OsTabCompletion(char *cmdKey, unsigned int *len)
tab键
Definition: shcmd.c:452
int ShellNotify(ShellCB *shellCB)
Definition: shmsg.c:126
@ STAT_NORMAL_KEY
普通按键
Definition: shmsg.c:136
signed int INT32
Definition: los_typedef.h:60
char CHAR
Definition: los_typedef.h:63
int pthread_mutex_lock(pthread_mutex_t *mutex)
互斥锁加锁操作
int pthread_mutex_unlock(pthread_mutex_t *mutex)
解锁互斥锁
STATIC INT32 ShellCmdLineCheckUDRL(const CHAR ch, ShellCB *shellCB)
Definition: shmsg.c:131
char shellBuf[SHOW_MAX_LEN]
接受shell命令 buf大小
Definition: shell.h:83
void * cmdKeyLink
命令链表,所有敲过的命令链表
Definition: shell.h:75
unsigned int shellBufOffset
buf偏移量
Definition: shell.h:78
unsigned int shellKeyType
按键类型
Definition: shell.h:79
pthread_mutex_t keyMutex
操作cmdKeyLink的互斥量
Definition: shell.h:81
函数调用图:

◆ ShellEntryInit()

UINT32 ShellEntryInit ( ShellCB shellCB)

进入shell客户端任务初始化,这个任务负责编辑命令,处理命令产生的过程,例如如何处理方向键,退格键,回车键等

在文件 shmsg.c450 行定义.

451{
452 UINT32 ret;
453 CHAR *name = NULL;
454 TSK_INIT_PARAM_S initParam = {0};
455
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;
460 } else {
461 return LOS_NOK;
462 }
463
464 initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)ShellEntry;//任务入口函数
465 initParam.usTaskPrio = 9; /* 9:shell task priority */
466 initParam.auwArgs[0] = (UINTPTR)shellCB;
467 initParam.uwStackSize = 0x1000;
468 initParam.pcName = name; //任务名称
469 initParam.uwResved = LOS_TASK_STATUS_DETACHED;
470
471 ret = LOS_TaskCreate(&shellCB->shellEntryHandle, &initParam);//创建shell任务
472#ifdef LOSCFG_PLATFORM_CONSOLE
473 (VOID)ConsoleTaskReg((INT32)shellCB->consoleID, shellCB->shellEntryHandle);//将shell注册到控制台
474#endif
475
476 return ret;
477}
void ShellEntry(ShellCB *shellCB)
Definition: shmsg.c:659
INT32 ConsoleTaskReg(INT32 consoleID, UINT32 taskID)
任务注册控制台,每个shell任务都有属于自己的控制台
Definition: console.c:1454
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *initParam)
创建任务,并使该任务进入ready状态,如果就绪队列中没有更高优先级的任务,则运行该任务
Definition: los_task.c:718
VOID *(* TSK_ENTRY_FUNC)(UINTPTR param1, UINTPTR param2, UINTPTR param3, UINTPTR param4)
Define the type of a task entrance function.
Definition: los_task.h:480
unsigned long UINTPTR
Definition: los_typedef.h:68
unsigned int UINT32
Definition: los_typedef.h:57
unsigned int consoleID
控制台ID
Definition: shell.h:72
pthread_t shellEntryHandle
shell客户端任务
Definition: shell.h:74
UINT16 usTaskPrio
Definition: los_task.h:505
UINTPTR auwArgs[4]
Definition: los_task.h:507
UINT32 uwStackSize
Definition: los_task.h:508
CHAR * pcName
Definition: los_task.h:509
TSK_ENTRY_FUNC pfnTaskEntry
Definition: los_task.h:504
UINT32 uwResved
Definition: los_task.h:513
函数调用图:
这是这个函数的调用关系图:

◆ ShellMsgParse()

UINT32 ShellMsgParse ( const VOID *  msg)

命令内容解析

在文件 shmsg.c289 行定义.

290{
291 CHAR *output = NULL;
292 UINT32 len, cmdLen, newLen;
293 CmdParsed cmdParsed;
294 UINT32 ret = OS_INVALID;
295 CHAR *buf = (CHAR *)msg;
296 CHAR *newMsg = NULL;
297 CHAR *cmd = "exec";
298
299 if (msg == NULL) {
300 goto END;
301 }
302
303 len = strlen(msg);
304 /* 2: strlen("./") */
305 if ((len > 2) && (buf[0] == '.') && (buf[1] == '/')) {
306 cmdLen = strlen(cmd);
307 newLen = len + 1 + cmdLen + 1;
308 newMsg = (CHAR *)LOS_MemAlloc(m_aucSysMem0, newLen);
309 if (newMsg == NULL) {
310 PRINTK("malloc failure in %s[%d]\n", __FUNCTION__, __LINE__);
311 goto END;
312 }
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);
316 msg = newMsg;
317 len = newLen - 1;
318 }
319 output = (CHAR *)LOS_MemAlloc(m_aucSysMem0, len + 1);
320 if (output == NULL) {
321 PRINTK("malloc failure in %s[%d]\n", __FUNCTION__, __LINE__);
322 goto END;
323 }//对字符串缓冲区,调用函数“OsCmdKeyShift”来挤压和清除无用或过多的空间
324 /* Call function 'OsCmdKeyShift' to squeeze and clear useless or overmuch space if string buffer */
325 ret = OsCmdKeyShift((CHAR *)msg, output, len + 1);
326 if ((ret != LOS_OK) || (strlen(output) == 0)) {
327 ret = OS_INVALID;
328 goto END_FREE_OUTPUT;
329 }
330
331 (VOID)memset_s(&cmdParsed, sizeof(CmdParsed), 0, sizeof(CmdParsed));
332
333 ret = ShellMsgNameGetAndExec(&cmdParsed, output, len);////获取命令名称和参数,并执行
334
335END_FREE_OUTPUT:
336 (VOID)LOS_MemFree(m_aucSysMem0, output);
337END:
338 if (newMsg != NULL) {
339 (VOID)LOS_MemFree(m_aucSysMem0, newMsg);
340 }
341 return ret;
342}
unsigned int OsCmdKeyShift(const char *cmdKey, char *cmdOut, unsigned int size)
Definition: shcmd.c:386
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
Definition: los_memory.c:1123
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
Definition: los_memory.c:1369
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
Definition: los_memory.c:107
STATIC UINT32 ShellMsgNameGetAndExec(CmdParsed *cmdParsed, const CHAR *output, UINT32 len)
获取命令名称和参数,并执行
Definition: shmsg.c:247
函数调用图:
这是这个函数的调用关系图:

◆ ShellMsgTypeGet()

UINT32 ShellMsgTypeGet ( CmdParsed cmdParsed,
const CHAR cmdType 
)

获取shell消息类型

在文件 shmsg.c222 行定义.

223{
224 CmdItemNode *curCmdItem = (CmdItemNode *)NULL;
225 UINT32 len;
226 UINT32 minLen;
227 CmdModInfo *cmdInfo = OsCmdInfoGet();//获取全局变量
228
229 if ((cmdParsed == NULL) || (cmdType == NULL)) {
230 return OS_INVALID;
231 }
232
233 len = strlen(cmdType);
234 LOS_DL_LIST_FOR_EACH_ENTRY(curCmdItem, &(cmdInfo->cmdList.list), CmdItemNode, list) {
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);
239 cmdParsed->cmdType = curCmdItem->cmd->cmdType;
240 return LOS_OK;
241 }
242 }
243
244 return OS_INVALID;
245}
CmdModInfo * OsCmdInfoGet(VOID)
获取全局变量
Definition: shcmd.c:52
const CHAR * cmdKey
命令关键字,例如:ls 函数在Shell中访问的名称。
Definition: shcmd.h:57
CmdType cmdType
Definition: shcmd.h:54
CmdItem * cmd
命令项
Definition: shcmd.h:64
LOS_DL_LIST list
双向链表
Definition: shcmd.h:63
CmdItemNode cmdList
命令项节点
Definition: shcmd.h:69
char cmdKeyword[CMD_KEY_LEN]
Definition: shcmdparse.h:50
CmdType cmdType
Definition: shcmdparse.h:49
函数调用图:
这是这个函数的调用关系图:

◆ ShellTaskInit()

UINT32 ShellTaskInit ( ShellCB shellCB)

给控制台注册一个shell客户端任务

在文件 shmsg.c628 行定义.

函数调用图: