ARM_071216d
- 格式:pdf
- 大小:206.96 KB
- 文档页数:11
8051、ARM和DSP指令周期的测试与分析摘要 在实时嵌入式控制系统中,指令周期对系统的性能有至关重要的影响。
介绍几种最常用的微控制器的工作机制,采用一段循环语句对这几种微控制器的指令周期进行测试,并进行分析比较。
分析结论对系统控制器的选择有一定的指导作用。
关键词 指令周期测试 AT89S51 LPC2114 TMS320F2812,ARM,DSP,微控制器,实时控制在实时控制系统中,选择微控制器的指标时最重要的是计算速度的问题。
指令周期是反映计算速度的一个重要指标,为此本文对三种最具代表性的微控制器(AT89S51单片机、ARM7TDMI核的L PC2114型单片机和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<reg51.h>main() {while(1) {P1=0x01;P1=0x00;}}采用KEIL uVISION2进行编译、链接,生成可执行文件。
当调用该集成环境中的Debug时,可以得到上述源程序混合模式的反汇编代码:2:main()3: {4:while(1)5:{6:P1=0x01;0x000F759001MOVP1(0x90),#0x017:P1=0x00;0x0012 E4CLRA0x0013 F590MOVP1(0x90),A8:}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是基于ARM7TDMI核的可加密的单片机,具有零等待128 KB的片内Flash,16 KB的SR AM。
时钟频率可达60 MHz(晶振的频率为11.059 2 MHz,时钟频率设置为11.059 2×4 =44.23 6 8 MHz,片内外设频率为时钟频率的1/4,即晶振的频率)。
ARM7TDMI核通过使用三级流水线和大量使用内部寄存器来提高指令流的执行速度,能提供0.9 MIPS/MHz的指令执行速度,即指令周期为1/(0.9×44.236 8)=0.025 12 μs,约为25 ns。
为了观察指令周期,将LPC2114中GPIO的P0.25脚设置为输出口,并对其进行循环的置位操作和清除操作。
C源程序如下:#include"config.h"//P0.25引脚输出#defineLEDCON0x02000000intmain(void){//设置所有引脚连接GPIOPINSEL0 = 0x00000000;PINSEL1 = 0x00000000;//设置LED4控制口为输出IO0DIR = LEDCON;while(1){IO0SET = LEDCON;IO0CLR = LEDCON;}return(0);}采用ADS1.2进行编译、链接,生成可执行文件。
当调用AXD Debugger时,可以得到上述源程序的反汇编代码:main[0xe59f1020]ldrr1,0x4000024840000224[0xe3a00000]movr0,#040000228[0xe5810000]strr0,[r1,#0]4000022c[0xe5810004]strr0,[r1,#4]40000230[0xe3a00780]movr0,#0x200000040000234[0xe1c115c0]bicr1,r1,r0,asr #1140000238[0xe5810008]strr0,[r1,#8]4000023c[0xe5810004]strr0,[r1,#4]40000240[0xe581000c]strr0,[r1,#0xc]40000244[0xeafffffc]b0x4000023c40000248[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,低电平点亮LEDCONEQU0x02000000EXPORTMAIN;声明程序代码块AREALEDCONC,CODE,READONLY;装载寄存器地址,PINSEL0MAINLDRR0,=PINSEL0;设置数据,即设置引脚连接GPIOMOVR1,#0x00000000STRR1,[R0]; [R0] ← R1LDRR0,=PINSEL1STRR1,[R0]LDRR0,=IO0DIRLDRR1,=LEDCON;设置LED控制口为输出STRR1,[R0];设置GPIO控制参数LOOPLDRR1,=LEDCONLEDSETLDRR0,=IO0SET; LED控制I/O置位,即LED4熄灭STRR1,[R0]LEDCLRLDRR0,=IO0CLR; LED控制I/O复位,即LED4点亮STRR1,[R0];无条件跳转到LOOPB 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图3所示。
从图中可以看出,循环周期中保持为高电平的时间为450 ns左右,低电平的时间为550 ns左右。
图3 GPIO的P0.25脚输出波形2在上例的LOOP循环部分中加入乘法指令,即将循环部分改为:LOOP LDRR1,=LEDCONLEDSETLDRR0,=IO0SETSTRR1,[R0]MOVR2,#0x0234MULR2,R1,R2LEDCLRLDRR0,=IO0CLRSTRR1,[R0]B LOOP采用ADS1.2进行编译、链接后的汇编代码为:LOOP[0xe3a01780]movr1,#0x2000000LEDSET[0xe59f0030]ldrr0,0x40000130400000fc[0xe5801000]strr1,[r0,#0]40000100[0xe3a02f8d]movr2,#0x23440000104[0xe0020291] mulr2,r1,r2LEDCLR[0xe59f0024] ldrr0,0x400001344000010c[0xe5801000]strr1,[r0,#0]40000110[0xeafffff7]bLOOP图4所示。
从图中可以看出,循环周期中保持为高电平的时间为550 ns左右,低电平的时间为550 ns左右。
与上例比较可知,多出的MUL乘法指令和MOV传送指令共占用100 ns。
综上所述,得出如下结论: 当ARM指令放在RAM中运行时,指令“str r0,[r1,#4]”和指令“s trr0,[r1,#0xc]”均需350 ns左右,相当于14个指令周期;指令“ldr r0,0x4000012c”的执行时间为100 ns,相当于4个指令周期;MUL乘法指令和MOV传送指令共占用100ns,相当于4个指令周期;跳转指令共占用100 ns,相当于4个指令周期。
3 TMS320F2812工作机制及指令周期测试TMS320F2812是TI公司的一款用于控制的高性能和高性价比的32位定点DSP芯片。
该芯片最高可在150 MHz主频下工作(本文将其设置到100 MHz),并带有18K×16位0等待周期片上SRA M和128K×16位片上Flash(存取时间为36 ns)。