自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用RT-Thread的FinSH對(duì)硬件進(jìn)行編程

開(kāi)發(fā) 后端 開(kāi)源
由于物聯(lián)網(wǎng)(IoT)的興起,對(duì)硬件進(jìn)行編程變得越來(lái)越普遍。RT-Thread 可以讓你可以用 FinSH 從 Linux 命令行與設(shè)備進(jìn)行溝通。

[[344778]]

由于物聯(lián)網(wǎng)(IoT)的興起,對(duì)硬件進(jìn)行編程變得越來(lái)越普遍。RT-Thread 可以讓你可以用 FinSH 從 Linux 命令行與設(shè)備進(jìn)行溝通。

RT-Thread 是一個(gè)開(kāi)源的實(shí)時(shí)操作系統(tǒng),用于對(duì)物聯(lián)網(wǎng)(IoT)設(shè)備進(jìn)行編程。FinSH 是 RT-Thread 的命令行組件,它提供了一套操作界面,使用戶可以從命令行與設(shè)備進(jìn)行溝通。它主要用于調(diào)試或查看系統(tǒng)信息。

通常情況下,開(kāi)發(fā)調(diào)試使用硬件調(diào)試器和 printf 日志來(lái)顯示。但在某些情況下,這兩種方法并不是很有用,因?yàn)樗菑倪\(yùn)行的內(nèi)容中抽象出來(lái)的,而且它們可能很難解析。不過(guò) RT-Thread 是一個(gè)多線程系統(tǒng),當(dāng)你想知道一個(gè)正在運(yùn)行的線程的狀態(tài),或者手動(dòng)控制系統(tǒng)的當(dāng)前狀態(tài)時(shí),這很有幫助。因?yàn)樗嵌嗑€程的,所以你能夠擁有一個(gè)交互式的 shell,你可以直接在設(shè)備上輸入命令、調(diào)用函數(shù)來(lái)獲取你需要的信息,或者控制程序的行為。如果你只習(xí)慣于 Linux 或 BSD 等現(xiàn)代操作系統(tǒng),這在你看來(lái)可能很普通,但對(duì)于硬件黑客來(lái)說(shuō),這是極其奢侈的,遠(yuǎn)超將串行電纜直接連線到電路板上以獲取一絲錯(cuò)誤的做法。

FinSH 有兩種模式。

  • C 語(yǔ)言解釋器模式,稱(chēng)為 c-style。
  • 傳統(tǒng)的命令行模式,稱(chēng)為 msh(模塊 shell)。

在 C 語(yǔ)言解釋器模式下,F(xiàn)inSH 可以解析執(zhí)行大部分 C 語(yǔ)言的表達(dá)式,并使用函數(shù)調(diào)用訪問(wèn)系統(tǒng)上的函數(shù)和全局變量。它還可以從命令行創(chuàng)建變量。

在 msh 模式下,F(xiàn)inSH 的操作與 Bash 等傳統(tǒng) shell 類(lèi)似。

GNU 命令標(biāo)準(zhǔn)

當(dāng)我們?cè)陂_(kāi)發(fā) FinSH 時(shí),我們了解到,在編寫(xiě)命令行應(yīng)用程序之前,你需要熟悉 GNU 命令行標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)實(shí)踐的框架有助于給界面帶入熟悉感,這有助于開(kāi)發(fā)人員在使用時(shí)感到舒適和高效。

一個(gè)完整的 GNU 命令主要由四個(gè)部分組成。

  1. 命令名(可執(zhí)行文件):命令行程序的名稱(chēng);
  2. 子命令:命令程序的子函數(shù)名稱(chēng)。
  3. 選項(xiàng):子命令函數(shù)的配置選項(xiàng)。
  4. 參數(shù):子命令函數(shù)配置選項(xiàng)的相應(yīng)參數(shù)。

你可以在任何命令中看到這一點(diǎn)。以 Git 為例:

  1. git reset --hard HEAD~1

這一點(diǎn)可以分解為:

 

GNU command line standards

可執(zhí)行的命令是 git,子命令是 reset,使用的選項(xiàng)是 --head,參數(shù)是 HEAD~1

再舉個(gè)例子:

  1. systemctl enable --now firewalld

可執(zhí)行的命令是 systemctl,子命令是 enable,選項(xiàng)是 --now,參數(shù)是 firewalld

