8051、ARM和DSP指令周期的测试与分析

发布者:DelightfulGaze最新更新时间:2007-01-12 来源: 单片机及嵌入式系统应用关键字:数字  清零  循环  汇编 手机看文章 扫描二维码
随时随地手机看文章
在实时控制系统中,选择微控制器的指标时最重要的是计算速度的问题。指令周期是反映计算速度的一个重要指标,为此本文对三种最具代表性的微控制器(AT89S51单片机、ARM7TDMI核的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”和“MOVP1(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的SRAM。时钟频率可达60 MHz(晶振的频率为11.059 2 MHz,时钟频率设置为11.059 2×4 =44.236 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引脚输出
  #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个指令周期。

3 TMS320F2812工作机制及指令周期测试

TMS320F2812是TI公司的一款用于控制的高性能和高性价比的32位定点DSP芯片。该芯片最高可在150 MHz主频下工作(本文将其设置到100 MHz),并带有18K×16位0等待周期片上SRAM和128K×16位片上Flash(存取时间为36 ns)。TMS320F2812采用哈佛总线结构,即在同一个时钟周期内可同时进行一次取指令、读数据和写数据的操作,同时TMS320F2812还通过采用8级流水线来提高系统指令的执行速度。

为了观察指令周期,对TMS320F2812的GPIOA0进行循环的置位操作和清除操作。C源程序如下:

#include "DSP28_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 "DSP28_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。在同样的工作频率下,ARM指令运行的指令周期远远高于传统的单片机。 因为传统的单片机没有采用流水线机制,而ARM核和DSP都采用了流水线,但是由于访问外设和RAM等存储器要加一定的时钟周期,因此ARM不是真正可以实现单周期运行的,特别是不能实现单周期的乘法指令,而DSP可以实现真正的单周期乘法指令,速度要远远高于ARM微控制器。

参考文献

[1] 马忠梅,籍顺心,等. 单片机的C语言应用程序设计. 北京:北京航空航天大学出版社,2003.
[2] 薛钧义,张彦斌. MCS51/96系列单片微型计算机及其应用. 西安:西安交通大学出版社,1990.
[3] 周立功,等. ARM微控制器基础与实践. 北京:北京航空航天大学出版社,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.

关键字:数字  清零  循环  汇编 引用地址:8051、ARM和DSP指令周期的测试与分析

上一篇:基于Holtek单片机的遥控探照灯系统实现
下一篇:基于单片机的四位BCD编码器电路设计

推荐阅读最新更新时间:2024-03-16 12:18

数字接口的压力传感器MS5607-B
S5607-B高度计压力传感器采用SPI和I 2 C数字接口,测量范围为10~1,200 mbar,温度补偿范围为40°C~+85°C。该传感器模块工作电压为1.8V~3.6V,包括有高线性度压力传感器和具有在制造工厂已校准好系数的低功耗24位ADC。MS5607-B还包括温度输出,尺寸为5 mm x 3 mm x 1 mm,几乎可以接口到任何微控制器。现可提供样品,单价大约为$16,6月份开始可批量定制。
[模拟电子]
<font color='red'>数字</font>接口的压力传感器MS5607-B
基于MSP430F449的数字频率计设计
本文利用前置分频器SAB6456A和高速数字分频器74HC390的分频功能,结合新型的MSP430F449单片机,给出了一种新颖的、全自动的数显测量射频频率的设计方案。 图1 信号的前端处理及分频电路 主要器件介绍 MSP430F449单片机   MSP430F449 采用16位RISC结构,具有丰富的片内外设和大容量的片内工作寄存器和存储器,性能价格比很高。它的特点包括: · 超低的功耗:能够在1.8V~ 3.6V的电压下工作;具有工作模式(AM)和5种低功耗模式(LPM)。在低功耗模式下,CPU可以被中断唤醒,响应时间小于6ps。 · 较强的运算能力:16位的RISC结构,丰富的寻址方式;具有16个中断源,可以任意嵌套
[应用]
大华股份以视频超感知融合能力助力企业实现数字化转型
由中国通信学会、中国电子学会联合主办的 2020 年全国物联网技术与应用大会圆满落下帷幕。本届大会汇集国家部委、两院院士、科研院所、高校、企业、社会团体等多方资源搭建学术交流平台,对物联网与实体经济深度融合,推动传统产业数字化、网络化、智能化发展进行深入探讨。浙江大华技术股份有限公司(以下简称“大华股份”)受邀参会。 会上,大华股份研发中心副总裁李广义发表《数智筑行,慧企未来》主题演讲,分享了以视频为核心的工业物联超感知融合解决方案及丰富行业应用场景,助力企业数字化转型,实现安全、生产及经营全面提升。 《数智筑行,慧企未来》主题演讲 视频超感知融合是工业物联网技术发展的必然趋势 当今社会,工业物联网已经成为物理工厂与
[嵌入式]
大华股份以视频超感知融合能力助力企业实现<font color='red'>数字</font>化转型
数字电视发射机中功率放大器的设计
摘要:用最新的LDMOS FET器件,采用平衡放大电路结构?熏设计数字电视发射机中的功率放大器。工作频段在470MHz~860MHz,整个频带内增益在12dB左右,工作在线性状态,交调抑制小于-35dB。 关键词:功率放大器 匹配 增益 数字电视地面广播技术采用数字压缩技术,在同样清晰度和音质情况下,用户可以接收的节目数量提高4~6倍。同一信道中,可同时传输附加数据和其他信息,且抗干扰能力强,覆盖区域内近场和远场的接收效果几乎相同,因此,数字电视受到了广泛的关注。 欧美一些国家对数字电视技术的研究较为深入,已研制出了性能完善的数字电视信号发射机。我国数字电视技术的研究起步相对较晚,还处在实验阶段。为降低成本,数字电视发射机的
[网络通信]
数字语音解码器的低功耗设计方案
近年来,随着个人手持多媒体设备的快速增长, 低功耗设计 变得越来越重要,甚至成为决定产品是否成功的关键,如笔记本电脑、PDA、移动电话等时尚消费和商务类电子产品,对电池的供电时间要求越来越高,高功耗成为延长电池使用时间突出的制约因素。 CMOS数字电路的功耗主要由3部分组成:跳变功耗、短路功耗和静态漏电功耗。其中占系统功耗比例大于90%的为跳变功耗,也称动态功耗。对于SoC而言,所有的设计方法都是围绕着动态功耗来进行。如何从各个层次、各个方面尽量减少动态功耗,将是语音解码设计中的重点内容。 1 语音 解码器 的低功耗设计策略 SoC低功耗的设计应该从顶层到底层各个阶段进行优化设计的工作,主要运用各级的低功耗策略,通常在系统级、算法
[嵌入式]
慢慢走向成熟的智能数字视频监控系统
 对于每个人而言,平安是幸福生活最基本的要素之一,而如何保障平安生活,无疑需要时刻有一双慧眼的保护。无论是生活安全的监控、突发事件的预警、交通违章情况和流量监控还是重点场所的安全保障,甚至山林火险监控、边界和领海各种情况的监控等,都需要先进的智能数字视频监控系统做保障。   具体到中国,人口众多地域辽阔的特点仅仅依靠人力很难满足保障国土安全、人民安居乐业的需求。因此,无论近年来全球经济如何动荡,中国的公共安防市场却总是保持旺盛增长的势头。“平安中国”计划的推广,特别是随着2008年北京成功举办奥运会过程中,国产的监控产品广泛被采用,表现不凡,进一步引发了国内数字化视频监控产业的发展。   数字视频监控系统是以数字视频处理技
[工业控制]
使用RIGOL程控数字示波器对电源纹波进行有效测量
国内电源行业对产品的检测已经普遍采用了自动测量系统,整个系统中会包含多种测量项目,大多数测试可以使用自动测量(使用程控测量测试设备)。但是纹波噪声却是个特例,很多电源企业还是通过人工操作对纹波噪声进行测量,这样很大程度上影响了生产效率。本文介绍的方案是基于RIGOL程控数字示波器,实现对电源纹波进行快捷可靠测量的。 纹波与噪声指的是什么 可以说任何直流电源都含有纹波与噪声,如图1所示: A. 噪声:通常我们用Vpp来表示噪声,也就是波形的最高点与最低点的差值(启用示波器的自动测量功能中Vpp测量即可得出Vpp的值); B. 纹波:纹波的产生主要源于开关切换与整流过程,通常我们用RMS(均方根值)来表示纹波,一般用RMS R
[测试测量]
使用RIGOL程控<font color='red'>数字</font>示波器对电源纹波进行有效测量
新型六位半数字电压测量模块助力突破工业精密测量边界
俗话说“差之毫厘,谬以千里”,在当下精密工业领域,仪表测量的精确性直接影响生产过程中的自动化控制水平及设备工作的安全可靠性。电压,作为电力系统中的基本参数之一,如何借助小尺寸且易于系统集成的高可靠性单元实现精确测量,成为众多领域客户提出的创新性需求。作为全球领先的半导体技术提供商, ADI开创性推出了新型六位半数字电压测量模块,大大降低了实现精确电压测量的门槛。 多种场景下的高精度电压信号采集挑战如何破? 事实上,无论是在电子系统设计中进行电压采样和功耗测试,还是在半导体自动化测试过程中控制和监测输入电压以保障测试的精确度,或是在实验室环境中利用数字电压测量单元确保实验结果的精确性和可重复性,高精度电压信号的采集在多领域
[测试测量]
新型六位半<font color='red'>数字</font>电压测量模块助力突破工业精密测量边界
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved