下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
智能命令行設(shè)計及其在SOPC系統(tǒng)中的應(yīng)用智能命令行設(shè)計及其在SOPC系統(tǒng)中的應(yīng)用命令行是計算機系統(tǒng)中最重要的組件之一。它可以幫助開發(fā)人員更方便的控制系統(tǒng)。在調(diào)試過程中,可以讓開發(fā)人員隨時變更測試方法。
FPGA的成本越來越低,F(xiàn)PGA上的嵌入式系統(tǒng)(SOPC)也應(yīng)用得越來越廣泛。但是相對其他成熟的計算機體系,SOPC系統(tǒng)現(xiàn)在還沒有命令行。為了更好的推廣SOPC應(yīng)用,筆者開發(fā)了一個智能的命令行模塊,可以調(diào)用系統(tǒng)中的任意函數(shù),降低了開發(fā)人員的使用難度。在最小配置時,它只有大約1000行代碼,占用14KB存儲容量,可以放在完全由FPGA片內(nèi)資源構(gòu)成的計算機系統(tǒng)中。它的結(jié)構(gòu)也具有很好的擴展性,開發(fā)人員可以結(jié)合自己的需求,輕松添加命令,豐富它的特性。命令行框架設(shè)計
1總體設(shè)計
好的命令行要具有擴展性,開發(fā)人員能輕松添加自己的命令;也要傻瓜化,簡單易于使用。
為了達(dá)到這兩個目的,可采用編譯器創(chuàng)建的數(shù)組作為命令的總索引數(shù)據(jù)結(jié)構(gòu)。為每條命令創(chuàng)建一個變量,指定它放在一個命令行專用的段中;其中用段“shell_cmd_tab”存放用戶主動創(chuàng)建的命令;用段“shell_cmd_tab_auto”存放系統(tǒng)中所有全局函數(shù)。創(chuàng)建變量只需調(diào)用宏SHELL_CMD_DECL,提供命令名、命令說明和函數(shù)名即可。這樣就可以實現(xiàn)C語言函數(shù)、變量、段、內(nèi)存區(qū)域的自動映射過程。
命令的數(shù)據(jù)結(jié)構(gòu)如下。
typedefstruct_ncommand_t{
constchar*name;
constchar*descr;
shell_st_call
cfunc;
}ncommand_t;
為了簡化命令的創(chuàng)建,定義下面這個宏來創(chuàng)建命令。
#defineSHELL_CMD_DECL(name,usage,func)ncommand_t\_shell_cmd_tab_##func_attribute_((section(“.shell_cmd_tab”)))\={name,usage,func};//smallmemoryversion
創(chuàng)建命令的實例如下:SHELL_CMD_DECL(“dump”,“Showsamemorydump”,hexdump);
2連接腳本
在連接腳本里指定段的位置是簡化命令行使用流程的關(guān)鍵。GCC使用PROVIDE定義變量。筆者使用PROVIDE定義了各個段的起始地址和結(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動態(tài)函數(shù)表創(chuàng)建
由工具自動根據(jù)系統(tǒng)中的全局函數(shù)創(chuàng)建的命令被稱為自動命令。自動命令使用戶可以在命令行中調(diào)用任意普通函數(shù),即使開發(fā)人員沒有聲明這些函數(shù)為命令。自動命令也需要一個數(shù)組包含系統(tǒng)中所有全局函數(shù)的信息,這個表為動態(tài)函數(shù)表。使用一個腳本根據(jù)系統(tǒng)的可執(zhí)行文件自動生成動態(tài)函數(shù)表。要先編譯軟件,生成可執(zhí)行文件;再調(diào)用腳本創(chuàng)建動態(tài)函數(shù)表;最后再編譯出包含動態(tài)函數(shù)表的可執(zhí)行文件。
在腳本中先使用GNU的nm工具從可執(zhí)行文件導(dǎo)出所有全局符號,再使用grep提取出包括函數(shù)名的行,接著使用cut刪除函數(shù)名前的地址信息,使用sed將字符T替換為創(chuàng)建命令的宏SHELL_CMD_DECL_AUTO,并在行尾添加括號。最后將所有這些信息寫入一個C源代碼文件,交給編譯器編譯,就能得到一個動態(tài)函數(shù)表。
4自動命令參數(shù)個數(shù)
為了便于開發(fā)人員使用,自動命令最好能適應(yīng)所有函數(shù)類型,假設(shè)都是unsignedint的函數(shù)類型。對于可以成功轉(zhuǎn)化為unsignedint類型整數(shù)的參數(shù),將真實的值傳遞給函數(shù);對于其他參數(shù),則將參數(shù)作為一個字符串傳遞給函數(shù)。
5字符輸入
命令行從標(biāo)準(zhǔn)輸入設(shè)備中獲取字符。命令行只接受可打印的字符和特定的控制字符。如果收到了回車或者換行字符,代表用戶完成了命令輸入,就解析命令。解析命令前,去掉多余的空格符(0x20),即不允許有連續(xù)的兩個或多個空格符存在,命令的最后也不能有空格符。
6參數(shù)解析
命令行模塊要從用戶輸入的字符串中解析出命令名和參數(shù)。為命令提供與DOS和Linux類似的兩個參數(shù),argc和argv。argc表示參數(shù)的個數(shù);argv是字符串指針的數(shù)組,最多10個字符串。argv[0]是第一個參數(shù),argv[1]是第二個參數(shù),如此類推。
7函數(shù)解析
在代碼中使用SHELL_CMD_DECL創(chuàng)建了命令列表,使用工具創(chuàng)建了自動命令列表。這兩個表實際上都是數(shù)據(jù)結(jié)構(gòu)ncommand_t的數(shù)組,其中有命令名和函數(shù)地址的信息。解析函數(shù)實際上就是根據(jù)在這兩個數(shù)組中依次比較函數(shù)名。如果用戶輸入的命令名和數(shù)組中的命令名一致,就使用對應(yīng)的函數(shù)地址。
8命令執(zhí)行
得到函數(shù)地址后,就可以執(zhí)行命令對應(yīng)的函數(shù)。對于主動創(chuàng)建的命令,使用argc和argv作為參數(shù)。對于自動命令,命令行模塊先嘗試將原始參數(shù)轉(zhuǎn)換無符號整數(shù)。如果成功,使用無符號整數(shù)作為參數(shù);如果不成功,則將原始參數(shù)的地址作為參數(shù),實際上是一個字符串。命令設(shè)計
完成總體設(shè)計后,就可以逐個添加開發(fā)需要的命令了。
●幫助命令用于顯示所有命令名及其用法。
●IO命令用來訪問輸入輸出設(shè)備的寄存器,可以實現(xiàn)對外部設(shè)備的控制。
●存儲器命令用來顯示、修改存儲器的值。最基本的包括:dump命令顯示指定位置的內(nèi)存的值;modify命令用來修改指定內(nèi)存單元的值。
●用戶在使用過程中,會使用很多命令。能夠查詢歷史命令、循環(huán)執(zhí)行歷史命令將給用戶帶來很多方便。因此筆者實現(xiàn)了三條命令。history_show用來顯示所有已經(jīng)使用了的命令;history_del用來刪除指定的歷史命令;history_exec用來執(zhí)行指定的歷史命令。優(yōu)化處理
Altera提供了簡化版的輸出函數(shù)alt_printf來替代printf,降低了嵌入式系統(tǒng)的開銷,筆者在命令行中也支持這個這個函數(shù)。命令行的代碼中,只調(diào)用SHELL_PRINT;在頭文件中,根據(jù)用戶設(shè)置,SHELL_PRINT使用標(biāo)準(zhǔn)的printf或者簡化的alt_printf。如果使用簡化的alt_printf,這個命令行占用的內(nèi)存小于14KB。在SOPC系統(tǒng)中的應(yīng)用
Altera為SOPC系統(tǒng)開發(fā)提供的集成開發(fā)環(huán)境NIOSIIIDE附帶了多個軟件實例。在使用這些軟件實例時,用戶只需要選擇模塊,完全不用新編代碼,非常簡單。
智能命令行模塊也可以作為NIOSIIIDE的一個實例
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家庭房產(chǎn)買賣合同
- 超市家用品采購合同模板
- 補品全國銷售代理合同
- 工廠安全保衛(wèi)設(shè)備維護(hù)合同
- 房屋裝修設(shè)計項目協(xié)議
- 投資合同協(xié)議談判技巧
- 餐飲外送服務(wù)合同樣本
- 房屋續(xù)租合同書格式
- 銀行個人借款合同范本
- 深圳市建筑勞務(wù)合作合同
- 青海玉樹的神秘之旅
- 語言本能:人類語言進(jìn)化的奧秘
- 校園教職工思想動態(tài)和現(xiàn)實表現(xiàn)動態(tài)評估
- 2024版國開電大??啤禘XCEL在財務(wù)中的應(yīng)用》在線形考(形考作業(yè)一至四)試題及答案
- 黑龍江省雞西市2023-2024學(xué)年八年級上學(xué)期第二次質(zhì)量監(jiān)測道德與法治試題
- 站在講臺上慢慢老去(詩歌朗誦稿)
- 能源管理系統(tǒng)平臺軟件數(shù)據(jù)庫設(shè)計說明書
- 醫(yī)院培訓(xùn)課件:《ICU常見監(jiān)測技術(shù)及護(hù)理》
- 先進(jìn)調(diào)制解調(diào)技術(shù)
- 酒店用品設(shè)備采購?fù)稑?biāo)方案(技術(shù)方案)
- JCT908-2013 人造石的標(biāo)準(zhǔn)
評論
0/150
提交評論