女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

Geehy極海半導(dǎo)體 ? 來源:Geehy極海半導(dǎo)體 ? 2023-11-03 17:23 ? 次閱讀

1. letter-shell簡介

letter shell是一個C語言編寫的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式設(shè)備。

說得直白點他就是一個命令行交互軟件,可以讀取用戶輸入的命令,找到并執(zhí)行命令對應(yīng)的函數(shù)。

letter-shell的功能十分強大,目前主要功能有:

命令自動補全

快捷鍵功能定義

命令權(quán)限管理

用戶管理

變量支持

代理函數(shù)和參數(shù)代理解析

下面是letter-shell運行起來的效果圖:

db90204a-7a28-11ee-939d-92fbcf53809c.jpg

2. 獲取源碼

我們是要把letter-shell,移植到極海APM32F4的MCU上面運行,所以我們需要獲取到極海的APM32F4的SDK包,以及l(fā)etter-shell的源碼。

letter-shell 開源項目源碼:

可以到簡介,給出的作者的github官網(wǎng)下載。如果因為網(wǎng)速的原因,也可以到gitee上面下載,gitee也有很多關(guān)于letter-shell的源碼,

3. APM32F4上移植letter-shell過程

3.1 準(zhǔn)備一份可以通過串口打印信息的工程

我們把官網(wǎng)的APM32F4 SDK下載下來后,然后我們選擇一個串口中斷的例程,如下:

db96e358-7a28-11ee-939d-92fbcf53809c.jpg

然后,把這個例程不需要的代碼去掉,只留下串口相關(guān)的初始化代碼,還有printf重定向的代碼就行了。

編譯下載到板子之后,可以看到串口正常輸出打印信息,就說明代碼正常。

3.2 向工程添加letter-shell源碼

letter-shell源碼目錄如下:

dbad8cc0-7a28-11ee-939d-92fbcf53809c.jpg

我們只需要把src目錄下的源碼復(fù)制到對應(yīng)工程目錄下即可。

我這里就復(fù)制到對應(yīng)工程的 Middlewaresletter-shell 目錄下。

3.3 在keil-MDK中添加源碼和文件包含路徑

打開keil的項目管理窗口,然后添加我們剛剛復(fù)制的letter-shell的源碼目錄src的所有文件:

dbbafcb6-7a28-11ee-939d-92fbcf53809c.jpg

添加文件之后,再添加letter-shell的文件包含路徑:

dbd5d69e-7a28-11ee-939d-92fbcf53809c.jpg

點擊OK,退出。這個時候源碼相當(dāng)于添加完成,這是編譯是可以通過的,沒警告和錯誤。但是還不能正常使用letter-shell,因為還沒有添加移植的接口函數(shù)。

3.4 添加shell_port.c文件,提供讀寫接口函數(shù)

我們還需要提供letter-shell的讀寫接口函數(shù),這樣letter-shell才能通過串口輸出字符,或者通過串口獲取輸入字符。

在letter-shell的源碼目錄下,demo目錄中,已經(jīng)提供了基于stm32 freeRTOS的讀寫接口,我們可以把該文件復(fù)制到我們的工程目錄下,然后在該文件基礎(chǔ)上進行改寫:

dbedcd76-7a28-11ee-939d-92fbcf53809c.jpg

1、在shell_port.c中,我們主要實現(xiàn)shell的寫函數(shù)即可,代碼如下:

/**

* [url=home.php?mod=space&uid=247401]@brief[/url] 用戶shell寫

*

* @param data 數(shù)據(jù)

* @param len 數(shù)據(jù)長度

*

* [url=home.php?mod=space&uid=266161]@return[/url] short 實際寫入的數(shù)據(jù)長度

*/

short userShellWrite(char *data, unsigned short len)

{

unsigned short temp = len;

while (temp--)

{

/* send a byte of data to the serial port */

USART_TxData(USART1, *data++);

/* wait for the data to be send */

while (USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);

}

return len;

}

2、關(guān)于讀函數(shù),我們可以不用實現(xiàn),因為我們使用的是串口中斷方式接收字符,不需要實現(xiàn)讀函數(shù)。我們只需要在串口中斷函數(shù)中,調(diào)用shellHandler即可。串口中斷代碼如下:

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] This function handles USART1 RX interrupt Handler

*

* @param None

*

* @retval None

*

* @note

*/

void USART1_IRQHandler(void)

{

uint8_t ch;

if (USART_ReadIntFlag(USART1, USART_INT_RXBNE) == SET)

{

ch = USART_RxData(USART1);

shellHandler(&shell, ch);

}

}

3、提供letter-shell的初始化函數(shù),該函數(shù)其實主要就是初始化shell結(jié)構(gòu)體。因為我們只用到寫函數(shù),所以只提供了寫接口。具體代碼如下:

Shell shell;

char shellBuffer[512];

/**

* [url=home.php?mod=space&uid=247401]@brief[/url] 用戶shell初始化

*

*/

void userShellInit(void)

{

shell.write = userShellWrite;

shellInit(&shell, shellBuffer, 512);

}

3.5 main函數(shù)初始化letter-shell

當(dāng)我們把接口函數(shù)都提供了之后,就只需要在main函數(shù)調(diào)用 letter-shell 的初始化函數(shù) userShellInit 即可。main函數(shù)代碼如下:

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] Main program

*

* @param None

*

* @retval None

*/

int main(void)

{

/* USART Initialization */

USART_Config_T usartConfigStruct;

usartConfigStruct.baudRate = 115200;

usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;

usartConfigStruct.mode = USART_MODE_TX_RX;

usartConfigStruct.parity = USART_PARITY_NONE;

usartConfigStruct.stopBits = USART_STOP_BIT_1;

usartConfigStruct.wordLength = USART_WORD_LEN_8B;

APM_EVAL_COMInit(COM1, &usartConfigStruct);

APM_EVAL_COMInit(COM2, &usartConfigStruct);

/* Enable USART1 RXBNE interrput */

USART_EnableInterrupt(EVAL_COM1, USART_INT_RXBNE);

USART_ClearStatusFlag(EVAL_COM1, USART_FLAG_RXBNE);

NVIC_EnableIRQRequest(EVAL_COM1_IRQn,1,0);

userShellInit();

while(1)

{

}

}

主要就是初始化串口之后,就調(diào)用 userShellInit 初始化letter-shell。

到這里,我們就完成了letter-shell的移植了,編譯下載可以看到如下效果:

dc08cde2-7a28-11ee-939d-92fbcf53809c.jpg

可以看到letter-shell支持了一些默認(rèn)命令。

3.6 letter-shell的配置文件shell_cfg.h

該文件也是在letter-shell的src目錄下,shell_cfg.h文件中包含了所有用于配置shell的宏,在使用前,可根據(jù)需要進行配置。我們工程是使用的默認(rèn)配置,基本的功能也有,要想使用其他功能,可能需要先打開某個配置宏,定義的含義如下:

dc15c81c-7a28-11ee-939d-92fbcf53809c.jpg

4. 自定義自己的命令

4.1 與導(dǎo)出自定義命令相關(guān)的宏

letter-shell支持定義自己的命令,并且把該命令導(dǎo)出到shell終端中,以供我們在命令行下使用自定義的命令。

在使用letter-shell自定義命令時,要先檢查 shell_cfg.h 文件是否開啟了命令導(dǎo)出功能。

/**

* [url=home.php?mod=space&uid=247401]@brief[/url] 是否使用命令導(dǎo)出方式

* 使能此宏后,可以使用`SHELL_EXPORT_CMD()`等導(dǎo)出命令

* 定義shell命令,關(guān)閉此宏的情況下,需要使用命令表的方式

*/

#define SHELL_USING_CMD_EXPORT 1

就是這個宏需要定義為 1 。開啟了這個宏,我們就可以編寫自己的命令函數(shù),然后導(dǎo)出到shell終端了。

導(dǎo)出自定義命令的宏在 shell.h 文件中定義,其代碼如下:

/**

* [url=home.php?mod=space&uid=247401]@brief[/url] shell 命令定義

*

* @param _attr 命令屬性

* @param _name 命令名

* @param _func 命令函數(shù)

* @param _desc 命令描述

*/

#define SHELL_EXPORT_CMD(_attr, _name, _func, _desc)

const char shellCmd##_name[] = #_name;

const char shellDesc##_name[] = #_desc;

SHELL_USED const ShellCommand

shellCommand##_name SHELL_SECTION("shellCommand") =

{

.attr.value = _attr,

.data.cmd.name = shellCmd##_name,

.data.cmd.function = (int (*)())_func,

.data.cmd.desc = shellDesc##_name

}

這里作者加入了命令屬性的參數(shù),主要就是定義該命令的權(quán)限,類型,是否使用返回值輸出等等(詳細(xì)的屬性定義可以去看源碼),其他參數(shù)就是命令名,對應(yīng)的命令函數(shù)名,已經(jīng)該命令的描述。

4.2 編寫一個命令測試函數(shù)

這里我編寫一個測試命令函數(shù),代碼如下:

/* 自定義命令測試函數(shù) */

int test_func(int a, char *str)

{

printf("%d ", a);

printf("%s ", str);

return 0;

}

/* 導(dǎo)出到命令列表里 */

SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), test_cmd, test_func, test cmd);

然后編譯運行,可以看到多了一個test_cmd命令:

dc31dbd8-7a28-11ee-939d-92fbcf53809c.jpg

可以看到我們運行這個命令的時候,輸出了我們代碼的打印內(nèi)容。

