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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA嵌入式系統(tǒng)實(shí)現(xiàn)智能命令行模塊的設(shè)計(jì)

牽手一起夢(mèng) ? 來(lái)源:今日電子 ? 作者:付漢杰 ? 2020-10-04 16:59 ? 次閱讀

命令行是計(jì)算機(jī)系統(tǒng)中最重要的組件之一。它可以幫助開(kāi)發(fā)人員更方便的控制系統(tǒng)。在調(diào)試過(guò)程中,可以讓開(kāi)發(fā)人員隨時(shí)變更測(cè)試方法。

FPGA的成本越來(lái)越低,F(xiàn)PGA上的嵌入式系統(tǒng)(SOPC)也應(yīng)用得越來(lái)越廣泛。但是相對(duì)其他成熟的計(jì)算機(jī)體系,SOPC系統(tǒng)現(xiàn)在還沒(méi)有命令行。為了更好的推廣SOPC應(yīng)用,開(kāi)發(fā)了一個(gè)智能的命令行模塊,可以調(diào)用系統(tǒng)中的任意函數(shù),降低了開(kāi)發(fā)人員的使用難度。在最小配置時(shí),它只有大約1000行代碼,占用14KB存儲(chǔ)容量,可以放在完全由FPGA片內(nèi)資源構(gòu)成的計(jì)算機(jī)系統(tǒng)中。它的結(jié)構(gòu)也具有很好的擴(kuò)展性,開(kāi)發(fā)人員可以結(jié)合自己的需求,輕松添加命令,豐富它的特性。

命令行框架設(shè)計(jì)

1 總體設(shè)計(jì)

好的命令行要具有擴(kuò)展性,開(kāi)發(fā)人員能輕松添加自己的命令;也要傻瓜化,簡(jiǎn)單易于使用。

為了達(dá)到這兩個(gè)目的,可采用編譯器創(chuàng)建的數(shù)組作為命令的總索引數(shù)據(jù)結(jié)構(gòu)。為每條命令創(chuàng)建一個(gè)變量,指定它放在一個(gè)命令行專用的段中;其中用段“shell_cmd_tab”存放用戶主動(dòng)創(chuàng)建的命令;用段“shell_cmd_tab_auto”存放系統(tǒng)中所有全局函數(shù)。創(chuàng)建變量只需調(diào)用宏SHELL_CMD_DECL,提供命令名、命令說(shuō)明和函數(shù)名即可。這樣就可以實(shí)現(xiàn)C語(yǔ)言函數(shù)、變量、段、內(nèi)存區(qū)域的自動(dòng)映射過(guò)程。

命令的數(shù)據(jù)結(jié)構(gòu)如下。

為了簡(jiǎn)化命令的創(chuàng)建,定義下面這個(gè)宏來(lái)創(chuàng)建命令。

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

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

2 連接腳本

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

.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 動(dòng)態(tài)函數(shù)表創(chuàng)建

由工具自動(dòng)根據(jù)系統(tǒng)中的全局函數(shù)創(chuàng)建的命令被稱為自動(dòng)命令。自動(dòng)命令使用戶可以在命令行中調(diào)用任意普通函數(shù),即使開(kāi)發(fā)人員沒(méi)有聲明這些函數(shù)為命令。自動(dòng)命令也需要一個(gè)數(shù)組包含系統(tǒng)中所有全局函數(shù)的信息,這個(gè)表為動(dòng)態(tài)函數(shù)表。使用一個(gè)腳本根據(jù)系統(tǒng)的可執(zhí)行文件自動(dòng)生成動(dòng)態(tài)函數(shù)表。要先編譯軟件,生成可執(zhí)行文件;再調(diào)用腳本創(chuàng)建動(dòng)態(tài)函數(shù)表;最后再編譯出包含動(dòng)態(tài)函數(shù)表的可執(zhí)行文件。

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

4 自動(dòng)命令參數(shù)個(gè)數(shù)