想象一下,你想用 RT-Thread 編寫(xiě)一個(gè)符合 GNU 標(biāo)準(zhǔn)的命令行程序。FinSH 擁有你所需要的一切,并且會(huì)按照預(yù)期運(yùn)行你的代碼。更棒的是,你可以依靠這種合規(guī)性,讓你可以自信地移植你最喜歡的 Linux 程序。

編寫(xiě)一個(gè)優(yōu)雅的命令行程序

下面是一個(gè) RT-Thread 運(yùn)行命令的例子,RT-Thread 開(kāi)發(fā)人員每天都在使用這個(gè)命令:

  1. usage: env.py package [-h] [--force-update] [--update] [--list] [--wizard]
  2.                       [--upgrade] [--printenv]
  3.  
  4. optional arguments:
  5.   -h, --help      show this help message and exit
  6.   --force-update  force update and clean packages, install or remove the
  7.                   packages by your settings in menuconfig
  8.   --update        update packages, install or remove the packages by your
  9.                   settings in menuconfig
  10.   --list          list target packages
  11.   --wizard        create a new package with wizard
  12.   --upgrade       upgrade local packages list and ENV scripts from git repo
  13.   --printenv      print environmental variables to check

正如你所看到的那樣,它看起來(lái)很熟悉,行為就像你可能已經(jīng)在 Linux 或 BSD 上運(yùn)行的大多數(shù) POSIX 應(yīng)用程序一樣。當(dāng)使用不正確或不充分的語(yǔ)法時(shí),它會(huì)提供幫助,它支持長(zhǎng)選項(xiàng)和短選項(xiàng)。這種通用的用戶界面對(duì)于任何使用過(guò) Unix 終端的人來(lái)說(shuō)都是熟悉的。

選項(xiàng)種類(lèi)

選項(xiàng)的種類(lèi)很多,按長(zhǎng)短可分為兩大類(lèi)。

  1. 短選項(xiàng):由一個(gè)連字符加一個(gè)字母組成,如 pkgs -h 中的 -h 選項(xiàng)。
  2. 長(zhǎng)選項(xiàng):由兩個(gè)連字符加上單詞或字母組成,例如,scons- --target-mdk5 中的 --target 選項(xiàng)。

你可以把這些選項(xiàng)分為三類(lèi),由它們是否有參數(shù)來(lái)決定。

  1. 沒(méi)有參數(shù):該選項(xiàng)后面不能有參數(shù)。
  2. 參數(shù)必選:選項(xiàng)后面必須有參數(shù)。
  3. 參數(shù)可選:選項(xiàng)后可以有參數(shù),但不是必需的。

正如你對(duì)大多數(shù) Linux 命令的期望,F(xiàn)inSH 的選項(xiàng)解析非常靈活。它可以根據(jù)空格或等號(hào)作為定界符來(lái)區(qū)分一個(gè)選項(xiàng)和一個(gè)參數(shù),或者僅僅通過(guò)提取選項(xiàng)本身并假設(shè)后面的內(nèi)容是參數(shù)(換句話說(shuō),完全沒(méi)有定界符)。

  • wavplay -v 50
  • wavplay -v50
  • wavplay --vol=50

使用 optparse

如果你曾經(jīng)寫(xiě)過(guò)命令行程序,你可能會(huì)知道,一般來(lái)說(shuō),你所選擇的語(yǔ)言有一個(gè)叫做 optparse 的庫(kù)或模塊。它是提供給程序員的,所以作為命令的一部分輸入的選項(xiàng)(比如 -v 或 --verbose)可以與命令的其他部分進(jìn)行解析。這可以幫助你的代碼從一個(gè)子命令或參數(shù)中獲取一個(gè)選項(xiàng)。

當(dāng)為 FinSH 編寫(xiě)一個(gè)命令時(shí),optparse 包希望使用這種格式:

  1. MSH_CMD_EXPORT_ALIAS(pkgs, pkgs, this is test cmd.);

你可以使用長(zhǎng)形式或短形式,或者同時(shí)使用兩種形式來(lái)實(shí)現(xiàn)選項(xiàng)。例如:

  1. static struct optparse_long long_opts[] =
  2. {
  3.     {"help"        , 'h', OPTPARSE_NONE}, // Long command: help, corresponding to short command h, without arguments.
  4.     {"force-update",  0 , OPTPARSE_NONE}, // Long comman: force-update, without arguments
  5.     {"update"      ,  0 , OPTPARSE_NONE},
  6.     {"list"        ,  0 , OPTPARSE_NONE},
  7.     {"wizard"      ,  0 , OPTPARSE_NONE},
  8.     {"upgrade"     ,  0 , OPTPARSE_NONE},
  9.     {"printenv"    ,  0 , OPTPARSE_NONE},
  10.     { NULL         ,  0 , OPTPARSE_NONE}
  11. };

