登录站点

用户名

密码

嵌入式系统的软件延时设计

1已有 1332 次阅读  2009-12-23 10:05

嵌入式系统的软件延时设计

嵌入式系统的软件延时一般分为两种模式:一是通过循环空操作,即查询模式,二是通过中断的方式。实践证明,在第一种模式中,C语言编程的延时在单片机、ARMDSP之间不能简单的进行移植。在工作中,有的工程师不顾程序的执行背景,程序的执行效率简单的移植延时程序,结果系统常常出现意想不到的情况,而本人更是找不到“意外情况”产生的原因。下面简单的对单片机、ARMDSP/FPG A的延时程序加以分析。分析重在错误定位。

 

一.        C语言编程的软件延时的写法

typedef unsigned char  uint8;                   // defined for unsigned 8-bits integer variable       无符号8位整型变量 

typedef signed   char  int8;                    // defined for signed 8-bits integer variable           有符号8位整型变量 

typedef unsigned short uint16;                  // defined for unsigned 16-bits integer variable       无符号16位整型变量

typedef signed   short int16;                   // defined for signed 16-bits integer variable          有符号16位整型变量

typedef unsigned int   uint32;                  // defined for unsigned 32-bits integer variable      无符号32位整型变量

typedef signed   int   int32;                   // defined for signed 32-bits integer variable         有符号32位整型变量

typedef float          fp32;                    // single precision floating point variable (32bits) 单精度浮点数(32位长度)

typedef double         fp64;                    // double precision floating point variable (64bits) 双精度浮点数(64位长度)
模式A

void  DelayNS(uint32  delay1,uint32  delay2)

{

       uint32   i,j;

      

       for(i=0; i< delay1;i++)

              for(j=0;j<delay2;j++);

}           

模式B

void  DelayNS(uint32  delay1,uint32  delay2)

{

       uint32   i,j;

      

       for(i=delay1; i!=0;i--)

              for(j=delay2;j!=0;j--);

}           

ARM中,这种延时的编写方式循环执行的效率没有下一种高,因为模式A中需要3条指令来实现for循环结构:

一条ADD指令,增加i的值;

一条CMP比较指令,检查i是否小于delay1;

一条BCC条件分支指令,如果i<delay1,则继续循环;

在模式B中,一个循环只要2条指令足够:

一条减法指令,进行循环减计数,同时设置结果的条件标志;

一条条件分支指令。

这里的关键是,循环的终止条件应为减计数到零,而不是计数增加到某个特定的限定值。由于减计数结果已存储在条件标志里,与零比较的指令就可以省略了。另外,无论对于有符号还是无符号的循环计数值,都应使用i!=0作为循环的结束条件。对有符号数i,这比使用条件i>0少了一条指令。

 

模式C

如果用do-while循环会比for循环呈现出更好的性能和代码密度。

Int  delay(uint32  i)

{

    Do{

        }

While (--i!=0);

}

ARM中,这三种模式的编译指令周期方式不一样,即使循环的数值一样,在精确的延时中也不能简单的相互替代。有兴趣的工程师可以通过示波器观察延时的结果。

二.        为什么相同的C编程延时程序在单片机、ARM中不可以执行相同的延时时间?

原因1:对于8位单片机而言,指令是顺序执行,不具有三级流水线结构;ARM7一般是三级流水线结构,即取指->译码->执行。二者之间的指令执行效率不一样。

原因2:单片机的寄存器一般是8bits,而ARM7的寄存器一般是32bits,所以对于相同的程序,数据定义为uint8, uint16, uint32, int8, int16, int32单片机和ARM7中相同的程序的执行效率也不一样。

 

三.上述延时程序直接作为子程序调用正确吗?

对于程序中没有中断进程的,基本正确。如果程序中有中断,必须妥善处理中断关系。在精确延时的系统中,软件延时处理过程:关中断->调用子程序->开中断。

 

四.    中断程序的编写方法

设置定时器寄存器,设置其计数器的计数值,以时钟为单位计算延时时间。注意部分单片机的指令执行时间与时钟周期的关系。对于精确的延时,ARM的执行时间必须用仪器测量后适当调整计数值。(程序略)

 

五.    FPGA中的延时程序编写方法

原理与单片机类似,一是对时钟计数,二是分频法。具体的延时精度与器件有关。Actel的器件编程器libero中可以通过SmartGen设置。(程序略)

上一篇: VHDL编写的比较器 下一篇: 问题: 王传福:从山寨大王到中国首富-转贴

分享 举报

发表评论 评论 (1 个评论)

涂鸦板