為了便于開(kāi)發(fā)人員使用,自動(dòng)命令最好能適應(yīng)所有函數(shù)類型,假設(shè)都是unsigned int的函數(shù)類型。對(duì)于可以成功轉(zhuǎn)化為unsigned int類型整數(shù)的參數(shù),將真實(shí)的值傳遞給函數(shù);對(duì)于其他參數(shù),則將參數(shù)作為一個(gè)字符串傳遞給函數(shù)。

5 字符輸入

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

6 參數(shù)解析

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

7 函數(shù)解析

在代碼中使用SHELL_CMD_DECL創(chuàng)建了命令列表,使用工具創(chuàng)建了自動(dòng)命令列表。這兩個(gè)表實(shí)際上都是數(shù)據(jù)結(jié)構(gòu)ncommand_t的數(shù)組,其中有命令名和函數(shù)地址的信息。解析函數(shù)實(shí)際上就是根據(jù)在這兩個(gè)數(shù)組中依次比較函數(shù)名。如果用戶輸入的命令名和數(shù)組中的命令名一致,就使用對(duì)應(yīng)的函數(shù)地址。

8 命令執(zhí)行

得到函數(shù)地址后,就可以執(zhí)行命令對(duì)應(yīng)的函數(shù)。對(duì)于主動(dòng)創(chuàng)建的命令,使用argc和argv作為參數(shù)。對(duì)于自動(dòng)命令,命令行模塊先嘗試將原始參數(shù)轉(zhuǎn)換無(wú)符號(hào)整數(shù)。如果成功,使用無(wú)符號(hào)整數(shù)作為參數(shù);如果不成功,則將原始參數(shù)的地址作為參數(shù),實(shí)際上是一個(gè)字符串。

命令設(shè)計(jì)

完成總體設(shè)計(jì)后,就可以逐個(gè)添加開(kāi)發(fā)需要的命令了。

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

● IO命令用來(lái)訪問(wèn)輸入輸出設(shè)備的寄存器,可以實(shí)現(xiàn)對(duì)外部設(shè)備的控制。

● 存儲(chǔ)器命令用來(lái)顯示、修改存儲(chǔ)器的值。最基本的包括:dump命令顯示指定位置的內(nèi)存的值;modify命令用來(lái)修改指定內(nèi)存單元的值。

● 用戶在使用過(guò)程中,會(huì)使用很多命令。能夠查詢歷史命令、循環(huán)執(zhí)行歷史命令將給用戶帶來(lái)很多方便。因此筆者實(shí)現(xiàn)了三條命令。history_show用來(lái)顯示所有已經(jīng)使用了的命令;history_del用來(lái)刪除指定的歷史命令;history_exec用來(lái)執(zhí)行指定的歷史命令。

優(yōu)化處理

Altera提供了簡(jiǎn)化版的輸出函數(shù)alt_printf來(lái)替代printf,降低了嵌入式系統(tǒng)的開(kāi)銷,筆者在命令行中也支持這個(gè)這個(gè)函數(shù)。命令行的代碼中,只調(diào)用SHELL_PRINT;在頭文件中,根據(jù)用戶設(shè)置,SHELL_PRINT使用標(biāo)準(zhǔn)的printf或者簡(jiǎn)化的alt_printf。如果使用簡(jiǎn)化的alt_printf,這個(gè)命令行占用的內(nèi)存小于14KB。

在SOPC系統(tǒng)中的應(yīng)用

Altera為SOPC系統(tǒng)開(kāi)發(fā)提供的集成開(kāi)發(fā)環(huán)境NIOS II IDE附帶了多個(gè)軟件實(shí)例。在使用這些軟件實(shí)例時(shí),用戶只需要選擇模塊,完全不用新編代碼,非常簡(jiǎn)單。

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

