機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
8051、ARM和DSP指令周期的測試與分析
8051、ARM和DSP指令周期的測試與分析
 更新時(shí)間:2009-12-22 13:43:52  點(diǎn)擊數(shù):0
【字體: 字體顏色

摘要
      在實(shí)時(shí)嵌入式控制系統(tǒng)中,指令周期對系統(tǒng)的性能有至關(guān)重要的影響。介紹幾種最常用的微控制器的工作機(jī)制,采用一段循環(huán)語句對這幾種微控制器的指令周期進(jìn)行測試,并進(jìn)行分析比較。分析結(jié)論對系統(tǒng)控制器的選擇有一定的指導(dǎo)作用。
      關(guān)鍵詞 指令周期測試 AT89S51 LPC2114 TMS320F2812
        在實(shí)時(shí)控制系統(tǒng)中,選擇微控制器的指標(biāo)時(shí)最重要的是計(jì)算速度的問題。指令周期是反映計(jì)算速度的一個(gè)重要指標(biāo),為此本文對三種最具代表性的微控制器(AT89S51單片機(jī)、ARM7TDMI核的LPC2114型單片機(jī)和TMS320F2812)的指令周期進(jìn)行了分析和測試。為了能觀察到指令周期,將三種控制器的GPIO口設(shè)置為數(shù)字輸出口,并采用循環(huán)不斷地置位和清零,通過觀察GPIO口的波形變化得到整個(gè)循環(huán)的周期。為了將整個(gè)循環(huán)的周期與具體的每一條指令的指令周期對應(yīng)起來,通過C語言源程序得到匯編語言指令來計(jì)算每一條匯編語言的指令周期。
      1  AT89S51工作機(jī)制及指令周期的測試
        AT89S51單片機(jī)的時(shí)鐘采用內(nèi)部方式,時(shí)鐘發(fā)生器對振蕩脈沖進(jìn)行2分頻。由于時(shí)鐘周期為振蕩周期的兩倍(時(shí)鐘周期=振蕩周期P1+振蕩周期P2),而1個(gè)機(jī)器周期含有6個(gè)時(shí)鐘,因此1個(gè)機(jī)器周期包括12個(gè)晶振的振蕩周期。取石英晶振的振蕩頻率為11.059
      2 MHz,則單片機(jī)的機(jī)器周期為12/11.059 2=1.085 1
      μs。51系列單片機(jī)的指令周期一般含1~4個(gè)機(jī)器周期,多數(shù)指令為單周期指令,有2周期和4周期指令。
        為了觀察指令周期,對單片機(jī)的P1口的最低位進(jìn)行循環(huán)置位操作和清除操作。源程序如下:
      #i nclude<reg51.h>
      main() {
        while(1) {
          P1=0x01;
          P1=0x00;
        }
      }
        采用KEIL uVISION2進(jìn)行編譯、鏈接,生成可執(zhí)行文件。當(dāng)調(diào)用該集成環(huán)境中的Debug時(shí),可以得到上述源程序混合模式的反匯編代碼:
          2:main()
          3: {
          4:while(1)
          5:{
          6:P1=0x01;
        0x000F759001MOVP1(0x90),#0x01
          7:P1=0x00;
        0x0012 E4CLRA
        0x0013 F590MOVP1(0x90),A
          8:}
        0x001580EDSJMPmain (C:0003)
        其中斜體的代碼為C源程序,正體的代碼為斜體C源程序?qū)?yīng)的匯編語言代碼。每行匯編代碼的第1列為該代碼在存儲(chǔ)器中的位置,第2列為機(jī)器碼,后面是編譯、鏈接后的匯編語言代碼。所有指令共占用6個(gè)機(jī)器周期(其中“MOV
       P1(0x90),#0x01”占用2個(gè)機(jī)器周期,“CLR  A”和“MOV 
      P1(0x90),A”各占用1個(gè)機(jī)器周期,最后一個(gè)跳轉(zhuǎn)指令占用2個(gè)機(jī)器周期),則總的循環(huán)周期為6×機(jī)器周期=6×1.085 1 μs=6.51 μs。