創(chuàng)建完選項(xiàng)后,寫(xiě)出每個(gè)選項(xiàng)及其參數(shù)的命令和說(shuō)明:

  1. static void usage(void)
  2. {
  3.     rt_kprintf("usage: env.py package [-h] [--force-update] [--update] [--list] [--wizard]\n");
  4.     rt_kprintf("                      [--upgrade] [--printenv]\n\n");
  5.     rt_kprintf("optional arguments:\n");
  6.     rt_kprintf("  -h, --help      show this help message and exit\n");
  7.     rt_kprintf("  --force-update  force update and clean packages, install or remove the\n");
  8.     rt_kprintf("                  packages by your settings in menuconfig\n");
  9.     rt_kprintf("  --update        update packages, install or remove the packages by your\n");
  10.     rt_kprintf("                  settings in menuconfig\n");
  11.     rt_kprintf("  --list          list target packages\n");
  12.     rt_kprintf("  --wizard        create a new package with wizard\n");
  13.     rt_kprintf("  --upgrade       upgrade local packages list and ENV scripts from git repo\n");
  14.     rt_kprintf("  --printenv      print environmental variables to check\n");
  15. }

下一步是解析。雖然你還沒(méi)有實(shí)現(xiàn)它的功能,但解析后的代碼框架是一樣的:

  1. int pkgs(int argc, char **argv)
  2. {
  3. int ch;
  4. int option_index;
  5. struct optparse options;
  6.  
  7. if(argc == 1)
  8. {
  9. usage();
  10. return RT_EOK;
  11. }
  12.  
  13. optparse_init(&options, argv);
  14. while((ch = optparse_long(&options, long_opts, &option_index)) != -1)
  15. {
  16. ch = ch;
  17.  
  18. rt_kprintf("\n");
  19. rt_kprintf("optopt = %c\n", options.optopt);
  20. rt_kprintf("optarg = %s\n", options.optarg);
  21. rt_kprintf("optind = %d\n", options.optind);
  22. rt_kprintf("option_index = %d\n", option_index);
  23. }
  24. rt_kprintf("\n");
  25.  
  26. return RT_EOK;
  27. }

這里是函數(shù)頭文件:

  1. #include "optparse.h"
  2. #include "finsh.h"

然后,編譯并下載到設(shè)備上。

 

Output

硬件黑客

對(duì)硬件進(jìn)行編程似乎很?chē)樔?,但隨著物聯(lián)網(wǎng)的發(fā)展,它變得越來(lái)越普遍。并不是所有的東西都可以或者應(yīng)該在樹(shù)莓派上運(yùn)行,但在 RT-Thread,F(xiàn)inSH 可以讓你保持熟悉的 Linux 感覺(jué)。

如果你對(duì)在裸機(jī)上編碼感到好奇,不妨試試 RT-Thread。 

 

責(zé)任編輯:龐桂玉 來(lái)源: 51CTO
相關(guān)推薦

2021-05-10 16:27:01

μCOSFreeRTOS

2010-02-02 14:11:14

Python 進(jìn)行編程

2010-02-23 10:44:00

Python 編程語(yǔ)言

2021-05-09 22:48:40

SQL數(shù)據(jù)庫(kù)變量

2023-12-12 07:30:54

IstioWasm前端

2021-06-15 20:59:14

Kubernetes調(diào)試容器

2018-10-10 14:21:06

Python 工具程序員

2010-01-11 11:16:37

C++編程

2023-04-12 08:00:00

人工智能ChatGPTPython

2018-09-08 09:25:05

編程語(yǔ)言PythonVS Code

2018-04-16 09:42:25

編程顏色ncurses

2021-03-05 00:06:12

Docker容器內(nèi)存

2022-08-15 15:16:20

機(jī)器學(xué)習(xí)圖片深度學(xué)習(xí)

2023-07-13 11:24:14

SQL優(yōu)化賦值

2009-10-22 09:32:51

ghostlinux系統(tǒng)備份

2021-09-27 16:39:10

PythonGif壓縮

2015-12-11 13:39:56

GoiOSAndroid

2011-10-08 11:05:04

GPUMATLAB

2009-12-30 15:55:20

ADO.NET數(shù)據(jù)庫(kù)

2020-09-21 09:58:01

Frida
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)