这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » 循环结构的延时计算,怎么算延时了多长啊!

共32条 1/4 1 2 3 4 跳转至

循环结构的延时计算,怎么算延时了多长啊!

菜鸟
2013-08-29 17:32:07     打赏
想问下,
for(i=0;i<5000;i++);
这个循环是延时了多长时间啊,大家又是怎么算的????
像我要延时10ms,又是怎么设定啊??????
就算是一个大概的延时都要算下的吧???
拜托,帮帮忙?????????????



关键词: 循环     结构     延时     计算     怎么     多长    

工程师
2013-08-29 17:44:39     打赏
2楼

这是用什么做的?时钟多少,这种只能是个大概的延时时间


高工
2013-08-29 20:27:22     打赏
3楼

一个加法两个指令周期,大概这么可以换算

如果来实现延时的话,可以用汇编做,例如

;// TI File $Revision: /main/4 $
;// Checkin $Date: July 30, 2007   10:28:57 $
;//###########################################################################
;//
;// FILE:  DSP2833x_usDelay.asm
;//
;// TITLE: Simple delay function
;//
;// DESCRIPTION:
;//  
;// This is a simple delay function that can be used to insert a specified
;// delay into code.  
;// 
;// This function is only accurate if executed from internal zero-waitstate
;// SARAM. If it is executed from waitstate memory then the delay will be
;// longer then specified. 
;// 
;// To use this function:
;//
;//  1 - update the CPU clock speed in the DSP2833x_Examples.h
;//    file. For example:
;//    #define CPU_RATE 6.667L // for a 150MHz CPU clock speed
;//    or #define CPU_RATE 10.000L // for a 100MHz CPU clock speed 
;//
;//  2 - Call this function by using the DELAY_US(A) macro
;//    that is defined in the DSP2833x_Examples.h file.  This macro
;//    will convert the number of microseconds specified
;//    into a loop count for use with this function.  
;//    This count will be based on the CPU frequency you specify.
;//
;//  3 - For the most accurate delay 
;//    - Execute this function in 0 waitstate RAM.  
;//    - Disable interrupts before calling the function
;//      If you do not disable interrupts, then think of
;//      this as an "at least" delay function as the actual
;//      delay may be longer. 
;//
;//  The C assembly call from the DELAY_US(time) macro will
;//  look as follows: 
;//
;//  extern void Delay(long LoopCount);                
;//
;//        MOV   AL,#LowLoopCount
;//        MOV   AH,#HighLoopCount
;//        LCR   _Delay
;//
;//  Or as follows (if count is less then 16-bits):
;//
;//        MOV   ACC,#LoopCount
;//        LCR   _Delay
;//
;//
;//###########################################################################
;// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $
;// $Release Date: August 1, 2008 $
;//###########################################################################


       .def _DSP28x_usDelay
       .sect "ramfuncs"


        .global  __DSP28x_usDelay
_DSP28x_usDelay:
        SUB    ACC,#1
        BF     _DSP28x_usDelay,GEQ    ;; Loop if ACC >= 0
        LRETR 


;There is a 9/10 cycle overhead and each loop
;takes five cycles. The LoopCount is given by
;the following formula:
;  DELAY_CPU_CYCLES = 9 + 5*LoopCount
; LoopCount = (DELAY_CPU_CYCLES - 9) / 5
; The macro DELAY_US(A) performs this calculation for you
;
;//===========================================================================
;// End of file.
;//===========================================================================


助工
2013-08-30 07:26:07     打赏
4楼
哦,我说的是在TMS320F2812中!!!!

高工
2013-08-30 21:29:27     打赏
5楼
您好像没有问问题啊?

高工
2013-08-30 21:40:18     打赏
6楼

想要2812的也是类似的道理啊

;//###########################################################################
;//
;// FILE:  DSP281x_usDelay.asm
;//
;// TITLE: Simple delay function
;//
;// DESCRIPTION:
;//  
;// This is a simple delay function that can be used to insert a specified
;// delay into code.  
;// 
;// This function is only accurate if executed from internal zero-waitstate
;// SARAM. If it is executed from waitstate memory then the delay will be
;// longer then specified. 
;// 
;// To use this function:
;//
;//  1 - update the CPU clock speed in the DSP281x_Examples.h
;//    file. For example:
;//    #define CPU_CLOCK_SPEED 6.6667L // for a 150MHz CPU clock speed
;//
;//  2 - Call this function by using the DELAY_US(A) macro
;//    that is defined in the DSP28_Device.h file.  This macro
;//    will convert the number of microseconds specified
;//    into a loop count for use with this function.  
;//    This count will be based on the CPU frequency you specify.
;//
;//  3 - For the most accurate delay 
;//    - Execute this function in 0 waitstate RAM.  
;//    - Disable interrupts before calling the function
;//      If you do not disable interrupts, then think of
;//      this as an "at least" delay function as the actual
;//      delay may be longer. 
;//
;//  The C assembly call from the DELAY_US(time) macro will
;//  look as follows: 
;//
;//  extern void Delay(long LoopCount);                
;//
;//        MOV   AL,#LowLoopCount
;//        MOV   AH,#HighLoopCount
;//        LCR   _Delay
;//
;//  Or as follows (if count is less then 16-bits):
;//
;//        MOV   ACC,#LoopCount
;//        LCR   _Delay
;//
;//
;//###########################################################################
;//
;//  Ver | dd mmm yyyy | Who  | Description of changes
;// =====|=============|======|===============================================
;//  1.00| 11 Sep 2003 | L.H. | No changes since v.58
;//###########################################################################


       .def _DSP28x_usDelay
       .sect "ramfuncs"


        .global  __DSP28x_usDelay
_DSP28x_usDelay:
        SUB    ACC,#1
        BF     _DSP28x_usDelay,GEQ    ;; Loop if ACC >= 0
        LRETR 


;There is a 9/10 cycle overhead and each loop
;takes five cycles. The LoopCount is given by
;the following formula:
;  DELAY_CPU_CYCLES = 9 + 5*LoopCount
; LoopCount = (DELAY_CPU_CYCLES - 9) / 5
; The macro DELAY_US(A) performs this calculation for you
;==================================================


菜鸟
2013-09-02 07:38:11     打赏
7楼
我这里分享的两本书中关于2812的那本书里面有用CCS去计算这个循环函数时间的方法
你去看看
http://bbs.21ic.com/icview-587149-1-1.html

高工
2013-09-02 13:00:16     打赏
8楼

这个就是用profle来测试的,本质还是计算的指令执行周期

我的书里面有,或者简写为

在你要测试时间的程序的两端,用Project Toolbar上的Toggle profile point按键,加上profile print,像断点一样,不过是绿色的。然后在profiler菜单中选择Enable Clock和view clock,在view clock窗口中可以看到程序运行的时间/周期(时钟)数。在view clock窗口中第2行显示的时间就是程序从第1行所在位置到第2行位置的时间,也就是你要测定的时间。


高工
2013-09-02 17:18:01     打赏
9楼
楼主先需要搞清机器周期和指令周期的概念

高工
2013-09-02 18:07:41     打赏
10楼
看汇编指令 不过用这种的精度要求很低,放板上跑一下就是了 要求高的上定时器

共32条 1/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]