那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于FPGA嵌入式系統實現智能命令行模塊的設計

牽手一起夢 ? 來源:今日電子 ? 作者:付漢杰 ? 2020-10-04 16:59 ? 次閱讀

命令行是計算機系統中最重要的組件之一。它可以幫助開發人員更方便的控制系統。在調試過程中,可以讓開發人員隨時變更測試方法。

FPGA的成本越來越低,FPGA上的嵌入式系統(SOPC)也應用得越來越廣泛。但是相對其他成熟的計算機體系,SOPC系統現在還沒有命令行。為了更好的推廣SOPC應用,開發了一個智能的命令行模塊,可以調用系統中的任意函數,降低了開發人員的使用難度。在最小配置時,它只有大約1000行代碼,占用14KB存儲容量,可以放在完全由FPGA片內資源構成的計算機系統中。它的結構也具有很好的擴展性,開發人員可以結合自己的需求,輕松添加命令,豐富它的特性。

命令行框架設計

1 總體設計

好的命令行要具有擴展性,開發人員能輕松添加自己的命令;也要傻瓜化,簡單易于使用。

為了達到這兩個目的,可采用編譯器創建的數組作為命令的總索引數據結構。為每條命令創建一個變量,指定它放在一個命令行專用的段中;其中用段“shell_cmd_tab”存放用戶主動創建的命令;用段“shell_cmd_tab_auto”存放系統中所有全局函數。創建變量只需調用宏SHELL_CMD_DECL,提供命令名、命令說明和函數名即可。這樣就可以實現C語言函數、變量、段、內存區域的自動映射過程。

命令的數據結構如下。

為了簡化命令的創建,定義下面這個宏來創建命令。

#define SHELL_CMD_DECL(name, usage, func) ncommand_t _shell_cmd_tab_##func _attribute_ ( (section( “.shell_cmd_tab”) ) )={ name, usage, func }; // small memory version

創建命令的實例如下:SHELL_CMD_DECL(“dump”, “Shows a memory dump”, hexdump);

2 連接腳本

在連接腳本里指定段的位置是簡化命令行使用流程的關鍵。GCC使用PROVIDE定義變量。筆者使用PROVIDE定義了各個段的起始地址和結束地址,從而可以在代碼中使用段地址查詢到所有命令。在編譯器使用的連接腳本中添加如下行定義函數表。

.shell :

{

PROVIDE (__ram_shell_start = ABSOLUTE(。));

。 = ALIGN(32 / 8);

PROVIDE (__ram_shell_cmd_tab_begin = ABSOLUTE(。));

*(.shell_cmd_tab .shell_cmd_tab.*)

PROVIDE (__ram_shell_cmd_tab_end = ABSOLUTE(。));

PROVIDE (__ram_shell_cmd_tab_auto_begin = ABSOLUTE(。));

*(.shell_cmd_tab_auto .shell_cmd_tab_auto.*)

PROVIDE (__ram_shell_cmd_tab_auto_end = ABSOLUTE(。));

*(.shell .shell.*)

。 = ALIGN(32 / 8);

PROVIDE (__ram_shell_end = ABSOLUTE(。));

} 》 ddr_sdram

3 動態函數表創建

由工具自動根據系統中的全局函數創建的命令被稱為自動命令。自動命令使用戶可以在命令行中調用任意普通函數,即使開發人員沒有聲明這些函數為命令。自動命令也需要一個數組包含系統中所有全局函數的信息,這個表為動態函數表。使用一個腳本根據系統的可執行文件自動生成動態函數表。要先編譯軟件,生成可執行文件;再調用腳本創建動態函數表;最后再編譯出包含動態函數表的可執行文件。

在腳本中先使用GNU的nm工具從可執行文件導出所有全局符號,再使用grep提取出包括函數名的行,接著使用cut刪除函數名前的地址信息,使用sed將字符T替換為創建命令的宏SHELL_CMD_DECL_AUTO,并在行尾添加括號。最后將所有這些信息寫入一個C源代碼文件,交給編譯器編譯,就能得到一個動態函數表。

4 自動命令參數個數

為了便于開發人員使用,自動命令最好能適應所有函數類型,假設都是unsigned int的函數類型。對于可以成功轉化為unsigned int類型整數的參數,將真實的值傳遞給函數;對于其他參數,則將參數作為一個字符串傳遞給函數。

