在实时控制系统中,选择微控制器的指标时最重要的是计算速度的问题。指令周期是反映计算速度的一个重要指标,为此本文对三种最具代表性的微控制器(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<reg51.h>
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是基于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]