chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(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是一個(gè)C語言編寫的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式設(shè)備。

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

letter-shell的功能十分強(qiáng)大,目前主要功能有:

命令自動(dòng)補(bǔ)全

快捷鍵功能定義

命令權(quán)限管理

用戶管理

變量支持

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

下面是letter-shell運(yùn)行起來的效果圖:

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

2. 獲取源碼

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

letter-shell 開源項(xiàng)目源碼:

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

3. APM32F4上移植letter-shell過程

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

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

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

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

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

3.2 向工程添加letter-shell源碼

letter-shell源碼目錄如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

1、在shell_port.c中,我們主要實(shí)現(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í)際寫入的數(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ù),我們可以不用實(shí)現(xiàn),因?yàn)槲覀兪褂玫氖谴谥袛喾绞浇邮兆址?,不需要?shí)現(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ù)其實(shí)主要就是初始化shell結(jié)構(gòu)體。因?yàn)槲覀冎挥玫綄懞瘮?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ù)需要進(jìn)行配置。我們工程是使用的默認(rèn)配置,基本的功能也有,要想使用其他功能,可能需要先打開某個(gè)配置宏,定義的含義如下:

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

4. 自定義自己的命令

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

letter-shell支持定義自己的命令,并且把該命令導(dǎo)出到shell終端中,以供我們?cè)诿钚邢率褂米远x的命令。

在使用letter-shell自定義命令時(shí),要先檢查 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

就是這個(gè)宏需要定義為 1 。開啟了這個(gè)宏,我們就可以編寫自己的命令函數(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ù)就是命令名,對(duì)應(yīng)的命令函數(shù)名,已經(jīng)該命令的描述。

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

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

/* 自定義命令測(cè)試函數(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);

然后編譯運(yùn)行,可以看到多了一個(gè)test_cmd命令:

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

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

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

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

/**

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

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

*/

#define SHELL_PARAMETER_MAX_NUMBER 8

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







審核編輯:劉清

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

    關(guān)注

    5175

    文章

    19986

    瀏覽量

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

    關(guān)注

    183

    文章

    7634

    瀏覽量

    143960
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    373

    瀏覽量

    24937

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    Shell命令行記錄

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

    Shell腳本命令行解析

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

    STM32HAL如何移植功能強(qiáng)大letter-shell開源庫?

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

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

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

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

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

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

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

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

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

    Shell命令行解釋器簡介

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

    Linux命令行shell腳本編寫

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

    AN023 如何在GD平臺(tái)移植Letter shell

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

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

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

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

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

    linux切換到命令行模式

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

    pycharm命令行終端運(yùn)行代碼

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