新聞中心

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

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

        作者: 時(shí)間:2011-04-06 來源:網(wǎng)絡(luò) 收藏

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

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


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

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


        為了達(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,提供命令名、命令說明和函數(shù)名即可。這樣就可以實(shí)現(xiàn)C語言函數(shù)、變量、段、內(nèi)存區(qū)域的自動(dòng)映射過程。


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


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


        為了簡化命令的創(chuàng)建,定義下面這個(gè)宏來創(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 連接腳本
        在連接腳本里指定段的位置是簡化命令行使用流程的關(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ù),即使開發(fā)人員沒有聲明這些函數(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ù)
        為了便于開發(fā)人員使用,自動(dòng)命令最好能適應(yīng)所有函數(shù)類型,假設(shè)都是unsigned int的函數(shù)類型。對(duì)于可以成功轉(zhuǎn)化為unsigned int類型整數(shù)的參數(shù),將真實(shí)的值傳遞給函數(shù);對(duì)于其他參數(shù),則將參數(shù)作為一個(gè)字符串傳遞給函數(shù)。


        上一頁 1 2 下一頁

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 且末县| 新河县| 名山县| 扶绥县| 禄劝| 定襄县| 昌平区| 莎车县| 湄潭县| 屏山县| 饶河县| 乌鲁木齐县| 河西区| 正镶白旗| 通道| 诏安县| 崇左市| 城固县| 长汀县| 靖西县| 犍为县| 宾川县| 中宁县| 南丰县| 兰考县| 北辰区| 搜索| 房产| 枣强县| 永和县| 崇州市| 栾川县| 溧水县| 马公市| 麻栗坡县| 上饶县| 平顺县| 南宁市| 偏关县| 丰顺县| 收藏|