<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 智能命令行在SOPC系統中的設計

智能命令行在SOPC系統中的設計

作者: 時(shí)間:2011-04-10 來(lái)源:網(wǎng)絡(luò ) 收藏
3 動(dòng)態(tài)函數表創(chuàng )建

本文引用地址:http://dyxdggzs.com/article/150863.htm

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

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

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

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

  5 字符輸入

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

  6 參數解析

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

  7 函數解析

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

  8 命令執行

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

  命令

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

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

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

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

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

  優(yōu)化處理

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

  在系統中的應用

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

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


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 設計 系統 SOPC 命令 智能

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>