嵌入式系统的软件延时设计
热1已有 1332 次阅读 2009-12-23 10:05嵌入式系统的软件延时设计
嵌入式系统的软件延时一般分为两种模式:一是通过循环空操作,即查询模式,二是通过中断的方式。实践证明,在第一种模式中,C语言编程的延时在单片机、ARM、DSP之间不能简单的进行移植。在工作中,有的工程师不顾程序的执行背景,程序的执行效率简单的移植延时程序,结果系统常常出现意想不到的情况,而本人更是找不到“意外情况”产生的原因。下面简单的对单片机、ARM、DSP/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设置。(程序略)
发表评论 评论 (1 个评论)