色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個小而美的嵌入式shell - letter shell

嵌入式大雜燴 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-06-10 15:11 ? 次閱讀

源碼地址:https://github.com/NevermindZZT/letter-shell

1 Letter shell簡介

熟悉Linux的朋友的都知道,shell包裹在內核之外的人機交互界面,用于用戶和內核之間打交道的功能,類似于windows CMD。 通過Shell將輸入的命令與內核通訊,好讓內核可以控制硬件開正確無誤的操作工作。Shell有著不同的分類,比如Bourne shell(sh),Korn shell(ksh)、C shell (csh)、Bourne-again shell(bash)、tcsh。其中最常用的有csh和bash。Shell本身是一個用C語言編寫的程序,它是用戶使用Unix/Linux的橋梁,用戶的大部分工作都是通過Shell完成的。

然而在嵌入式中,由于資源有限,自然很少使用shell,但隨著MCU的資源越來越豐富,一些適用于嵌入式的shell工具也就問世了,本問將要介紹的是Letter shell,Letter shell是一個體積極小的嵌入式shell,當前最新版本是3.X。

F:\\File\\嵌入式項目\\1 工具\\一個小而美的嵌入式shell - letter shell\\源碼\\letter-shell\\doc\\img\\shell_info.png

Letter shell有如下功能:

  • 命令自動補全,使用TAB鍵補全命令
  • 命令幫助,使用help [command]顯示命令幫助
  • 幫助補全,輸入命令后雙擊TAB鍵補全命令幫助指令
  • 快捷鍵,支持使用CTRL+A~Z組合按鍵直接調用函數
  • shell變量,支持在shell中查看和修改變量值,支持變量作為命令參數
  • 登錄密碼,支持在shell中使用登錄密碼,支持超時自動鎖定

2 Letter shell移植

Shell是一個命令行交互式形式存在,那最常規的就是使用MCU的串口資源了,當然也可使用USB模擬的虛擬串口。

Letter shell的移植比較簡單,既然需要占用串口資源,那么首先要準備一個裸機工程,該工程需要事先串口的收發,關于串口的實現請參看逼著文章:

標準庫:https://bruceou.blog.csdn.net/article/details/79341769

HAL庫:https://bruceou.blog.csdn.net/article/details/109190370

筆者本文以標準庫為例講解。

1.復制源碼

首先下載letter-shell,然后在工程中新建Letter_shell目錄,將letter-shell目錄下的src的文件復制到工程目錄Middlewares/Letter_shell中。

C:\\Users\\BruceOu\\Desktop\\1.png

2.新建接口文件

在工程用戶目錄下新建shell_port.c和shell_port.h文件,當然也可以放在User目錄。

3.配置工程

打開Keil,添加相應的文件。

1686380797023qlrrgj4bab

然后添加相應的頭文件路徑。

168638079732110406rx2s2

接下來就是實現Letter shell的收發。

發送代碼如下:

/**
 * @brief 用戶shell寫
 * 
 * @param data 數據
 */
void userShellWrite(char data)
{
    USART_SendData(USART1, (uint8_t) data);
    /* 等待發送完畢 */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);		
}

接收采用中斷的方式,代碼如下:

/**
  * @brief  This function handles USART1 Handler.
  * @param  None
  * @retval None
  */
void USART1_IRQHandler(void)
{
    uint8_t ch;  //接收中斷緩沖

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
      ch = USART_ReceiveData(USART1);

      //ch = USART1- >DR;
      //調用shell處理數據的接口
      shellHandler(&shell, ch);
    } 
}

還需要實現Letter shell初始化接口。

/**
 * @brief 用戶shell初始化
 * 
 */
void userShellInit(void)
{
    shell.write = userShellWrite;
    shellInit(&shell, shellBuffer, 512);
}

最后在主函數中初始化即可。

/**
  * @brief  mian
  * @param  None
  * @retval int
  */
