新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 8051、ARM和DSP指令周期的測試與分析方法

        8051、ARM和DSP指令周期的測試與分析方法

        作者: 時間:2012-05-24 來源:網絡 收藏

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

        3 TMS320F2812工作機制及測試

        TMS320F2812是TI公司的一款用于控制的高性能和高性價比的32位定點芯片。該芯片最高可在150 MHz主頻下工作(本文將其設置到100 MHz),并帶有18K×16位0等待周期片上SRAM和128K×16位片上Flash(存取時間為36 ns)。TMS320F2812采用哈佛總線結構,即在同一個時鐘周期內可同時進行一次取指令、讀數據和寫數據的操作,同時TMS320F2812還通過采用8級流水線來提高系統指令的執行速度。

        為了觀察,對TMS320F2812的GPIOA0進行循環的置位操作和清除操作。C源程序如下:

        #include 28_Device.h
        void main(void) {
          InitSysCtrl();/*初始化系統*/
          DINT;/*關中斷*/
          IER = 0x0000;
          IFR = 0x0000;
          InitPieCtrl();/*初始化PIE控制寄存器*/
          InitPieVectTable();/*初始化PIE矢量表*/
          InitGpio();/*初始化EV*/
          EINT;
          ERTM;
          for(;;) {
            GpioDataRegs.GPADAT.all=0xFFFF;
            GpioDataRegs.GPADAT.all=0xFFFF;
            GpioDataRegs.GPADAT.all=0xFFFF;
            GpioDataRegs.GPADAT.all=0x0000;
            GpioDataRegs.GPADAT.all=0x0000;
            GpioDataRegs.GPADAT.all=0x0000;
          }
        }



        圖4 GPIO的P0.25腳輸出波形3

        其中最重要的是要對通用輸入/輸出進行初始化和確定系統CPU時鐘。其中系統的時鐘通過PLL設定為100 MHz,而初始化 InitGpio() 的源程序為:

        #include 28_Device.h
        void InitGpio(void)
        { EALLOW;
          //多路復用器選為數字I/O
          GpioMuxRegs.GPAMUX.all=0x0000;
          //GPIOAO為輸出,其余為輸入
          GpioMuxRegs.GPADIR.all=0x0001;
          GpioMuxRegs.GPAQUAL.all=0x0000;
          EDIS;
        }

        通過在主程序for(;;)的地方加斷點,可以很容易找到上面主程序中循環部分程序編譯后的匯編指令:

          3F8011 L1:
          3F8011761FMOVWDP,#0x01C3
          3F8013 2820 MOV@32,#0xFFFF
          3F8015 2820 MOV@32,#0xFFFF
          3F8017 2820 MOV@32,#0xFFFF
          3F8019 2820 MOV@32,#0xFFFF
          3F801B 2820 MOV@32,#0xFFFF
          3F801D 2820 MOV@32,#0xFFFF
          3F801F 2B20 MOV@32,#0
          3F8020 2B20 MOV@32,#0
          3F8021 2B20 MOV@32,#0
          3F8022 6FEF SBL1,UNC

        其中第1列為程序在RAM中的位置,第2列為機器碼,后面就是匯編語言程序。指令“MOV @32,#0xFFFF”使GPIO輸出高電平,指令“MOV @32,#0”使GPIO輸出低電平。其中含有6個使GPIOA0輸出高電平的指令和3個使GPIOA0輸出低電平的指令,系統的為10 ns,因此循環周期中保持高電平的時間為60 ns。通過將該程序放在H0 SARAM中進行調試,可得GPIOA0的波形,如圖5所示。其中高電平時間正好為60 ns。注意,由于3個低電平之后要進行跳轉,故清空流水線的周期要長一些。


        圖5 TMS320F2812中GPIOA0的波形1

        為了觀察乘法指令的周期,將上述循環部分的C源程序修改為:

        for(;;)
        {Uint16 test1,test2,test3;
          test1=0x1234; test2=0x2345;
          GpioDataRegs.GPADAT.all=0xFFFF;
          GpioDataRegs.GPADAT.all=0xFFFF;
          GpioDataRegs.GPADAT.all=0xFFFF;
          test3=test1*test2;
          GpioDataRegs.GPADAT.all=0x0000;
          GpioDataRegs.GPADAT.all=0x0000;
          GpioDataRegs.GPADAT.all=0x0000;
        }

        上述程序經過編譯、鏈接后的匯編指令如下:

          3F8012L1:
          3F80122841MOV*-SP[1],#0x1234
          3F8014 2842 MOV*-SP[2],#0x2345
          3F8016 761F MOVWDP,#0x01C3
          3F8018 2820 MOV@32,#0xFFFF
          3F801A 2820 MOV@32,#0xFFFF
          3F801C 2820 MOV@32,#0xFFFF
          3F801E 2D42 MOVT,*-SP[2]
          3F801F 1241 MPYACC,T,*-SP[1]
          3F8020 9643 MOV*-SP[3],AL
          3F8021 2B20 MOV@32,#0
          3F8022 2B20 MOV@32,#0
          3F8023 2B20 MOV@32,#0
          3F8024 6FEE SBL1,UNC

        其中使GPIOA0為高電平的指令仍然為6個指令周期(其中包括1個乘法指令),因為乘法指令也是單周期的,因此循環周期中保持高電平的時間為60 ns。通過將該程序放在H0 SARAM中進行調試可得GPIOA0的波形,如圖6所示。其中高電平時間正好為60 ns,而由于3個低電平之后要進行跳轉,要清空流水線,而且還要為乘法做準備,因此保持低電平的時間比圖5所需的時間要長。當采用數字式示波器觀察時,如果探頭采用×1檔觀察的波形不是很理想,則可以采用×10檔,并配合調節探頭的補償旋鈕。



        圖6 TMS320F2812中GPIOA0的波形2

        4、 三種微處理器的比較

        首先要強調的是,這幾種微控制器都可以通過提高晶振的振蕩頻率來縮短指令周期,但是這些控制器的振蕩頻率是有一定限制的,例如單片機不超過40 MHz,而LPC2114的頻率不超過60 MHz,TMS320F2812的最高頻率為150 MHz。在同樣的工作頻率下,指令運行的指令周期遠遠高于傳統的單片機。因為傳統的單片機沒有采用流水線機制,而核和DSP都采用了流水線,但是由于訪問外設和RAM等存儲器要加一定的時鐘周期,因此不是真正可以實現單周期運行的,特別是不能實現單周期的乘法指令,而DSP可以實現真正的單周期乘法指令,速度要遠遠高于ARM微控制器。


        上一頁 1 2 下一頁

        關鍵詞: DSP 指令周期 ARM

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 平远县| 隆尧县| 牡丹江市| 绥化市| 绥德县| 涿鹿县| 荣昌县| 昭平县| 邵阳县| 全州县| 闽清县| 永清县| 安新县| 礼泉县| 漯河市| 玛多县| 金坛市| 吉木萨尔县| 青河县| 即墨市| 五指山市| 洮南市| 南岸区| 华亭县| 铜山县| 涡阳县| 万山特区| 津南区| 西盟| 广宗县| 古交市| 买车| 额敏县| 临沧市| 阿拉尔市| 腾冲县| 大埔县| 绥棱县| 西贡区| 襄樊市| 嫩江县|