責(zé)任編輯:gt

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

    關(guān)注

    1629

    文章

    21738

    瀏覽量

    603463
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19126

    瀏覽量

    305302
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7494

    瀏覽量

    87981
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    基于智能命令行設(shè)計(jì)的SOPC系統(tǒng)應(yīng)用

    作者:Altera 公司 付漢杰命令行是計(jì)算機(jī)系統(tǒng)中最重要的組件之一。它可以幫助開(kāi)發(fā)人員更方便的控制系統(tǒng)。在調(diào)試過(guò)程中,可以讓開(kāi)發(fā)人員隨時(shí)變更測(cè)試方法。FPGA的成本越來(lái)越低,
    發(fā)表于 07-18 08:03

    怎么設(shè)計(jì)智能命令行調(diào)用SOPC系統(tǒng)任意函數(shù)?

    FPGA的成本越來(lái)越低,FPGA上的嵌入式系統(tǒng)(SOPC)也應(yīng)用得越來(lái)越廣泛。但是相對(duì)其他成熟的計(jì)算機(jī)體系,SOPC系統(tǒng)現(xiàn)在還沒(méi)有
    發(fā)表于 08-05 07:23

    怎么設(shè)計(jì)智能命令行

    怎么設(shè)計(jì)智能命令行?智能命令行在SOPC系統(tǒng)中有哪些應(yīng)用?
    發(fā)表于 08-15 08:22

    Linux命令行的基本使用

    嵌入式Linux開(kāi)發(fā)環(huán)境的構(gòu)建,Linux命令行的基本使用,VI、GCC、Makefile基本工具的使用,交叉開(kāi)發(fā)環(huán)境的使用。學(xué)習(xí)條件: 1.C語(yǔ)言編程基礎(chǔ)
    發(fā)表于 11-05 09:08

    介紹一種帶命令行嵌入式系統(tǒng)

    命令行嵌入式系統(tǒng)Opportunity: Windows is completely missing the TextMode boat. The language is dated...機(jī)會(huì)
    發(fā)表于 12-15 08:50

    Linux命令行怎么使用

    嵌入式Linux開(kāi)發(fā)環(huán)境的構(gòu)建,Linux命令行的基本使用,VI、GCC、Makefile基本工具的使用,交叉開(kāi)發(fā)環(huán)境的使用。學(xué)習(xí)條件: 1.C語(yǔ)言編程基礎(chǔ)
    發(fā)表于 12-16 07:46

    智能命令行設(shè)計(jì)及其在SOPC系統(tǒng)中的應(yīng)用

    智能命令行設(shè)計(jì)及其在SOPC系統(tǒng)中的應(yīng)用 命令行是計(jì)算機(jī)系統(tǒng)中最重要的組件之一。它可以幫助開(kāi)發(fā)人員更方便的控制
    發(fā)表于 09-03 11:19 ?634次閱讀

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

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

    CMD的命令行高級(jí)教程

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

    嵌入式Linux系統(tǒng)基礎(chǔ)概念你了解了多少

    嵌入式Linux系統(tǒng)模塊化處理就是可劃分為Bootloader(引導(dǎo)程序),Kernel(內(nèi)核),fs(文件系統(tǒng)),Shell(命令行界面
    發(fā)表于 12-10 16:40 ?855次閱讀

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

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

    自己動(dòng)手實(shí)現(xiàn)命令行解析器

    一、介紹嵌入式里面經(jīng)常會(huì)自己做命令行,這里分享一個(gè)命令解析器代碼實(shí)現(xiàn)二、代碼實(shí)現(xiàn)mycmd.c
    發(fā)表于 12-22 18:51 ?13次下載
    自己動(dòng)手<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>命令行</b>解析器

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

    在Linux虛擬機(jī)中調(diào)出命令行界面,可以通過(guò)以下步驟實(shí)現(xiàn): 打開(kāi)虛擬機(jī),進(jìn)入到Linux系統(tǒng)。 在桌面或應(yīng)用菜單中找到終端或命令行圖標(biāo),點(diǎn)擊打開(kāi)。 輸入
    的頭像 發(fā)表于 11-08 11:28 ?3127次閱讀

    linux切換到命令行模式

    在Linux中,可以通過(guò)以下步驟切換到命令行模式: 打開(kāi)終端??梢栽趹?yīng)用菜單中找到終端或命令行終端。 在終端中輸入命令“exit”或“l(fā)ogout”,然后按回車鍵。 系統(tǒng)會(huì)提示您輸入管
    的頭像 發(fā)表于 11-13 16:47 ?1788次閱讀