圖1  P1口最低位的波形
        將編譯、鏈接生成的可執(zhí)行文件下載到AT89S51的Flash中執(zhí)行可以得到P1口最低位的波形,如圖1所示。整個(gè)循環(huán)周期為6.1  μs,與上面的分析完全一致。

 2  LPC2114工作機(jī)制及指令周期的測試
        LPC2114是基于ARM7TDMI核的可加密的單片機(jī),具有零等待128 KB的片內(nèi)Flash,16 KB的SRAM。時(shí)鐘頻率可達(dá)60
      MHz(晶振的頻率為11.059 2 MHz,時(shí)鐘頻率設(shè)置為11.059 2×4 =44.236 8
      MHz,片內(nèi)外設(shè)頻率為時(shí)鐘頻率的1/4,即晶振的頻率)。ARM7TDMI核通過使用三級流水線和大量使用內(nèi)部寄存器來提高指令流的執(zhí)行速度,能提供0.9
      MIPS/MHz的指令執(zhí)行速度,即指令周期為1/(0.9×44.236 8)=0.025 12 μs,約為25 ns。
        為了觀察指令周期,將LPC2114中GPIO的P0.25腳設(shè)置為輸出口,并對其進(jìn)行循環(huán)的置位操作和清除操作。C源程序如下:
       。 nclude"config.h"
        //P0.25引腳輸出
        #defineLEDCON0x02000000
        intmain(void)
        {//設(shè)置所有引腳連接GPIO
          PINSEL0 = 0x00000000;
          PINSEL1 = 0x00000000;
          //設(shè)置LED4控制口為輸出
          IO0DIR = LEDCON;
          while(1)
          {IO0SET = LEDCON;
            IO0CLR = LEDCON;
          }
        return(0);
      }
        采用ADS1.2進(jìn)行編譯、鏈接,生成可執(zhí)行文件。當(dāng)調(diào)用AXD Debugger時(shí),可以得到上述源程序的反匯編代碼:
        main[0xe59f1020]ldrr1,0x40000248
        40000224[0xe3a00000]movr0,#0
        40000228[0xe5810000]strr0,[r1,#0]
        4000022c[0xe5810004]strr0,[r1,#4]
        40000230[0xe3a00780]movr0,#0x2000000
        40000234[0xe1c115c0]bicr1,r1,r0,asr #11
        40000238[0xe5810008]strr0,[r1,#8]
        4000023c[0xe5810004]strr0,[r1,#4]
        40000240[0xe581000c]strr0,[r1,#0xc]
        40000244[0xeafffffc]b0x4000023c
        40000248[0xe002c000]dcd0xe002c000
        每行匯編代碼的第1列為該代碼在存儲(chǔ)器中的位置,第2列為機(jī)器碼,后面是編譯、鏈接后的匯編語言代碼。循環(huán)部分的語句最關(guān)鍵的就是下面3句:
        4000023c[0xe5810004]strr0,[r1,#4]
        40000240[0xe581000c]strr0,[r1,#0xc]
        40000244[0xeafffffc]b0x4000023c
        在AXD Debugger中,將其調(diào)用到RAM中運(yùn)行程序得到循環(huán)部分GPIO的P0.25的輸出波形,如圖2所示。
      從圖中可以看出,循環(huán)周期中保持為高電平的時(shí)間為1350 ns左右,低電平的時(shí)間為450 ns左右,即指令“str
      r0,[r1,#4]”和指令“str r0,[r1,#0xc]”均需350 ns左右,而跳轉(zhuǎn)指令則需100 ns左右。這主要是由于以下原因造成的:
      ① ARM的大部分指令是單周期的,但是也有一些指令(如乘法指令)是多周期的;

② 基于ARM核的微控制器只有加載、存儲(chǔ)和交換指令可以對存儲(chǔ)器的數(shù)據(jù)進(jìn)行訪問,這樣從存儲(chǔ)器讀數(shù)據(jù)或向存儲(chǔ)器寫數(shù)據(jù)要增加1個(gè)時(shí)鐘周期;③
      訪問片內(nèi)外設(shè)要增加一個(gè)外設(shè)時(shí)鐘周期。當(dāng)然,每個(gè)指令還要有1個(gè)時(shí)鐘周期,跳轉(zhuǎn)時(shí)要清空流水線還要另加一定的時(shí)鐘周期。

圖2  GPIO的P0.25腳輸出波形
        為了觀察乘法指令,特地采用下述匯編語言進(jìn)行了實(shí)驗(yàn)。首先是沒有乘法指令的匯編源程序:
        INCLUDELPC2294.INC ;引入頭文件
      ; P0.25引腳控制LED4,低電平點(diǎn)亮
      LEDCONEQU0x02000000
        EXPORTMAIN
      ;聲明程序代碼塊
        AREALEDCONC,CODE,READONLY
      ;裝載寄存器地址,PINSEL0
      MAINLDRR0,=PINSEL0
      ;設(shè)置數(shù)據(jù),即設(shè)置引腳連接GPIO
        MOVR1,#0x00000000
        STRR1,[R0]; [R0] ← R1
        LDRR0,=PINSEL1
        STRR1,[R0]
        LDRR0,=IO0DIR
        LDRR1,=LEDCON
      ;設(shè)置LED控制口為輸出
        STRR1,[R0]
      ;設(shè)置GPIO控制參數(shù)
      LOOPLDRR1,=LEDCON
      LEDSETLDRR0,=IO0SET
      ; LED控制I/O置位,即LED4熄滅
        STRR1,[R0]
      LEDCLRLDRR0,=IO0CLR
      ; LED控制I/O復(fù)位,即LED4點(diǎn)亮
        STRR1,[R0]
      ;無條件跳轉(zhuǎn)到LOOP
        B LOOP
        采用ADS1.2進(jìn)行編譯、鏈接后的匯編代碼為:
      LOOP  [0xe3a01780]movr1,#0x2000000
      LEDSET[0xe59f0028]  ldrr0,0x40000128
      400000fc[0xe5801000]strr1,[r0,#0]
      LEDCLR[0xe59f0024]  ldrr0,0x4000012c
      40000104 [0xe5801000]strr1,[r0,#0]
      40000108 [0xeafffff9] bLOOP
        在AXD Debugger中,將其調(diào)用到RAM中運(yùn)行程序得到循環(huán)部分的GPIO的P0.25腳輸出波形,如圖3所示。  從圖中可以看出,循環(huán)周期中保持為高電平的時(shí)間為450 ns左右,低電平的時(shí)間為550 ns左右。

圖3  GPIO的P0.25腳輸出波形2
        在上例的LOOP循環(huán)部分中加入乘法指令,即將循環(huán)部分改為:
      LOOP  LDRR1,=LEDCON
      LEDSETLDRR0,=IO0SET
        STRR1,[R0]
        MOVR2,#0x0234
        MULR2,R1,R2
      LEDCLRLDRR0,=IO0CLR
        STRR1,[R0]
        B LOOP
        采用ADS1.2進(jìn)行編譯、鏈接后的匯編代碼為:
      LOOP[0xe3a01780]movr1,#0x2000000
      LEDSET[0xe59f0030]ldrr0,0x40000130
      400000fc[0xe5801000]strr1,[r0,#0]
      40000100[0xe3a02f8d]movr2,#0x234
      40000104[0xe0020291] mulr2,r1,r2
      LEDCLR[0xe59f0024] ldrr0,0x40000134
      4000010c[0xe5801000]strr1,[r0,#0]
      40000110[0xeafffff7]bLOOP
        在AXD Debugger中,將其調(diào)用到RAM中運(yùn)行程序得到循環(huán)部分的GPIO的P0.25腳輸出波形,如圖4所示。
      從圖中可以看出,循環(huán)周期中保持為高電平的時(shí)間為550 ns左右,低電平的時(shí)間為550
      ns左右。與上例比較可知,多出的MUL乘法指令和MOV傳送指令共占用100 ns。

        綜上所述,得出如下結(jié)論: 當(dāng)ARM指令放在RAM中運(yùn)行時(shí),指令“str 
      r0,[r1,#4]”和指令“strr0,[r1,#0xc]”均需350 ns左右,相當(dāng)于14個(gè)指令周期;指令“l(fā)dr
      r0,0x4000012c”的執(zhí)行時(shí)間為100
      ns,相當(dāng)于4個(gè)指令周期;MUL乘法指令和MOV傳送指令共占用100ns,相當(dāng)于4個(gè)指令周期;跳轉(zhuǎn)指令共占用100 ns,相當(dāng)于4個(gè)指令周期。
      3  TMS320F2812工作機(jī)制及指令周期測試
        TMS320F2812是TI公司的一款用于控制的高性能和高性價(jià)比的32位定點(diǎn)DSP芯片。該芯片最高可在150
      MHz主頻下工作(本文將其設(shè)置到100 MHz),并帶有18K×16位0等待周期片上SRAM和128K×16位片上Flash(存取時(shí)間為36
      ns)。TMS320F2812采用哈佛總線結(jié)構(gòu),即在同一個(gè)時(shí)鐘周期內(nèi)可同時(shí)進(jìn)行一次取指令、讀數(shù)據(jù)和寫數(shù)據(jù)的操作,同時(shí)TMS320F2812還通過采用8級流水線來提高系統(tǒng)指令的執(zhí)行速度。
        為了觀察指令周期,對TMS320F2812的GPIOA0進(jìn)行循環(huán)的置位操作和清除操作。C源程序如下:
      #i nclude "DSP28_Device.h"
      void main(void) {
        InitSysCtrl();/*初始化系統(tǒng)*/
        DINT;/*關(guān)中斷*/
        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
        其中最重要的是要對通用輸入/輸出進(jìn)行初始化和確定系統(tǒng)CPU時(shí)鐘。其中系統(tǒng)的時(shí)鐘通過PLL設(shè)定為100 MHz,而初始化 InitGpio()
      的源程序?yàn)椋?BR>      #i nclude "DSP28_Device.h"
      void InitGpio(void)
      { EALLOW;
        //多路復(fù)用器選為數(shù)字I/O
        GpioMuxRegs.GPAMUX.all=0x0000;
        //GPIOAO為輸出,其余為輸入
        GpioMuxRegs.GPADIR.all=0x0001;
        GpioMuxRegs.GPAQUAL.all=0x0000;
        EDIS;
      }
        通過在主程序for(;;)的地方加斷點(diǎn),可以很容易找到上面主程序中循環(huán)部分程序編譯后的匯編指令:
        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列為機(jī)器碼,后面就是匯編語言程序。指令“MOV @32,#0xFFFF”使GPIO輸出高電平,指令“MOV
      @32,#0”使GPIO輸出低電平。其中含有6個(gè)使GPIOA0輸出高電平的指令和3個(gè)使GPIOA0輸出低電平的指令,系統(tǒng)的指令周期為10
      ns,因此循環(huán)周期中保持高電平的時(shí)間為60 ns。通過將該程序放在H0
      SARAM中進(jìn)行調(diào)試,可得GPIOA0的波形,如圖5所示。其中高電平時(shí)間正好為60
      ns。注意,由于3個(gè)低電平之后要進(jìn)行跳轉(zhuǎn),故清空流水線的周期要長一些。

圖5  TMS320F2812中GPIOA0的波形1
        為了觀察乘法指令的周期,將上述循環(huán)部分的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;
      }
        上述程序經(jīng)過編譯、鏈接后的匯編指令如下:
        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個(gè)指令周期(其中包括1個(gè)乘法指令),因?yàn)槌朔ㄖ噶钜彩菃沃芷诘,因此循環(huán)周期中保持高電平的時(shí)間為60
      ns。通過將該程序放在H0 SARAM中進(jìn)行調(diào)試可得GPIOA0的波形,如圖6所示。其中高電平時(shí)間正好為60
      ns,而由于3個(gè)低電平之后要進(jìn)行跳轉(zhuǎn),要清空流水線,而且還要為乘法做準(zhǔn)備,因此保持低電平的時(shí)間比圖5所需的時(shí)間要長。當(dāng)采用數(shù)字式示波器觀察時(shí),如果探頭采用×1檔觀察的波形不是很理想,則可以采用×10檔,并配合調(diào)節(jié)探頭的補(bǔ)償旋鈕。

圖6  TMS320F2812中GPIOA0的波形2
      4  三種微處理器的比較
        首先要強(qiáng)調(diào)的是,這幾種微控制器都可以通過提高晶振的振蕩頻率來縮短指令周期,但是這些控制器的振蕩頻率是有一定限制的,例如單片機(jī)不超過40
      MHz,而LPC2114的頻率不超過60 MHz,TMS320F2812的最高頻率為150
      MHz。在同樣的工作頻率下,ARM指令運(yùn)行的指令周期遠(yuǎn)遠(yuǎn)高于傳統(tǒng)的單片機(jī)。
      因?yàn)閭鹘y(tǒng)的單片機(jī)沒有采用流水線機(jī)制,而ARM核和DSP都采用了流水線,但是由于訪問外設(shè)和RAM等存儲(chǔ)器要加一定的時(shí)鐘周期,因此ARM不是真正可以實(shí)現(xiàn)單周期運(yùn)行的,特別是不能實(shí)現(xiàn)單周期的乘法指令,而DSP可以實(shí)現(xiàn)真正的單周期乘法指令,速度要遠(yuǎn)遠(yuǎn)高于ARM微控制器。
      參考文獻(xiàn)
      [1]  馬忠梅,籍順心,等. 單片機(jī)的C語言應(yīng)用程序設(shè)計(jì). 北京:北京航空航天大學(xué)出版社,2003.
      [2]  薛鈞義,張彥斌. MCS51/96系列單片微型計(jì)算機(jī)及其應(yīng)用. 西安:西安交通大學(xué)出版社,1990.
      [3]  周立功,等. ARM微控制器基礎(chǔ)與實(shí)踐. 北京:北京航空航天大學(xué)出版社,2005.
      [4]  Texas Instruments Incorporated. TMS320C28x Assembly Language Tools
      Users Guide. 2001.
      [5]  Texas Instruments Incorporated. 軟件TMS320C28x Optimizing C C++
      Compiler Users Guide. 2003.


  轉(zhuǎn)載自《單片機(jī)與嵌入式系統(tǒng)應(yīng)用》

 

  • 上一篇: 80C51便攜式產(chǎn)品中的低功耗設(shè)計(jì)
  • 下一篇: 沒有了
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1