新聞中心

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

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

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

        在實時嵌入式控制系統中,對系統的性能有至關重要的影響。介紹幾種最常用的微控制器的工作機制,采用一段循環語句對這幾種微控制器的進行測試,并進行分析比較。分析結論對系統控制器的選擇有一定的指導作用。

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

        在實時控制系統中,選擇微控制器的指標時最重要的是計算速度的問題。是反映計算速度的一個重要指標,為此本文對三種最具代表性的微控制器(AT89S51單片機、7TDMI核的LPC2114型單片機和TMS320F2812)的指令周期進行了分析和測試。為了能觀察到指令周期,將三種控制器的GPIO口設置為數字輸出口,并采用循環不斷地置位和清零,通過觀察GPIO口的波形變化得到整個循環的周期。為了將整個循環的周期與具體的每一條指令的指令周期對應起來,通過C語言源程序得到匯編語言指令來計算每一條匯編語言的指令周期。

        1、 AT89S51工作機制及指令周期的測試

        AT89S51單片機的時鐘采用內部方式,時鐘發生器對振蕩脈沖進行2分頻。由于時鐘周期為振蕩周期的兩倍(時鐘周期=振蕩周期P1+振蕩周期P2),而1個機器周期含有6個時鐘,因此1個機器周期包括12個晶振的振蕩周期。取石英晶振的振蕩頻率為11.059 2 MHz,則單片機的機器周期為12/11.059 2=1.085 1 μs。51系列單片機的指令周期一般含1~4個機器周期,多數指令為單周期指令,有2周期和4周期指令。

        為了觀察指令周期,對單片機的P1口的最低位進行循環置位操作和清除操作。源程序如下:

        #include
        main() {
          while(1) {
            P1=0x01;
            P1=0x00;
          }
        }

        采用KEIL uVISION2進行編譯、鏈接,生成可執行文件。當調用該集成環境中的Debug時,可以得到上述源程序混合模式的反匯編代碼:

            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源程序對應的匯編語言代碼。每行匯編代碼的第1列為該代碼在存儲器中的位置,第2列為機器碼,后面是編譯、鏈接后的匯編語言代碼。所有指令共占用6個機器周期(其中“MOV P1(0x90),#0x01”占用2個機器周期,“CLR A”和“MOV P1(0x90),A”各占用1個機器周期,最后一個跳轉指令占用2個機器周期),則總的循環周期為6×機器周期=6×1.085 1 μs=6.51 μs。


        圖1 P1口最低位的波形

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

        2、 LPC2114工作機制及指令周期的測試

        LPC2114是基于7TDMI核的可加密的單片機,具有零等待128 KB的片內Flash,16 KB的SRAM。時鐘頻率可達60 MHz(晶振的頻率為11.059 2 MHz,時鐘頻率設置為11.059 2×4 =44.236 8 MHz,片內外設頻率為時鐘頻率的1/4,即晶振的頻率)。7TDMI核通過使用三級流水線和大量使用內部寄存器來提高指令流的執行速度,能提供 0.9 MIPS/MHz的指令執行速度,即指令周期為1/(0.9×44.236 8)=0.025 12 μs,約為25 ns。

        為了觀察指令周期,將LPC2114中GPIO的P0.25腳設置為輸出口,并對其進行循環的置位操作和清除操作。C源程序如下:

          #includeconfig.h
          //P0.25引腳輸出
          #defineLEDCON0x02000000
          intmain(void)
          {//設置所有引腳連接GPIO
            PINSEL0 = 0x00000000;
            PINSEL1 = 0x00000000;
            //設置LED4控制口為輸出
            IO0DIR = LEDCON;
            while(1)
            {IO0SET = LEDCON;
              IO0CLR = LEDCON;
            }
          return(0);
        }

        采用ADS1.2進行編譯、鏈接,生成可執行文件。當調用AXD Debugger時,可以得到上述源程序的反匯編代碼:

          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列為該代碼在存儲器中的位置,第2列為機器碼,后面是編譯、鏈接后的匯編語言代碼。循環部分的語句最關鍵的就是下面3句:

          4000023c[0xe5810004]strr0,[r1,#4]
          40000240[0xe581000c]strr0,[r1,#0xc]
          40000244[0xeafffffc]b0x4000023c

        在AXD Debugger中,將其調用到RAM中運行程序得到循環部分GPIO的P0.25的輸出波形,如圖2所示。從圖中可以看出,循環周期中保持為高電平的時間為1350 ns左右,低電平的時間為450 ns左右,即指令“str r0,[r1,#4]”和指令“str r0,[r1,#0xc]”均需350 ns左右,而跳轉指令則需100 ns左右。這主要是由于以下原因造成的: ① ARM的大部分指令是單周期的,但是也有一些指令(如乘法指令)是多周期的;② 基于ARM核的微控制器只有加載、存儲和交換指令可以對存儲器的數據進行訪問,這樣從存儲器讀數據或向存儲器寫數據要增加1個時鐘周期;③ 訪問片內外設要增加一個外設時鐘周期。當然,每個指令還要有1個時鐘周期,跳轉時要清空流水線還要另加一定的時鐘周期。

        圖2 GPIO的P0.25腳輸出波形

        為了觀察乘法指令,特地采用下述匯編語言進行了實驗。首先是沒有乘法指令的匯編源程序:

          INCLUDELPC2294.INC ;引入頭文件
        ; P0.25引腳控制LED4,低電平點亮
        LEDCONEQU0x02000000
          EXPORTMAIN
        ;聲明程序代碼塊
          AREALEDCONC,CODE,READONLY
        ;裝載寄存器地址,PINSEL0
        MAINLDRR0,=PINSEL0
        ;設置數據,即設置引腳連接GPIO
          MOVR1,#0x00000000
          STRR1,[R0]; [R0] ← R1
          LDRR0,=PINSEL1
          STRR1,[R0]
          LDRR0,=IO0DIR
          LDRR1,=LEDCON
        ;設置LED控制口為輸出
          STRR1,[R0]
        ;設置GPIO控制參數
        LOOPLDRR1,=LEDCON
        LEDSETLDRR0,=IO0SET
        ; LED控制I/O置位,即LED4熄滅
          STRR1,[R0]
        LEDCLRLDRR0,=IO0CLR
        ; LED控制I/O復位,即LED4點亮
          STRR1,[R0]
        ;無條件跳轉到LOOP
          B LOOP

        采用ADS1.2進行編譯、鏈接后的匯編代碼為:

        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中,將其調用到RAM中運行程序得到循環部分的GPIO的P0.25腳輸出波形,如圖3所示。 從圖中可以看出,循環周期中保持為高電平的時間為450 ns左右,低電平的時間為550 ns左右。



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

        在上例的LOOP循環部分中加入乘法指令,即將循環部分改為:

        LOOP LDRR1,=LEDCON
        LEDSETLDRR0,=IO0SET
          STRR1,[R0]
          MOVR2,#0x0234
          MULR2,R1,R2
        LEDCLRLDRR0,=IO0CLR
          STRR1,[R0]
          B LOOP

        采用ADS1.2進行編譯、鏈接后的匯編代碼為:

        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中,將其調用到RAM中運行程序得到循環部分的GPIO的P0.25腳輸出波形,如圖4所示。從圖中可以看出,循環周期中保持為高電平的時間為550 ns左右,低電平的時間為550 ns左右。與上例比較可知,多出的MUL乘法指令和MOV傳送指令共占用100 ns。

        綜上所述,得出如下結論:當ARM指令放在RAM中運行時,指令“str r0,[r1,#4]”和指令“strr0,[r1,#0xc]”均需350 ns左右,相當于14個指令周期;指令“ldr r0,0x4000012c”的執行時間為100 ns,相當于4個指令周期;MUL乘法指令和MOV傳送指令共占用100ns,相當于4個指令周期;跳轉指令共占用100 ns,相當于4個指令周期。


        上一頁 1 2 下一頁

        關鍵詞: DSP 指令周期 ARM

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 五原县| 冕宁县| 玉环县| 宜宾县| 郁南县| 准格尔旗| 水富县| 尚志市| 醴陵市| 白沙| 龙岩市| 九龙坡区| 青河县| 铁力市| 西乌珠穆沁旗| 塔河县| 磐石市| 抚顺县| 临城县| 永宁县| 西昌市| 苍山县| 宁国市| 高平市| 龙陵县| 南昌市| 城固县| 汕头市| 辽中县| 临桂县| 海林市| 潼南县| 灵寿县| 会昌县| 楚雄市| 泽州县| 虎林市| 章丘市| 富源县| 彭阳县| 长白|