適用stm32的命令列直譯器shell

2021-09-10 01:15:32 字數 3065 閱讀 3038

使用這個庫的基本功能只需要把 shell.c 、shell.h 、ustdio.c 、ustdio.h 和 kernel.h 這幾個檔案包含進檔案工程裡面即可。系統的使用可以大致分為以下幾個步驟:

0.初始化硬體部分。

1.編寫硬體對應的void puts(char * buf , uint16_t len) 傳送函式。

2.shell_init(sign,puts)初始化輸入標誌和預設輸出。

3.新建乙個互動shellx 並初始化shell_input_init(&shellx,puts);

4.接收到一包資料後,呼叫shell_input(&shellx,buf,len)

以下用stm32cubemx新建串列埠工程實際說明。mcu選擇為stm32f103vet6;

配置 sys -> debug 為 serial wire :

配置 rcc -> hse 為 crystal ,

配置 usart1 -> mode 為 asynchronization ,並開啟usart1 的中斷:

調整時鐘為外部晶振,其餘配置保留原始值即可:

最後生成mdk-keil5 工程。把 shell.c 、ustdio.c 複製到工程資料夾 src 中,並加入檔案, containerof.h、shell.h、ustdio.h複製到 inc 資料夾中。

接下來需要編寫串列埠的傳送函式,型別如下:

void puts(char *data,uint16_t len) ,

為了方便此處在main.c下編寫,內容如下:

目前這個庫提供了兩個巨集定義來實現使用者命令的註冊,分別是

shell_register_command(name,func);

shell_register_confirm(name,func,info);

shell_register_command用於一般的命令註冊,name為命令字元,如「reboot」,需要注意的是,同一串字串不能註冊多次,即不能註冊同一條命令多次,以先到先得的原則會只註冊第一條。func為命令對應的執行**,型別為

void  cmd_fn(void * arg);
其中輸入形參void * arg 為命令列的輸入記憶體指標。以hello-world命令為例,編寫對應的執行**:

void helloworld(void * arg)

然後在main()函式呼叫註冊:

shell_register_command(「hello-world」,helloworld);

便可以在cmd-list裡面找到對應的命令,在終端輸入hello-world,會反饋列印內容。此外還有另外一種帶確認資訊的註冊方式:

shell_register_confirm (「hello-world2」,helloworld,「sure to test this command?」);

這種方式在輸入命令以後需要輸入[y/y/n/n]確認命令執行。如下

上文提到,命令對應的執行函式型別為

void  cmd_fn(void * arg);
其中的void * arg是把命令列記憶體首位址傳入,如在終端輸入"hello-world 1234" 回車,shell會先匹配到 helloworld 對應的執行**,並把整串輸入字串的首位址作為arg輸入給函式,使用者可對此進行引數解析。當前庫提供兩個函式用於解析命令列引數

int  cmdline_param (char * str,int * ar**,uint32_t maxread);

int cmdline_strtok(char * str ,char ** ar**,uint32_t maxread);

cmdline_param()可以把命令列後面所跟引數轉為整形資料,不過僅支援整形的轉換,包括正負數和十六進製制,轉換結果儲存於 ar** 內,字串轉換正常返回引數個數,有非數字字元會返回<0。大致如下:

void demo_cmd(void * arg)

cmdline_strtok()是對命令列的輸入字串進行分割,把輸入分割為一串指標陣列輸出到ar**中。需要注意的是這個函式會改變命令列的輸入記憶體內容(把空格替換了字串結束符)。如下

void demo2_cmd(void * arg)

然後註冊命令測試

shell_register_command(「param2int」,demo_cmd);

shell_register_command(「param-get」,demo2_cmd);

執行結果如下:

利用 cmdline_strtok() ,可以實現linux 的 getopt() 選項輸入支援。由於getopt() 是gnuc的庫,所以上述庫還收錄了 getopt() 的原始碼,有需要的可以把getopt.c和getopt.h加入工程便可使用getopt()函式進行輸入選項分類,**如下:

void demo3_cmd(void * arg)

}}

shell 命令列直譯器

shell 命令列直譯器 dash bash 軟體,是shell的一種 root 超級使用者,不受限制 linux是乙個多工,多使用者作業系統。linux許可權管理 linux對每乙個檔案都進行許可權管理 1.檔案許可權管理 u 檔案的許可權是針對使用者的許可權,使用者分了三類 g 檔案所有者 這個...

將Lua直譯器移植到STM32

這是我第一次寫部落格,當然在這之前已經學了會兒微控制器和c語言,這兩天突然有乙個新想法 把lua移植到stm32上去,網上搜了一下,好像非常簡單,所以我就立馬開始嘗試。到 lua官網 lua 5.3.2 的 先是用gcc編譯了乙個lua直譯器試試手,熟悉下lua語法,然後又在vs2015下建了工程 ...

簡單shell命令列直譯器 (二)

cp 舊檔名 新檔名 在當前目錄中拷貝 cp 檔名 路徑 將當前目錄中的檔案拷貝到指定的資料夾,檔名可改可不改 cp 絕對路徑 檔名 路徑 絕對路徑 cp i 舊檔名 新檔名 若同名確認提示 cp r 目錄 新目錄 把乙個目錄拷貝到指定路徑 bogon desktop nn cp r test he...