成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用RT-Thread的FinSH對硬件進行編程

開發 后端 開源
由于物聯網(IoT)的興起,對硬件進行編程變得越來越普遍。RT-Thread 可以讓你可以用 FinSH 從 Linux 命令行與設備進行溝通。

[[344778]]

由于物聯網(IoT)的興起,對硬件進行編程變得越來越普遍。RT-Thread 可以讓你可以用 FinSH 從 Linux 命令行與設備進行溝通。

RT-Thread 是一個開源的實時操作系統,用于對物聯網(IoT)設備進行編程。FinSH 是 RT-Thread 的命令行組件,它提供了一套操作界面,使用戶可以從命令行與設備進行溝通。它主要用于調試或查看系統信息。

通常情況下,開發調試使用硬件調試器和 printf 日志來顯示。但在某些情況下,這兩種方法并不是很有用,因為它是從運行的內容中抽象出來的,而且它們可能很難解析。不過 RT-Thread 是一個多線程系統,當你想知道一個正在運行的線程的狀態,或者手動控制系統的當前狀態時,這很有幫助。因為它是多線程的,所以你能夠擁有一個交互式的 shell,你可以直接在設備上輸入命令、調用函數來獲取你需要的信息,或者控制程序的行為。如果你只習慣于 Linux 或 BSD 等現代操作系統,這在你看來可能很普通,但對于硬件黑客來說,這是極其奢侈的,遠超將串行電纜直接連線到電路板上以獲取一絲錯誤的做法。

FinSH 有兩種模式。

  • C 語言解釋器模式,稱為 c-style。
  • 傳統的命令行模式,稱為 msh(模塊 shell)。

在 C 語言解釋器模式下,FinSH 可以解析執行大部分 C 語言的表達式,并使用函數調用訪問系統上的函數和全局變量。它還可以從命令行創建變量。

在 msh 模式下,FinSH 的操作與 Bash 等傳統 shell 類似。

GNU 命令標準

當我們在開發 FinSH 時,我們了解到,在編寫命令行應用程序之前,你需要熟悉 GNU 命令行標準。這個標準實踐的框架有助于給界面帶入熟悉感,這有助于開發人員在使用時感到舒適和高效。

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

  1. 命令名(可執行文件):命令行程序的名稱;
  2. 子命令:命令程序的子函數名稱。
  3. 選項:子命令函數的配置選項。
  4. 參數:子命令函數配置選項的相應參數。

你可以在任何命令中看到這一點。以 Git 為例:

  1. git reset --hard HEAD~1

這一點可以分解為:

 

GNU command line standards

可執行的命令是 git,子命令是 reset,使用的選項是 --head,參數是 HEAD~1

再舉個例子:

  1. systemctl enable --now firewalld

可執行的命令是 systemctl,子命令是 enable,選項是 --now,參數是 firewalld

想象一下,你想用 RT-Thread 編寫一個符合 GNU 標準的命令行程序。FinSH 擁有你所需要的一切,并且會按照預期運行你的代碼。更棒的是,你可以依靠這種合規性,讓你可以自信地移植你最喜歡的 Linux 程序。

編寫一個優雅的命令行程序

下面是一個 RT-Thread 運行命令的例子,RT-Thread 開發人員每天都在使用這個命令:

  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

正如你所看到的那樣,它看起來很熟悉,行為就像你可能已經在 Linux 或 BSD 上運行的大多數 POSIX 應用程序一樣。當使用不正確或不充分的語法時,它會提供幫助,它支持長選項和短選項。這種通用的用戶界面對于任何使用過 Unix 終端的人來說都是熟悉的。

選項種類

選項的種類很多,按長短可分為兩大類。

  1. 短選項:由一個連字符加一個字母組成,如 pkgs -h 中的 -h 選項。
  2. 長選項:由兩個連字符加上單詞或字母組成,例如,scons- --target-mdk5 中的 --target 選項。