int main(void)
{
    /* 配置SysTick 為10us中斷一次 */
    SysTick_Init();

    /* USART1 配置模式為 115200 8-N-1,中斷接收 */
    USART1_Config();

    userShellInit();

    for(;;)
    {
        Delay_ms(50);
    }
}

好了,這就移植完成了,編譯、下載,連接串口1,使用xshell等工具,打印信息如下:

1686380797656v36x5l4oy3

很簡單吧。

3 Letter shell應用

3.1 Letter shell宏定義

在開發Letter shell應用前,需要知道Letter shell的宏定義,其宏定義在shell_cfg.h文件。

#ifndef __SHELL_CFG_H__
#define __SHELL_CFG_H__


/**
 * @brief 是否使用默認shell任務while循環,使能宏`SHELL_USING_TASK`后此宏有意義
 *        使能此宏,則`shellTask()`函數會一直循環讀取輸入,一般使用操作系統建立shell
 *        任務時使能此宏,關閉此宏的情況下,一般適用于無操作系統,在主循環中調用`shellTask()`
 */
#define     SHELL_TASK_WHILE            1

/**
 * @brief 是否使用命令導出方式
 *        使能此宏后,可以使用`SHELL_EXPORT_CMD()`等導出命令
 *        定義shell命令,關閉此宏的情況下,需要使用命令表的方式
 */
#define     SHELL_USING_CMD_EXPORT      1

/**
 * @brief 是否使用shell伴生對象
 *        一些擴展的組件(文件系統支持,日志工具等)需要使用伴生對象
 */
#define     SHELL_USING_COMPANION       0

/**
 * @brief 支持shell尾行模式
 */
#define     SHELL_SUPPORT_END_LINE      0

/**
 * @brief 是否在輸出命令列表中列出用戶
 */
#define     SHELL_HELP_LIST_USER        0

/**
 * @brief 是否在輸出命令列表中列出變量
 */
#define     SHELL_HELP_LIST_VAR         0

/**
 * @brief 是否在輸出命令列表中列出按鍵
 */
#define     SHELL_HELP_LIST_KEY         0

/**
 * @brief 是否在輸出命令列表中展示命令權限
 */
#define     SHELL_HELP_SHOW_PERMISSION  1

/**
 * @brief 使用LF作為命令行回車觸發
 *        可以和SHELL_ENTER_CR同時開啟
 */
#define     SHELL_ENTER_LF              1

/**
 * @brief 使用CR作為命令行回車觸發
 *        可以和SHELL_ENTER_LF同時開啟
 */
#define     SHELL_ENTER_CR              1

/**
 * @brief 使用CRLF作為命令行回車觸發
 *        不可以和SHELL_ENTER_LF或SHELL_ENTER_CR同時開啟
 */
#define     SHELL_ENTER_CRLF            0

/**
 * @brief 使用執行未導出函數的功能
 *        啟用后,可以通過`exec [addr] [args]`直接執行對應地址的函數
 * @attention 如果地址錯誤,可能會直接引起程序崩潰
 */
#define     SHELL_EXEC_UNDEF_FUNC       0

/**
 * @brief shell命令參數最大數量
 *        包含命令名在內,超過8個參數并且使用了參數自動轉換的情況下,需要修改源碼
 */
#define     SHELL_PARAMETER_MAX_NUMBER  8

/**
 * @brief 歷史命令記錄數量
 */
#define     SHELL_HISTORY_MAX_NUMBER    5

/**
 * @brief 雙擊間隔(ms)
 *        使能宏`SHELL_LONG_HELP`后此宏生效,定義雙擊tab補全help的時間間隔
 */
#define     SHELL_DOUBLE_CLICK_TIME     200

/**
 * @brief 管理的最大shell數量
 */
#define     SHELL_MAX_NUMBER            5

/**
 * @brief shell格式化輸出的緩沖大小
 *        為0時不使用shell格式化輸出
 */
#define     SHELL_PRINT_BUFFER          128

