在實(shí)時(shí)嵌入式控制系統中,指令周期對系統的性能有至關(guān)重要的影響。介紹幾種最常用的微控制器的工作機制,采用一段循環(huán)語(yǔ)句對這幾種微控制器的指令周期進(jìn)行測試,并進(jìn)行分析比較。分析結論對系統控制器的選擇有一定的指導作用。 在實(shí)時(shí)控制系統中,選擇微控制器的指標時(shí)最重要的是計算速度的問(wèn)題。指令周期是反映計算速度的一個(gè)重要指標,為此本文對三種最具代表性的微控制器(AT89S51單片機、ARM7TDMI核的LPC2114型單片機和TMS320F2812)的指令周期進(jìn)行了分析和測試。為了能觀(guān)察到指令周期,將三種控制器的GPIO口設置為數字輸出口,并采用循環(huán)不斷地置位和清零,通過(guò)觀(guān)察GPIO口的波形變化得到整個(gè)循環(huán)的周期。為了將整個(gè)循環(huán)的周期與具體的每一條指令的指令周期對應起來(lái),通過(guò)C語(yǔ)言源程序得到匯編語(yǔ)言指令來(lái)計算每一條匯編語(yǔ)言的指令周期。 1 AT89S51工作機制及指令周期的測試 AT89S51單片機的時(shí)鐘采用內部方式,時(shí)鐘發(fā)生器對振蕩脈沖進(jìn)行2分頻。由于時(shí)鐘周期為振蕩周期的兩倍(時(shí)鐘周期=振蕩周期P1+振蕩周期P2),而1個(gè)機器周期含有6個(gè)時(shí)鐘,因此1個(gè)機器周期包括12個(gè)晶振的振蕩周期。取石英晶振的振蕩頻率為11.059 2 MHz,則單片機的機器周期為12/11.059 2=1.085 1 μs。51系列單片機的指令周期一般含1~4個(gè)機器周期,多數指令為單周期指令,有2周期和4周期指令。 為了觀(guān)察指令周期,對單片機的P1口的最低位進(jìn)行循環(huán)置位操作和清除操作。源程序如下: #include main() { while(1) { P1=0x01; P1=0x00; } } 采用KEIL uVISION2進(jìn)行編譯、鏈接,生成可執行文件。當調用該集成環(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源程序對應的匯編語(yǔ)言代碼。每行匯編代碼的第1列為該代碼在存儲器中的位置,第2列為機器碼,后面是編譯、鏈接后的匯編語(yǔ)言代碼。所有指令共占用6個(gè)機器周期(其中“MOV P1(0x90),#0x01”占用2個(gè)機器周期,“CLR A”和“MOV P1(0x90),A”各占用1個(gè)機器周期,最后一個(gè)跳轉指令占用2個(gè)機器周期),則總的循環(huán)周期為6×機器周期=6×1.085 1 μs=6.51 μs。 ![]() 圖1 P1口最低位的波形 將編譯、鏈接生成的可執行文件下載到AT89S51的Flash中執行可以得到P1口最低位的波形,如圖1所示。整個(gè)循環(huán)周期為6.1 μs,與上面的分析完全一致。 2 LPC2114工作機制及指令周期的測試 LPC2114是基于A(yíng)RM7TDMI核的可加密的單片機,具有零等待128 KB的片內Flash,16 KB的SRAM。時(shí)鐘頻率可達60 MHz(晶振的頻率為11.059 2 MHz,時(shí)鐘頻率設置為11.059 2×4 =44.236 8 MHz,片內外設頻率為時(shí)鐘頻率的1/4,即晶振的頻率)。ARM7TDMI核通過(guò)使用三級流水線(xiàn)和大量使用內部寄存器來(lái)提高指令流的執行速度,能提供 0.9 MIPS/MHz的指令執行速度,即指令周期為1/(0.9×44.236 8)=0.025 12 μs,約為25 ns。 為了觀(guān)察指令周期,將LPC2114中GPIO的P0.25腳設置為輸出口,并對其進(jìn)行循環(huán)的置位操作和清除操作。C源程序如下: #include"config.h" //P0.25引腳輸出 #defineLEDCON0x02000000 intmain(void) {//設置所有引腳連接GPIO PINSEL0 = 0x00000000; PINSEL1 = 0x00000000; //設置LED4控制口為輸出 IO0DIR = LEDCON; while(1) {IO0SET = LEDCON; IO0CLR = LEDCON; } return(0); } 采用ADS1.2進(jìn)行編譯、鏈接,生成可執行文件。當調用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列為該代碼在存儲器中的位置,第2列為機器碼,后面是編譯、鏈接后的匯編語(yǔ)言代碼。循環(huán)部分的語(yǔ)句最關(guān)鍵的就是下面3句: 4000023c[0xe5810004]strr0,[r1,#4] 40000240[0xe581000c]strr0,[r1,#0xc] 40000244[0xeafffffc]b0x4000023c 在A(yíng)XD Debugger中,將其調用到RAM中運行程序得到循環(huán)部分GPIO的P0.25的輸出波形,如圖2所示。從圖中可以看出,循環(huán)周期中保持為高電平的時(shí)間為1350 ns左右,低電平的時(shí)間為450 ns左右,即指令“str r0,[r1,#4]”和指令“str r0,[r1,#0xc]”均需350 ns左右,而跳轉指令則需100 ns左右。這主要是由于以下原因造成的: ① ARM的大部分指令是單周期的,但是也有一些指令(如乘法指令)是多周期的;② 基于A(yíng)RM核的微控制器只有加載、存儲和交換指令可以對存儲器的數據進(jìn)行訪(fǎng)問(wèn),這樣從存儲器讀數據或向存儲器寫(xiě)數據要增加1個(gè)時(shí)鐘周期;③ 訪(fǎng)問(wèn)片內外設要增加一個(gè)外設時(shí)鐘周期。當然,每個(gè)指令還要有1個(gè)時(shí)鐘周期,跳轉時(shí)要清空流水線(xiàn)還要另加一定的時(shí)鐘周期。 ![]() 圖2 GPIO的P0.25腳輸出波形 為了觀(guān)察乘法指令,特地采用下述匯編語(yǔ)言進(jìn)行了實(shí)驗。首先是沒(méi)有乘法指令的匯編源程序: INCLUDELPC2294.INC ;引入頭文件 ; P0.25引腳控制LED4,低電平點(diǎn)亮 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點(diǎn)亮 STRR1,[R0] ;無(wú)條件跳轉到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 在A(yíng)XD Debugger中,將其調用到RAM中運行程序得到循環(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 在A(yíng)XD Debugger中,將其調用到RAM中運行程序得到循環(huán)部分的GPIO的P0.25腳輸出波形,如圖4所示。從圖中可以看出,循環(huán)周期中保持為高電平的時(shí)間為550 ns左右,低電平的時(shí)間為550 ns左右。與上例比較可知,多出的MUL乘法指令和MOV傳送指令共占用100 ns。 綜上所述,得出如下結論:當ARM指令放在RAM中運行時(shí),指令“str r0,[r1,#4]”和指令“strr0,[r1,#0xc]”均需350 ns左右,相當于14個(gè)指令周期;指令“l(fā)dr r0,0x4000012c”的執行時(shí)間為100 ns,相當于4個(gè)指令周期;MUL乘法指令和MOV傳送指令共占用100ns,相當于4個(gè)指令周期;跳轉指令共占用100 ns,相當于4個(gè)指令周期。 3 TMS320F2812工作機制及指令周期測試 TMS320F2812是TI公司的一款用于控制的高性能和高性?xún)r(jià)比的32位定點(diǎn)DSP芯片。該芯片最高可在150 MHz主頻下工作(本文將其設置到100 MHz),并帶有18K×16位0等待周期片上SRAM和128K×16位片上Flash(存取時(shí)間為36 ns)。TMS320F2812采用哈佛總線(xiàn)結構,即在同一個(gè)時(shí)鐘周期內可同時(shí)進(jìn)行一次取指令、讀數據和寫(xiě)數據的操作,同時(shí)TMS320F2812還通過(guò)采用8級流水線(xiàn)來(lái)提高系統指令的執行速度。 為了觀(guān)察指令周期,對TMS320F2812的GPIOA0進(jìn)行循環(huán)的置位操作和清除操作。C源程序如下: #include "DSP28_Device.h" void main(void) { InitSysCtrl();/*初始化系統*/ 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)行初始化和確定系統CPU時(shí)鐘。其中系統的時(shí)鐘通過(guò)PLL設定為100 MHz,而初始化 InitGpio() 的源程序為: #include "DSP28_Device.h" void InitGpio(void) { EALLOW; //多路復用器選為數字I/O GpioMuxRegs.GPAMUX.all=0x0000; //GPIOAO為輸出,其余為輸入 GpioMuxRegs.GPADIR.all=0x0001; GpioMuxRegs.GPAQUAL.all=0x0000; EDIS; } 通過(guò)在主程序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列為機器碼,后面就是匯編語(yǔ)言程序。指令“MOV @32,#0xFFFF”使GPIO輸出高電平,指令“MOV @32,#0”使GPIO輸出低電平。其中含有6個(gè)使GPIOA0輸出高電平的指令和3個(gè)使GPIOA0輸出低電平的指令,系統的指令周期為10 ns,因此循環(huán)周期中保持高電平的時(shí)間為60 ns。通過(guò)將該程序放在H0 SARAM中進(jìn)行調試,可得GPIOA0的波形,如圖5所示。其中高電平時(shí)間正好為60 ns。注意,由于3個(gè)低電平之后要進(jìn)行跳轉,故清空流水線(xiàn)的周期要長(cháng)一些。 ![]() 圖5 TMS320F2812中GPIOA0的波形1 為了觀(guān)察乘法指令的周期,將上述循環(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)過(guò)編譯、鏈接后的匯編指令如下: 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è)乘法指令),因為乘法指令也是單周期的,因此循環(huán)周期中保持高電平的時(shí)間為60 ns。通過(guò)將該程序放在H0 SARAM中進(jìn)行調試可得GPIOA0的波形,如圖6所示。其中高電平時(shí)間正好為60 ns,而由于3個(gè)低電平之后要進(jìn)行跳轉,要清空流水線(xiàn),而且還要為乘法做準備,因此保持低電平的時(shí)間比圖5所需的時(shí)間要長(cháng)。當采用數字式示波器觀(guān)察時(shí),如果探頭采用×1檔觀(guān)察的波形不是很理想,則可以采用×10檔,并配合調節探頭的補償旋鈕。 ![]() 圖6 TMS320F2812中GPIOA0的波形2 4 三種微處理器的比較 首先要強調的是,這幾種微控制器都可以通過(guò)提高晶振的振蕩頻率來(lái)縮短指令周期,但是這些控制器的振蕩頻率是有一定限制的,例如單片機不超過(guò)40 MHz,而LPC2114的頻率不超過(guò)60 MHz,TMS320F2812的最高頻率為150 MHz。在同樣的工作頻率下,ARM指令運行的指令周期遠遠高于傳統的單片機。因為傳統的單片機沒(méi)有采用流水線(xiàn)機制,而ARM核和DSP都采用了流水線(xiàn),但是由于訪(fǎng)問(wèn)外設和RAM等存儲器要加一定的時(shí)鐘周期,因此ARM不是真正可以實(shí)現單周期運行的,特別是不能實(shí)現單周期的乘法指令,而DSP可以實(shí)現真正的單周期乘法指令,速度要遠遠高于A(yíng)RM微控制器。 參考文獻 [1] 馬忠梅,籍順心,等. 單片機的C語(yǔ)言應用程序設計. 北京:北京航空航天大學(xué)出版社,2003. [2] 薛鈞義,張彥斌. MCS51/96系列單片微型計算機及其應用. 西安:西安交通大學(xué)出版社,1990. [3] 周立功,等. ARM微控制器基礎與實(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. 作者:華中科技大學(xué) 李達義 來(lái)源:《單片機與嵌入式系統應用》2006 (9) |