新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 智能命令行設計及其在SOPC系統中的應用

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

        作者: 時間:2011-04-06 來源:網絡 收藏

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

        本文引用地址:http://www.104case.com/article/150890.htm


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

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


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


        命令的數據結構如下。


        typedef struct _ncommand_t {
        const char *name;
        const char *descr;
        shell_st_call cfunc;
        } ncommand_t;


        為了簡化命令的創建,定義下面這個宏來創建命令。
        #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類型整數的參數,將真實的值傳遞給函數;對于其他參數,則將參數作為一個字符串傳遞給函數。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 固镇县| 庄浪县| 黑河市| 敦化市| 华阴市| 海丰县| 通河县| 通道| 壤塘县| 红桥区| 镇平县| 蒙自县| 同仁县| 枣庄市| 双柏县| 河北省| 松桃| 四平市| 承德市| 正蓝旗| 洪洞县| 财经| 万荣县| 栾城县| 色达县| 丹巴县| 嘉禾县| 运城市| 临潭县| 郴州市| 津南区| 巴东县| 三明市| 囊谦县| 舞阳县| 兴文县| 焉耆| 平陆县| 济阳县| 白水县| 中卫市|