www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式硬件
[導讀]收藏評論(0)分享到微博QQ微信LinkedIn命令行是計算機系統(tǒng)中最重要的組件之一。它可以幫助開發(fā)人員更方便的控制系統(tǒng)。在調試過程中,可以讓開發(fā)人員隨時變更測試方法。FPGA的

收藏

評論(0)

分享到

微博

QQ

微信

LinkedIn

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

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

命令行框架設計

1 總體設計

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

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

命令的數據結構如下。

typedef struct _ncommand_t {

const char *name;

const char *descr;

shell_st_call cfunc;

} ncommand_t;

為了簡化命令的創(chuàng)建,定義下面這個宏來創(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)建命令的實例如下: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 動態(tài)函數表創(chuàng)建

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

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

4 自動命令參數個數

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

5 字符輸入

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

6 參數解析

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

7 函數解析

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

8 命令執(zhí)行

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

命令設計

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

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

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

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

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

優(yōu)化處理

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

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

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

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

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