加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 一、 前言
    • 二、FinSH控制臺使用方法
    • 三、自定義FinSH命令
    • 四、項目實戰(zhàn)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

RT-Thread零基礎(chǔ)快速入門第7講——FinSH控制臺

03/26 14:53
4606
閱讀需 13 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

一、 前言

本來我是打算先講完RT-thread的內(nèi)核,再講設(shè)備和組件,但是考慮到后面很多地方都會用到FinSH控制臺,所以我就先把這個講了,這樣大家在后面的學(xué)習(xí)就不會有很多疑問了。

FinSH 是 RT-Thread 的命令行組件(shell),它提供一套供用戶在命令行調(diào)用的操作接口,主要用于調(diào)試或查看系統(tǒng)信息,可以使用串口 / 以太網(wǎng) / USB 等方式與 PC 機進(jìn)行通信。一般我們默認(rèn)用串口1和PC機通訊,通過串口我們可以查看單片機運行的情況,也可以通過發(fā)送命令控制單片機執(zhí)行某些操作。關(guān)于FinSH更多詳細(xì)的內(nèi)容,大家可以在官網(wǎng)上面查看。

FinSH控制臺組件介紹:https://www.rt-thread.org/document/site/programming-manual/finsh/finsh/#

源碼鏈接

我發(fā)布的所有關(guān)于RT-thread的教程源代碼都在下面這個鏈接里面,隨著我教程的更新,新的代碼也會加入進(jìn)去。

教程源碼下載鏈接:https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取碼:7nsx

二、FinSH控制臺使用方法

第一步:配置FinSH

在一個項目工程中打開env,輸入menuconfig,選中finsh shell選項即可,一般默認(rèn)都是打開的。

如果你不知道m(xù)enuconfig怎么使用,可以在下面這個鏈接查看。

Menuconfig使用方法:https://www.rt-thread.org/document/site/programming-manual/env/env/#bsp-menuconfig

在這里插入圖片描述

使能串口1,這個如果沒有修改過的話,也是默認(rèn)打開的

在這里插入圖片描述

第二步:燒錄程序并把串口連接到PC端

單片機把配置好的工程下載到板子上,并通過usb轉(zhuǎn)串口把單片機的串口1連接到電腦上。

第三步:打開xshell或者串口助手

在這里插入圖片描述

第四步:測試FinSH命令

復(fù)位一下單片機就可以看到上電時串口打印的版本信息
在這里插入圖片描述

FinSH控制臺的基本操作和Linux是一樣的

在這里插入圖片描述

我們可以先輸入tab鍵查看當(dāng)前系統(tǒng)支持的命令。如下圖所示,左邊是命令名稱,右邊是關(guān)于命令的描述,如下圖所示。

在這里插入圖片描述

我們輸入命令之后按下回車鍵就可以執(zhí)行命令了,例如我輸入list_thread命令,會返回了所有線程的信息,如下圖所示,led0和led1是我自己創(chuàng)建的線程,另外幾個則是系統(tǒng)的線程。

在這里插入圖片描述

這些命令的作用我就不一一描述了,大家可以在官網(wǎng)上面查看。

FinSH內(nèi)置命令詳解:https://www.rt-thread.org/document/site/programming-manual/finsh/finsh/#finsh_2

三、自定義FinSH命令

自定義FinSH命令是這一講我重點要講的內(nèi)容,在項目的實際應(yīng)用中,為了方便調(diào)試,我們經(jīng)常會自定義FinSH命令。

Rt-thread支持三種自定義模式

自定義msh命令

這是傳統(tǒng)的命令行模式,也是最常用的一種。

在這里插入圖片描述

該命令可以導(dǎo)出有參數(shù)的命令,也可以導(dǎo)出無參數(shù)的命令。導(dǎo)出無參數(shù)命令時,函數(shù)的入?yún)?void,示例如下:

void hello(void)
{
    rt_kprintf("hello RT-Thread!n");
}
MSH_CMD_EXPORT(hello , say hello to RT-Thread);//hello是命令名稱,say hello to RT-Thread是命令描述

導(dǎo)出有參數(shù)的命令時,函數(shù)的入?yún)?int argc 和 char**argv。argc 表示參數(shù)的個數(shù),argv 表示命令行參數(shù)字符串指針數(shù)組指針。導(dǎo)出有參數(shù)命令示例如下:

static void atcmd(int argc, char**argv)
{
    ……
}
MSH_CMD_EXPORT(atcmd, atcmd sample: atcmd <server|client>);

自定義C-Style 命令和變量

自定義C-Style命令能夠解析執(zhí)行大部分 C 語言的表達(dá)式,并使用類似 C 語言的函數(shù)調(diào)用方式訪問系統(tǒng)中的函數(shù)及全局變量,此外它也能夠通過命令行方式創(chuàng)建變量,不過我個人基本沒怎么用這種方式,最常用的還是msh命令。

在這里插入圖片描述

以下示例定義了一個 hello 函數(shù),并將它導(dǎo)出成 C-Style 模式下的命令

void hello(void)
{
    rt_kprintf("hello RT-Thread!n");
}
FINSH_FUNCTION_EXPORT(hello , say hello to RT-Thread);