5 字符輸入

命令行從標準輸入設備中獲取字符。命令行只接受可打印的字符和特定的控制字符。如果收到了回車或者換行字符,代表用戶完成了命令輸入,就解析命令。解析命令前,去掉多余的空格符(0x20),即不允許有連續的兩個或多個空格符存在,命令的最后也不能有空格符。

6 參數解析

命令行模塊要從用戶輸入的字符串中解析出命令名和參數。為命令提供與DOS和Linux類似的兩個參數,argc和argv。argc表示參數的個數;argv是字符串指針的數組,最多10個字符串。argv[0]是第一個參數,argv[1]是第二個參數,如此類推。

7 函數解析

在代碼中使用SHELL_CMD_DECL創建了命令列表,使用工具創建了自動命令列表。這兩個表實際上都是數據結構ncommand_t的數組,其中有命令名和函數地址的信息。解析函數實際上就是根據在這兩個數組中依次比較函數名。如果用戶輸入的命令名和數組中的命令名一致,就使用對應的函數地址。

8 命令執行

得到函數地址后,就可以執行命令對應的函數。對于主動創建的命令,使用argc和argv作為參數。對于自動命令,命令行模塊先嘗試將原始參數轉換無符號整數。如果成功,使用無符號整數作為參數;如果不成功,則將原始參數的地址作為參數,實際上是一個字符串。

命令設計

完成總體設計后,就可以逐個添加開發需要的命令了。

● 幫助命令用于顯示所有命令名及其用法。

● IO命令用來訪問輸入輸出設備的寄存器,可以實現對外部設備的控制。

● 存儲器命令用來顯示、修改存儲器的值。最基本的包括:dump命令顯示指定位置的內存的值;modify命令用來修改指定內存單元的值。

● 用戶在使用過程中,會使用很多命令。能夠查詢歷史命令、循環執行歷史命令將給用戶帶來很多方便。因此筆者實現了三條命令。history_show用來顯示所有已經使用了的命令;history_del用來刪除指定的歷史命令;history_exec用來執行指定的歷史命令。

優化處理

Altera提供了簡化版的輸出函數alt_printf來替代printf,降低了嵌入式系統的開銷,筆者在命令行中也支持這個這個函數。命令行的代碼中,只調用SHELL_PRINT;在頭文件中,根據用戶設置,SHELL_PRINT使用標準的printf或者簡化的alt_printf。如果使用簡化的alt_printf,這個命令行占用的內存小于14KB。

在SOPC系統中的應用

Altera為SOPC系統開發提供的集成開發環境NIOS II IDE附帶了多個軟件實例。在使用這些軟件實例時,用戶只需要選擇模塊,完全不用新編代碼,非常簡單。

智能命令行模塊也可以作為NIOS II IDE的一個實例。先在“nios2edsexamplessoftware”目錄下為命令行創建一個子目錄shell_standard,再以其他軟件實例的template.xml為模板創為命令行建一個template.xml文件,然后復制命令行模塊的所有文件到這個目錄中。這樣,用戶在創建工程時,直接選中智能命令行模板,就可以使用智能命令行模塊了。

責任編輯:gt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1630

    文章

    21798

    瀏覽量

    606051
  • 嵌入式
    +關注

    關注

    5093

    文章

    19178

    瀏覽量

    307715
  • 計算機
    +關注

    關注

    19

    文章

    7540

    瀏覽量

    88647