根據(jù)作者的reamme文件,目前 letter shell 3.x 版本,命令函數(shù)參數(shù)只支持整數(shù),字符,字符串參數(shù),以及在某些情況下的浮點參數(shù)直接傳遞給執(zhí)行命令的函數(shù)。浮點型參數(shù)是在哪些情況才支持,可以閱讀作者的文檔。

另外,參數(shù)的個數(shù),是有一個宏配置的:

/**

* [url=home.php?mod=space&uid=247401]@brief[/url] shell命令參數(shù)最大數(shù)量

* 包含命令名在內(nèi),超過16個參數(shù)并且使用了參數(shù)自動轉(zhuǎn)換的情況下,需要修改源碼

*/

#define SHELL_PARAMETER_MAX_NUMBER 8

默認(rèn)只支持8個參數(shù),當(dāng)然我們可以修改支持更多參數(shù)個數(shù)。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5141

    文章

    19526

    瀏覽量

    314852
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140249
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    372

    瀏覽量

    23962

原文標(biāo)題:APM32芯得 EP.25 | 基于APM32F4移植使用letter-shell命令行終端

文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    在STM32實現(xiàn)命令行

    工作中的開發(fā)環(huán)境都是基于linux命令行交互,作為命令行的重度使用者,玩單片機也要使用命令行工具,百度了一些命令行工具,有幾個不錯的開源 cmd 交互工具,主要看了 finsh
    發(fā)表于 12-09 11:32 ?2936次閱讀

    Shell命令行記錄

    Shell命令行Tips整理【持續(xù)更新】
    發(fā)表于 10-21 06:36

    Shell腳本命令行解析

    Shell腳本解析命令行參數(shù)——Argparse(填坑)
    發(fā)表于 04-03 11:34

    STM32HAL如何移植功能強大letter-shell開源庫?

    STM32HAL如何移植功能強大letter-shell開源庫?
    發(fā)表于 11-26 06:19

    Mini shell命令行調(diào)試工具的相關(guān)資料分享

    @mini shell命令行調(diào)試工具介紹Mini shell 命令行調(diào)試工具(單片機、c語言)Mini shell是一個特別適合低內(nèi)存的單片
    發(fā)表于 01-24 08:15

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

    本次主要移植letter-shell過程。 letter shell是一個C語言編寫的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式設(shè)
    發(fā)表于 06-11 12:20

    caxa命令行中的應(yīng)用

    caxa命令行中的應(yīng)用 命令行對于大多用戶來說往往只是輸入數(shù)據(jù)的作用,但是其中的奧妙還有很多,下面就給大家
    發(fā)表于 10-18 18:18 ?2386次閱讀

    mini shell命令行調(diào)試工具(單片機、c語言)

    @mini shell命令行調(diào)試工具介紹Mini shell 命令行調(diào)試工具(單片機、c語言)Mini shell是一個特別適合低內(nèi)存的單片
    發(fā)表于 11-29 10:21 ?10次下載
    mini <b class='flag-5'>shell</b><b class='flag-5'>命令行</b>調(diào)試工具(單片機、c語言)

    Shell命令行解釋器簡介

    Shell 是一個命令行解釋器,Shell 為用戶提供了與設(shè)備進行命令行交互的方式,用戶通過串口、以太網(wǎng)、無線等方式將命令傳輸給具有
    的頭像 發(fā)表于 08-19 17:20 ?3480次閱讀

    Linux命令行shell腳本編寫

    Linux命令行shell腳本編寫
    發(fā)表于 01-11 16:50 ?4次下載

    AN023 如何在GD平臺移植Letter shell

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

    linux命令行shell編程實戰(zhàn)

    Linux命令行Shell編程實戰(zhàn)主要涉及以下內(nèi)容: Linux命令行基礎(chǔ):學(xué)習(xí)Linux命令行的基本操作,如文件管理、進程管理、網(wǎng)絡(luò)配置等。熟悉使用
    的頭像 發(fā)表于 11-08 10:57 ?1022次閱讀

    linux虛擬機怎么調(diào)出命令行

    快捷鍵組合Ctrl+Alt+F1 6來切換到命令行界面。如果系統(tǒng)在虛擬機中,則可以使用Ctrl+Alt+shift+F1 6組合鍵來切換到命令行界面。在
    的頭像 發(fā)表于 11-08 11:28 ?3597次閱讀

    linux切換到命令行模式

    在Linux中,可以通過以下步驟切換到命令行模式: 打開終端??梢栽趹?yīng)用菜單中找到終端命令行終端。 在
    的頭像 發(fā)表于 11-13 16:47 ?2141次閱讀

    pycharm命令行終端運行代碼

    Python是一種非常流行的編程語言,許多開發(fā)者使用它來編寫各種應(yīng)用程序和腳本。為了方便開發(fā)者編寫和測試代碼,PyCharm是一種集成開發(fā)環(huán)境(IDE),它提供了許多功能和工具,其中包括命令行終端
    的頭像 發(fā)表于 11-22 11:20 ?5807次閱讀