This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2.8335万:Delay_US()循环计数与DSP28x_usDelay()'s源文件中描述的不一致?

Guru**** 2574265 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/643135/tms320f28335-delay_us-cycle-counts-not-as-described-in-dsp28x_usdelay-s-source-file

部件号:TMS320F2.8335万

您好,

我要提出一个delay_US()循环计数,它与 DSP28x_usDelay()函数的源文件中描述的计数不同。

请您验证我的分析如下。

斯蒂芬

 DSP28x_usDelay函数文件中的注释如下:

;每个循环都有一个9/10的周期开销
;需要五个周期。 LoopCount由提供
;下面的公式:
; DELAY CPU_CYCLES =9+5*LoopCount
; LoopCount =(DELAY CPU_CYCLES -9)/ 5
;宏delay_US(A)将为您执行此计算

我数了3 (3个mov指令)+4 (LCR)+4 (LRETR)=11个开销周期(参见 下面的main()和DSP28x_usDelay()组件)。  是这样吗?

此外,如果传递给  DSP28x_usDelay()的计算延迟循环计数为n,我发现  DSP28x_usDelay()中的循环间期数为n+1。  是这样吗?

例如,如果n=4 (即 150MHz 2.8335万的总周期计数为11+(n+1)*5=11+25=36个周期,相当于36*6.667ns =0.240us。  是这样吗?

C代码:

/*
* main.c
*/
#define CPU_rate 6.667L
extern void DSP28x_usDelay (Long int DelayTime);
#define computed_loop_count(A)(long int)((((((((((( long double) a * 1000.0L)/(long double) cpu_rate)- 9.0L)/5.0L)
#define delay_US (a) DSP28x_usDelay ((long int)(((((( long double) a * 1000.0L)/(long double) cpu_rate)-9.0L)/5.0L)

volatile long int a = 0;
int main (void)
{
	
a = computed_loop_count (0.210);
DELAY _US (0.210);
	返回0;
} 

main()汇编代码:

主要:
0.9101万:0204 MOVB ACC,#400.9102万
:761F0300 MOVW DP,#0x3亿
:1E0A MOVL @0xA,符合
14 Delay_US (0.210);
0.9105万:7640.005万 LCR $../DSP2833x_usDelay.ASM:62:75$
15 	返回0;
0.9107万:9A00 MOVB AL,#0x0
16 }
0.9108万:0006 LRETR 

DSP28x_usDelay组件代码: 

62. 子附件,1号
$../DSP2833x_usDelay.ASM:62:75$(),DSP28x_usDelay:
0.005万:1901 副B ACC,1号
63. BF _DSP28x_usDelay,GEQ;;Loop if ACC >= 0.0051万
:56C3FFFF BF -1,GEQ
64 LRETR 



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最好由编译器组来回答此问题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我现在知道代码注释和程序集之间的开销差异是由附加的dp #0x300命令引起的。

    请确认循环时间为5*(n+1) cylcles,其中n是传递给DSP28x_usDelay函数的数字。

    斯蒂芬

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Steven,

    如您所示,延迟回放由减影(子)和分支条件(BF)组成。 分支为4个周期,子分支为1个周期。 因此每次循环的时间为5个周期。

    _DSP28x_usDelay:
    子附件,1号
    BF _DSP28x_usDelay,GEQ;;如果ACC >= 0,则循环
    LRETR
    

    这是否能回答您的问题?


    此致
    Lori

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我只想让其他人验证循环的次数是否为n+1,其中n是在ACC中传递的值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Steven,

    对于以上格式,我们深表歉意。  我同意你的看法。  要真正调整功能或对其进行测试,一种方法是在I/O前后切换。  然后可以在范围上测量持续时间。

    ACC = 3
    子附件,1号 –>附件= 2
    BF _DSP28x_usDelay,GEQ;;如果ACC >= 0 - TRUE,则循环
    
    子附件,1号 ->附件= 1
    BF _DSP28x_usDelay,GEQ;;如果ACC >= 0 - TRUE,则循环
    
    子附件,1号 ->附件= 0
    BF _DSP28x_usDelay,GEQ;;如果ACC >= 0 - TRUE,则循环
    
    子附件,1号 -> ACC =-1
    BF _DSP28x_usDelay,GEQ;; Loop if ACC >= 0–FALSE
    
    	LRETR