收藏 人收藏

    評論

    相關推薦

    在STM32實現命令行

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

    基于智能命令行設計的SOPC系統應用

    作者:Altera 公司 付漢杰命令行是計算機系統中最重要的組件之一。它可以幫助開發人員更方便的控制系統。在調試過程中,可以讓開發人員隨時變更測試方法。FPGA的成本越來越低,
    發表于 07-18 08:03

    怎么設計智能命令行調用SOPC系統任意函數?

    FPGA的成本越來越低,FPGA上的嵌入式系統(SOPC)也應用得越來越廣泛。但是相對其他成熟的計算機體系,SOPC系統現在還沒有
    發表于 08-05 07:23

    怎么設計智能命令行

    怎么設計智能命令行智能命令行在SOPC系統中有哪些應用?
    發表于 08-15 08:22

    Linux命令行的基本使用

    嵌入式Linux開發環境的構建,Linux命令行的基本使用,VI、GCC、Makefile基本工具的使用,交叉開發環境的使用。學習條件: 1.C語言編程基礎
    發表于 11-05 09:08

    介紹一種帶命令行嵌入式系統

    命令行嵌入式系統Opportunity: Windows is completely missing the TextMode boat. The language is dated...機會
    發表于 12-15 08:50

    Linux命令行怎么使用

    嵌入式Linux開發環境的構建,Linux命令行的基本使用,VI、GCC、Makefile基本工具的使用,交叉開發環境的使用。學習條件: 1.C語言編程基礎
    發表于 12-16 07:46

    智能命令行設計及其在SOPC系統中的應用

    智能命令行設計及其在SOPC系統中的應用 命令行是計算機系統中最重要的組件之一。它可以幫助開發人員更方便的控制
    發表于 09-03 11:19 ?643次閱讀

    caxa命令行中的應用

    caxa命令行中的應用 命令行對于大多用戶來說往往只是輸入數據的作用,但是其中的奧妙還有很多,下面就給大家
    發表于 10-18 18:18 ?2321次閱讀

    CMD的命令行高級教程

    CMD的命令行高級教程
    發表于 10-24 08:31 ?30次下載
    CMD的<b class='flag-5'>命令行</b>高級教程

    嵌入式Linux系統基礎概念你了解了多少

    嵌入式Linux系統模塊化處理就是可劃分為Bootloader(引導程序),Kernel(內核),fs(文件系統),Shell(命令行界面
    發表于 12-10 16:40 ?878次閱讀

    使用串口登錄嵌入式Linux設備命令行的方法

    使用串口登錄嵌入式Linux設備命令行的方法如下:舉例如下:平臺:AT91SAM9G45OS: linux-2.6.66交叉編譯器:arm-linux-gcc ,版本:3.4.1用到的命令
    發表于 11-01 16:57 ?10次下載
    使用串口登錄<b class='flag-5'>嵌入式</b>Linux設備<b class='flag-5'>命令行</b>的方法

    自己動手實現命令行解析器

    一、介紹嵌入式里面經常會自己做命令行,這里分享一個命令解析器代碼實現二、代碼實現mycmd.c
    發表于 12-22 18:51 ?13次下載
    自己動手<b class='flag-5'>實現</b><b class='flag-5'>命令行</b>解析器

    linux虛擬機怎么調出命令行

    在Linux虛擬機中調出命令行界面,可以通過以下步驟實現: 打開虛擬機,進入到Linux系統。 在桌面或應用菜單中找到終端或命令行圖標,點擊打開。 輸入
    的頭像 發表于 11-08 11:28 ?3202次閱讀

    linux切換到命令行模式

    在Linux中,可以通過以下步驟切換到命令行模式: 打開終端。可以在應用菜單中找到終端或命令行終端。 在終端中輸入命令“exit”或“logout”,然后按回車鍵。 系統會提示您輸入管
    的頭像 發表于 11-13 16:47 ?1850次閱讀
    百家乐打法心得| 阳宅风水24向详解| 百家乐咋个玩的| 视频百家乐网站| 百家乐77s| 娱乐城开户送真钱200| 太阳城百家乐口诀| 百家乐麻将筹码币| 和田市| 百家乐官网赌博分析网| 百家乐官网博彩资讯论坛| 91百家乐官网的玩法技巧和规则| 菲律宾百家乐游戏| 威尼斯人娱乐城是波音| 南岸区| 百家乐官网娱乐官网| 玩百家乐新2娱乐城| 大发888娱乐游戏平台| 赌百家乐官网的体会| 阴宅24层手机罗盘| 全讯网bbin888.com| 足球投注网址| 百家乐官网号游戏机| 德州百家乐赌博规则| 娱乐城简介| 网上百家乐官网骗钱| 三合四局24向黄泉| 中华百家乐的玩法技巧和规则 | 送彩金百家乐的玩法技巧和规则 | 澳门赌场女| 百家乐官网娱乐网网77scs| 作弊百家乐赌具| 江城足球网| 游戏机百家乐官网的玩法技巧和规则 | 百家乐官网赌博赌博平台| 澳门百家乐出千吗| 施秉县| 百家乐策略详解| 大发888 迅雷下载| 百家乐官网软件稳赚| 送现金百家乐的玩法技巧和规则 |