以下示例定義了一個 dummy 變量,并將它導(dǎo)出成 C-Style 模式下的變量命令:

static int dummy = 0;
FINSH_VAR_EXPORT(dummy, finsh_type_int, dummy variable for finsh)

自定義命令重命名

FinSH 的函數(shù)名字長度是有限制的,默認(rèn)是 16 字節(jié)。因此當(dāng)一個函數(shù)名長度超過了上限,只有函數(shù)名前16個字節(jié)會保留下來,所以如果輸入了全部命令執(zhí)行的時候就會出錯。這時就可以使用自定義命令重命名來對導(dǎo)出的命令進(jìn)行重命名了。

在這里插入圖片描述

在重命名的命令名字前加 _cmd 就可以將命令導(dǎo)出到 msh 模式,否則,命令會被導(dǎo)出到 C-Style 模式。以下示例定義了一個 hello 函數(shù),并將它重命名為 ho 后導(dǎo)出成 C-Style 模式下的命令。

void hello(void)
{
    rt_kprintf("hello RT-Thread!n");
}
FINSH_FUNCTION_EXPORT_ALIAS(hello , ho, say hello to RT-Thread);

四、項目實戰(zhàn)

我這里創(chuàng)建了兩個自定義msh命令,一個是帶參數(shù)的一個是不帶參數(shù)的。

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define LED0_PIN    GET_PIN(F, 9)
#define LED1_PIN    GET_PIN(F, 10)

#define THREAD_PRIORITY         25        //線程優(yōu)先級
#define THREAD_TIMESLICE        5         //線程時間片

/* 靜態(tài)線程參數(shù)定義 */
ALIGN(RT_ALIGN_SIZE)
static char led1_stack[1024];  //線程棧內(nèi)存空間
static struct rt_thread led1;  //線程句柄

int main(void)
{
    int i = 0;

    while (1)
    {
        rt_thread_mdelay(200);
    }
}

/* led0函數(shù) */
void led0_init(void)
{
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
    while(1)
    {
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_kprintf("LED0_ON n");
        rt_thread_mdelay(1000);
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_kprintf("LED0_OFF n");
        rt_thread_mdelay(1000);
    }
}
MSH_CMD_EXPORT(led0_init, led0 init);

/* msh命令測試函數(shù): argc是輸入變量的個數(shù),argv是輸入變量的內(nèi)容 */
void msh_test(int argc, char**argv)
{
    /* 檢查輸入的變量是否有兩個 */
    if (argc < 2)
    {
        rt_kprintf("Please input'msh_test <a|b>'n");
        return;
    }
    if (!rt_strcmp(argv[1], "a"))
    {/* 輸入的是a */
        rt_kprintf("Hello world ! n");
    }
    else if (!rt_strcmp(argv[1], "b"))
    {/* 輸入的是b */
        rt_kprintf("Hello RT-thread ! n");
    }
    else
    {/* 輸入的是其他內(nèi)容 */
        rt_kprintf("Please input'msh_test <a|b>'n");
    }
}
MSH_CMD_EXPORT(msh_test, msh test sample : msh_test a|b);

運行的結(jié)果如下圖所示:

執(zhí)行“l(fā)ed0_init”指令之后,led燈就跑起來了。

在這里插入圖片描述

這是帶參數(shù)的指令,輸入的時候除了指令的輸入還需要再輸入一個參數(shù),輸入不同的參數(shù)會有不同的效果,具體要執(zhí)行什么操作可以在函數(shù)里面自己去定義。

在這里插入圖片描述

到這里可能有些同學(xué)就會問了,如果我不想用命令導(dǎo)出那要怎么做?這就需要用到自動初始化了,比如INIT_APP_EXPORT()函數(shù),用了自動初始化函數(shù)之后就不需要手動輸入命令去調(diào)用了,關(guān)于自動初始化的更多內(nèi)容我后面會單獨寫一篇博客。

五、結(jié)束語

好了,關(guān)于FinSH控制臺的編程講解就到這里,如果還有什么問題可以私信給我。如果需要本文對應(yīng)的源碼的話可以在博文前言部分的鏈接下載。

如果覺得這篇文章對你有用,點贊+關(guān)注支持一下博主唄。

后續(xù)我會繼續(xù)更新RT-thread入門教程系列,如果感興趣的同學(xué)可以關(guān)注一下博主,謝謝!

RT-thread相關(guān)教程匯總:https://blog.csdn.net/ShenZhen_zixian/article/details/120563891

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
FTLF8528P3BCV 1 Finisar Corporation Transceiver, 840nm Min, 860nm Max, 8500Mbps(Tx), 8500Mbps(Rx), LC Connector, Panel Mount, ROHS COMPLIANT, PACKAGE-20
$296.52 查看
ECS-2520S18-384-EN-TR 1 ECS International Inc HCMOS Output Clock Oscillator,

ECAD模型

下載ECAD模型
$1.86 查看
NX5032GA-20.000M-STD-CSU-2 1 Nihon Dempa Kogyo Co Ltd Parallel - Fundamental Quartz Crystal, 20MHz Nom, ROHS COMPLIANT PACKAGE-2
暫無數(shù)據(jù) 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