/**
 * @brief shell格式化輸入的緩沖大小
 *        為0時不使用shell格式化輸入
 * @note shell格式化輸入會阻塞shellTask, 僅適用于在有操作系統的情況下使用
 */
#define     SHELL_SCAN_BUFFER          0

/**
 * @brief 獲取系統時間(ms)
 *        定義此宏為獲取系統Tick,如`HAL_GetTick()`
 * @note 此宏不定義時無法使用雙擊tab補全命令help,無法使用shell超時鎖定
 */
#define     SHELL_GET_TICK()            0

/**
 * @brief shell內存分配
 *        shell本身不需要此接口,若使用shell伴生對象,需要進行定義
 */
#define     SHELL_MALLOC(size)          0

/**
 * @brief shell內存釋放
 *        shell本身不需要此接口,若使用shell伴生對象,需要進行定義
 */
#define     SHELL_FREE(obj)             0

/**
 * @brief 是否顯示shell信息
 */
#define     SHELL_SHOW_INFO             1

/**
 * @brief 是否在登錄后清除命令行
 */
#define     SHELL_CLS_WHEN_LOGIN        1

/**
 * @brief shell默認用戶
 */
#define     SHELL_DEFAULT_USER          "letter"

/**
 * @brief shell默認用戶密碼
 *        若默認用戶不需要密碼,設為""
 */
#define     SHELL_DEFAULT_USER_PASSWORD ""

/**
 * @brief shell自動鎖定超時
 *        shell當前用戶密碼有效的時候生效,超時后會自動重新鎖定shell
 *        設置為0時關閉自動鎖定功能,時間單位為`SHELL_GET_TICK()`單位
 * @note 使用超時鎖定必須保證`SHELL_GET_TICK()`有效
 */
#define     SHELL_LOCK_TIMEOUT          0 * 60 * 1000

#endif

shell_cfg.h文件已經注釋了,筆者就不再贅述了。

3.2 Letter shell內置命令

在 Letter shell中默認內置了一些 shell命令,在 shell中輸入 help 后回車或者直接按下 Tab 鍵,就可以打印當前系統支持的所有命令。

按下 Tab 鍵后可以列出當前支持的所有命令。以下為按下 Tab 鍵后打印出來的當前支持的所有顯示Letter shell中的命令,左邊是命令名稱,右邊是關于命令的描述:

168638079794723wdssedte

  • 自定義 shell命令

自定義的 shell命令,可以在 shell模式下被運行,將一個命令導出到 shell模式可以使用如下宏接口:

SHELL_EXPORT_CMD(_attr, _name, _func, _desc)

參數 描述
_attr 命令屬性
_name 命令名
_func 命令函數
_desc 命令描述

原型如下:

#define SHELL_EXPORT_CMD(_attr, _name, _func, _desc) \\
				const char shellCmd##_name[] = #_name; \\
				const char shellDesc##_name[] = #_desc; \\
				const ShellCommand \\
				shellCommand##_name SECTION("shellCommand") =  \\
				{ \\
						.attr.value = _attr, \\
						.data.cmd.name = shellCmd##_name, \\
						.data.cmd.function = (int (*)())_func, \\
						.data.cmd.desc = shellDesc##_name \\
				}

導出無參數命令時,函數的入參為 void,示例如下:

`

void hello(void)
{
    printf("hello letter shell!\\n");
}

//導出到命令列表里
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), hello, hello, hello);

系統運行起來后,在 shell控制臺按 tab 鍵可以看到導出的命令,運行 hello 命令,運行結果如下所示:

1686380798207dxg57s5879

導出有參數的命令時,還可傳入參數。導出有參數命令示例如下:

void parameter_test (int num, char *str)
{
    printf("parameter test: num = %d, str = %s !\\r\\n", num, str);

}
//導出到命令列表里
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), parameter_test, parameter_test, parameter test);

系統運行起來后,在 shell控制臺按 tab 鍵可以看到導出的命令,運行parameter_test命令,運行結果如下所示:

1686380798488wepvp3mzc7

值得注意的是,命令參數的最大個數在中shell_cfg.h配置,默認最大是8,但是命令占了一個參數,因此用戶可用的應該是7個。

/**
 * @brief shell命令參數最大數量
 *        包含命令名在內,超過8個參數并且使用了參數自動轉換的情況下,需要修改源碼
 */
#define     SHELL_PARAMETER_MAX_NUMBER  8

Letter shell不僅可以使用命令的方式運行程序,還可像Linux的終端一樣,還能通過上下鍵能選擇歷史命令,歷史命令的個數默認最大為5個。

/**
 * @brief 歷史命令記錄數量
 */
#define     SHELL_HISTORY_MAX_NUMBER    5

非常的方便,Letter shell很強大,還有很多功能可玩,本文先講到這里,后面再深入講解Letter shell的設計思想。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5082

    文章

    19104

    瀏覽量

    304803
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209326
  • WINDOWS
    +關注

    關注

    3

    文章

    3541

    瀏覽量

    88623
  • Shell
    +關注

    關注

    1

    文章

    365

    瀏覽量

    23356
  • GitHub
    +關注

    關注

    3

    文章

    468

    瀏覽量

    16428
收藏 人收藏

    評論

    相關推薦

    嵌入式Linux入門(三、Linux Shell及常用命令說明)

    嵌入式 Linux入 門第三課,熟悉掌握 Linux 常用 Shell 命令 ...... 矜辰所致
    的頭像 發表于 06-21 10:50 ?1311次閱讀
    <b class='flag-5'>嵌入式</b>Linux入門(三、Linux <b class='flag-5'>Shell</b>及常用命令說明)

    嵌入式Linux入門(五、Shell腳本編程上:認識Shell腳本)

    大家好,是矜辰所致,嵌入式 Linux入 門第五課,本課開始簡單學習Shell 腳本編程。
    的頭像 發表于 07-13 16:10 ?1616次閱讀
    <b class='flag-5'>嵌入式</b>Linux入門(五、<b class='flag-5'>Shell</b>腳本編程上:認識<b class='flag-5'>Shell</b>腳本)

    Linux shell函數簡介和使用方法

    作為嵌入式 Linux 工程師,肯定需要編寫 shell 腳本進行些自動化工作。剛好,我最近就有類似需求——
    發表于 08-25 16:21 ?1166次閱讀
    Linux <b class='flag-5'>shell</b>函數簡介和使用方法

    基于APM32F4移植使用letter-shell命令行終端

    letter shellC語言編寫的,可以嵌入在程序中的嵌入式
    的頭像 發表于 11-03 17:23 ?1450次閱讀
    基于APM32F4移植使用<b class='flag-5'>letter-shell</b>命令行終端

    嵌入式Linux開發入門普及課程之Shell編程基礎

    視頻主題:Shell編程基礎視頻主講:曾宏安,華清遠見企業學院(www.farsight.com.cn)講師。視頻簡介:嵌入式公益培訓活動是華清遠見嵌入式普及推廣活動之,主要面向
    發表于 08-13 15:08

    嵌入式Linux開發工具-shell編程介紹

    嵌入式Linux系統開發(文件、進程、線程、網絡)20嵌入式系統移植8h嵌入式驅動開發8h自動生成: CMake autotool嵌入式Linux開發工具-
    發表于 11-08 08:50

    Shell與變量的相關資料分享

    筆記系列嵌入式系統方向學習筆記1嵌入式系統方向學習筆記2嵌入式系統方向學習筆記3嵌入式系統方向學習筆記4文章目錄筆記系列前言、開發工具的總
    發表于 12-22 08:11

    【CW32飯盒派開發板試用體驗】+ 串口letter-shell 移植

    本次主要移植letter-shell過程。 letter shellC語言編寫的,可以嵌入
    發表于 06-11 12:20

    嵌入式和物聯網的shell腳本學習指南之shell腳本入門免費下載

    本文檔的主要內容詳細技術的是嵌入式和物聯網的shell腳本學習指南之shell腳本入門免費下載。
    發表于 09-11 17:15 ?20次下載
    <b class='flag-5'>嵌入式</b>和物聯網的<b class='flag-5'>shell</b>腳本學習指南之<b class='flag-5'>shell</b>腳本入門免費下載

    嵌入式linux對shell腳本的基本掌握

    對于嵌入式linux開發者而言,shell腳本的要求基本上能看懂就可以。不用像運維人員那樣寫出非常強悍的shell腳本shell:在計算機科學中,
    發表于 04-02 14:46 ?495次閱讀

    嵌入式Linux開發工具——shell編程

    shell(腳本:批處理)適合職業:Linux系統運維工程師1.命令解析器(將用戶輸入的命令解析,調用相應的命令的可執行文件)2.腳本語言我們需要了解的是shell編程的簡單命令語句
    發表于 11-01 17:20 ?13次下載
    <b class='flag-5'>嵌入式</b>Linux開發工具——<b class='flag-5'>shell</b>編程

    【RT-Thread學習筆記】bash和dash-shell

    ? 最近在工作中遇到很奇葩的問題,就是嵌入式的SDK編譯,它里面執行shell命令的時候
    的頭像 發表于 07-30 13:49 ?1199次閱讀
    【RT-Thread學習筆記】bash和dash-<b class='flag-5'>shell</b>

    AN023 如何在GD平臺移植Letter shell

    AN023 如何在GD平臺移植Letter shell
    發表于 02-27 18:25 ?1次下載
    AN023 如何在GD平臺移植<b class='flag-5'>Letter</b> <b class='flag-5'>shell</b>

    剖析Linux shell 函數實現

    作為嵌入式 Linux 工程師,肯定需要編寫 shell 腳本進行些自動化工作。剛好,我最近就有類似需求——
    的頭像 發表于 05-12 10:27 ?502次閱讀
    剖析Linux <b class='flag-5'>shell</b> 函數實現

    常見的shell script規則

    shell script對于硬件嵌入式行業從業者來說應該是常用的工具,它是程序化腳本,是種自動化管理linux的好工具了,所以對于
    的頭像 發表于 11-07 10:29 ?504次閱讀
    常見的<b class='flag-5'>一</b>些<b class='flag-5'>shell</b> script規則
    主站蜘蛛池模板: 蜜臀亚洲AV永久无码精品老司机| 玉林天天论坛| 亚洲 欧美 国产 综合五月天| 国产欧美一区二区精品久久久| 同时和两老师双飞| 午夜精品久久久久久久99蜜桃| 国产精品伦理一二三区伦理| 女教师の诱惑| 中文字幕视频在线免费观看| 国产午夜精品理论片久久影视| 欧美久久综合网| av亚洲色天堂2017| 久久午夜免费视频| 野花影院手机在线观看| 果冻传媒色AV国产播放| 无套内射无矿码免费看黄| 国产成人精品男人的天堂网站| 国产一区二区三区影院| ae58老司机福利| 亚洲中文字幕欧美自拍一区| 超碰最新网站| 迅雷成人下载| 国产在线观看网址你懂得| 亚洲AV久久久噜噜噜噜| 九九热这里都是精品| 中文字幕一区二区三区在线不卡| 美女脱了内裤张开腿让男人桶到爽| 在线播放免费人成视频| 日韩欧美一区二区三区免费看 | 强行撕开衣服捏胸黄文| 亚洲 欧美 清纯 校园 另类 | 做a爱片的全过程| 亚洲国产精品高清在线| 这里只有精品在线视频| 综合精品欧美日韩国产在线| 久久伊人天堂视频网| 免费看到湿的小黄文软件APP| 欧美亚洲国产免费高清视频| 肉多荤文高h羞耻校园| 亚洲AV國產国产久青草| 中文字幕亚洲无线码在线|