你可以把這些選項分為三類,由它們是否有參數來決定。

  1. 沒有參數:該選項后面不能有參數。
  2. 參數必選:選項后面必須有參數。
  3. 參數可選:選項后可以有參數,但不是必需的。

正如你對大多數 Linux 命令的期望,FinSH 的選項解析非常靈活。它可以根據空格或等號作為定界符來區分一個選項和一個參數,或者僅僅通過提取選項本身并假設后面的內容是參數(換句話說,完全沒有定界符)。

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

使用 optparse

如果你曾經寫過命令行程序,你可能會知道,一般來說,你所選擇的語言有一個叫做 optparse 的庫或模塊。它是提供給程序員的,所以作為命令的一部分輸入的選項(比如 -v 或 --verbose)可以與命令的其他部分進行解析。這可以幫助你的代碼從一個子命令或參數中獲取一個選項。

當為 FinSH 編寫一個命令時,optparse 包希望使用這種格式:

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

你可以使用長形式或短形式,或者同時使用兩種形式來實現選項。例如:

  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. };

創建完選項后,寫出每個選項及其參數的命令和說明:

  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. }

下一步是解析。雖然你還沒有實現它的功能,但解析后的代碼框架是一樣的:

  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. }

這里是函數頭文件:

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

然后,編譯并下載到設備上。

 

Output

硬件黑客

對硬件進行編程似乎很嚇人,但隨著物聯網的發展,它變得越來越普遍。并不是所有的東西都可以或者應該在樹莓派上運行,但在 RT-Thread,FinSH 可以讓你保持熟悉的 Linux 感覺。

如果你對在裸機上編碼感到好奇,不妨試試 RT-Thread。 

 

責任編輯:龐桂玉 來源: 51CTO
相關推薦

2021-05-10 16:27:01

μCOSFreeRTOS

2010-02-02 14:11:14

Python 進行編程

2010-02-23 10:44:00

Python 編程語言

2021-05-09 22:48:40

SQL數據庫變量

2023-12-12 07:30:54

IstioWasm前端

2021-06-15 20:59:14

Kubernetes調試容器

2018-10-10 14:21:06

Python 工具程序員

2023-04-12 08:00:00

人工智能ChatGPTPython

2018-09-08 09:25:05

編程語言PythonVS Code

2018-04-16 09:42:25

編程顏色ncurses

2010-01-11 11:16:37

C++編程

2021-03-05 00:06:12

Docker容器內存

2022-08-15 15:16:20

機器學習圖片深度學習

2023-07-13 11:24:14

SQL優化賦值

2009-10-22 09:32:51

ghostlinux系統備份

2021-09-27 16:39:10

PythonGif壓縮

2015-12-11 13:39:56

GoiOSAndroid

2011-10-08 11:05:04

GPUMATLAB

2009-01-18 11:45:16

PHPXML網站編程

2009-12-30 15:55:20

ADO.NET數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费一区二区 | 欧美在线视频观看 | 久久久久久久久久久久久久国产 | 日韩成人av在线 | 欧美日韩a| 国产精品色 | 久久免费精品视频 | 久久久片 | 国产一区久久 | 久久成人一区 | 九九综合九九 | 成人免费影院 | 欧美成人精品一区二区三区 | 亚洲视频一区在线播放 | 人妖av| 激情麻豆视频 | 国产福利在线播放麻豆 | 97超碰人人草 | 91精品91久久久| 日本超碰 | 精品中文字幕久久 | avhd101在线成人播放 | 欧美色图综合网 | 波多野结衣二区 | 久久精品久久精品 | 中文字幕第90页 | 久综合| 精品91久久 | 天天射色综合 | 91精品国产色综合久久 | 成人精品免费 | 久久男人| 精品动漫一区 | av入口| 亚洲精品久久久久久一区二区 | 日韩欧美三级 | 亚洲日本中文字幕在线 | 91大片| 视频一区二区在线观看 | 在线观看国产 | 欧美 日韩 综合 |