天天看點

【LiteOS】第 3 章

基本知識

靜态注冊指令使用 ​

​SHELLCMD_ENTRY​

​ 接口。

第一個入參:指令變量名,用于設定連結選項(build/mk/liteos_tables_ldflags.mk的LITEOS_TABLES_LDFLAGS變量)。例如變量名為ls_shellcmd,連結選項就應該設定為:LITEOS_TABLES_LDFLAGS += -uls_shellcmd。這個入參是靜态注冊獨有的,動态注冊中沒有這個入參。
第二個入參:指令類型,目前支援兩種指令類型。
  CMD_TYPE_EX:不支援标準指令參數輸入,會把使用者填寫的指令關鍵字屏蔽掉。例如:輸入ls /ramfs,傳入給指令處理函數的參數隻有/ramfs,對應于指令處理函數中的argv[0],而ls指令關鍵字并不會被傳入。
  CMD_TYPE_STD:支援的标準指令參數輸入,所有輸入的字元都會通過指令解析後被傳入。例如:輸入ls /ramfs,ls和/ramfs都會被傳入指令處理函數,分别對應于指令處理函數中的argv[0]和argv[1]。
第三個入參:指令關鍵字,是指令處理函數在Shell中對應的名稱。指令關鍵字必須唯一,即兩個不同的指令項不能有相同的指令關鍵字,否則隻會執行其中一個。Shell在執行使用者指令時,如果存在多個指令關鍵字相同的指令,隻會執行在“help”指令中排在最前面的那個。
第四個入參:指令處理函數的入參最大個數。
  靜态注冊指令暫不支援設定。
  動态注冊指令支援設定不超過32的入參最大個數,或者設定為XARGS(其在代碼中被定義為0xffffffff)表示不限制參數個數。
第五個入參:指令處理函數名,即在Shell中執行指令時被調用的函數。      

實戰環節

靜态注冊一個 shell 指令

僅列印輸出提示資訊。

  1. 建立 hello_shell.c 檔案
LiteOS/shell/src/cmds/hello_shell.c
#include "shell.h"
#include "shcmd.h"

INT32 OsShellCmdHello(INT32 argc, const CHAR **argv)
{
    printf("hello jiaming!\n");
    return 0;
}

SHELLCMD_ENTRY(hello_shellcmd, CMD_TYPE_STD, "hello", XARGS, (CmdCallBackFunc)OsShellCmdHello); // 接口      
  1. 在連結選項中添加連結該新增指令項參數
LiteOS/build/mk/liteos_tables_ldflags.mk