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.

[参考译文] TMS320F2811:在同一系统时钟上、F2811和 F2809的 CPU 执行速度不同。

Guru**** 2524290 points
Other Parts Discussed in Thread: TMS320F2809, TMS320F2811

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/754536/tms320f2811-cpu-execution-speed-is-different-between-f2811-and-f2809-at-the-same-system-clock

器件型号:TMS320F2811
主题中讨论的其他器件:TMS320F2809

您好!

问题在于 TMS320F2809和 TMS320F2811之间的 CPU 速度比较。

我使用硬件计时器来测量执行时间。 代码如下所示。

lTimerStart = ReadCpuTimer0Counter();
for (iTestCpuSpeed1 = 0;iTestCpuSpeed1 < iTestCpuSpeed2;iTestCpuSpeed1++);
lTimerEnd = ReadCpuTimer0Counter ();//递减计数器
if (lTimerEnd > lTimerStart){//后续处理
  lTimerGap = lTimerEnd - lTimerStart + CpuTimer0Regs.PRD.all;

否则{
  lTimerGap = lTimerStart - lTimerEnd;

TMS320F2809与20MHz OSC 搭配使用、TMS320F2811与30MHz OSC 搭配使用。

对于这两种模式、PLL 都设置为60MHz。

iTestCpuSpeed2为10。

结果是、对于 F2809和 F2811、lTimerGap 分别为179和188。

F2809比 F2811稍快一些。

您如何解释这一点?

谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    差异不太可能是器件。 由于差异仅为少量周期、我怀疑编译器生成的汇编代码略有不同。

    首先检查代码在这两种情况下都位于0等待状态 RAM 中。 此外、如果 F2811早于 Rev.C、则需要执行一些额外的存储器初始化操作(请参阅勘误表第10页上的通报)。

    然后在拆分窗口中查看生成的汇编代码。 这可能会为您提供有关周期丢失位置的一些线索。 此外、请检查您的两个项目中的编译器设置、尤其是优化器。 这很可能是差异的来源。

    此致、

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

    1、代码从闪存中执行。

    2.我已初始化勘误表中的内存、没有区别。

    我比较了汇编代码。

    这是 F2811的汇编代码。

    .dwpsn 文件"Mot_PWM.C"、第602行、第2列、is_stmt
    MOVW DP、#_CpuTimer0Regs
    MOVL ACC、@ë_CpuTimer0Regs;|602|
    MOVW DP、#_lTimerStart
    MOVL @_lTimerStart、ACC;|602|
    .dwpsn 文件"Mot_PWM.C"、第603行、第6列、is_stmt
    MOVW DP、#_iTestCpuSpeed1
    MOV @μ_iTestCpuSpeed1、#0;|603|
    .dwpsn 文件"Mot_PWM.C"、第603行、第26列、is_stmt
    MOV AL,@μ_iTestCpuSpeed2;|603|
    CMP AL,@Ω_iTestCpuSpeed1;|603|
    b $C$L35, LOS;|603|
    ;出现 branchcc;|603|
    $C$L34:
    $C$DW$L$_PWM_ISR$67B:
    .dwpsn 文件"Mot_PWM.C"、第603行、第59列、is_stmt
    Inc @ iTestCpuSpeed1;|603|
    .dwpsn 文件"Mot_PWM.C"、第603行、第26列、is_stmt
    CMP AL,@Ω_iTestCpuSpeed1;|603|
    b $C$L34, HI ;|603|
    ;出现 branchcc;|603|
    $C$DW$L$_PWM_ISR$67$E:
    $C$L35:
    .dwpsn 文件"Mot_PWM.C"、第604行、第2列、is_stmt
    MOVW DP、#_CpuTimer0Regs
    MOVL ACC,@ë_CpuTimer0Regs;|604|
    MOVW DP、#_lTimerEnd
    MOVL @_lTimerEnd,ACC;|604|
    .dwpsn 文件"Mot_PWM.C"、第605行、第2列、is_stmt
    MOVL ACC,@_lTimerStart;|605|
    cmpl acc、@μ_lTimerEnd;|605|
    b $C$L36,GEQ;|605|
    ;出现 branchcc;|605|
    .dwpsn 文件"Mot_PWM.C"、第606行、第3列、is_stmt
    MOVL ACC,@ć_lTimerEnd;|606|
    SUBL ACC、@μ_lTimerStart;|606|
    MOVW DP、#_CpuTimer0Regs+2
    Addl ACC、@ć_CpuTimer0Regs+2;|606|
    MOVW DP、#_lTimerGap
    MOVL @_lTimerGap,ACC;|606|
    .dwpsn 文件"Mot_PWM.C"、第607行、第2列、is_stmt
    b $C$L37,UNC ;|607|
    ;分支发生;|607|
    $C$L36:
    .dwpsn 文件"Mot_PWM.C"、第609行、第3列、is_stmt
    MOVL ACC,@_lTimerStart;|609|
    SUBL ACC、@μ_lTimerEnd;|609|
    MOVL @_lTimerGap,ACC;|609|

    这是 F2809的汇编代码。

    MOVW DP、#_CpuTimer0Regs
    MOVL ACC、@ë_CpuTimer0Regs;|1026|
    MOVW DP、#_lTimerStart
    MOVL @_lTimerStart、ACC;|1026|
    MOVW DP、#_iTestCpuSpeed1
    MOV @μ_iTestCpuSpeed1、#0;|1027|
    MOV AL,@μ_iTestCpuSpeed2;|1027|
    CMP AL,@μ_iTestCpuSpeed1;|1027|
    b $C$L52, LOS;|1027|
    ;出现 branchcc;|1027|
    $C$L51:
    $C$DW$L$_PWM_ISR$102$B:
    Inc @ iTestCpuSpeed1;|1027|
    CMP AL,@μ_iTestCpuSpeed1;|1027|
    b $C$L51,HI;|1027|
    ;出现 branchcc;|1027|
    $C$DW$L$_PWM_ISR$102$E:
    $C$L52:
    MOVW DP、#_CpuTimer0Regs
    MOVL ACC、@ë_CpuTimer0Regs;|1028|
    MOVW DP、#_lTimerEnd
    MOVL @_lTimerEnd,ACC;|1028|
    MOVW DP、#_lTimerStart
    MOVL ACC,@_lTimerStart;|1029|
    MOVW DP、#_lTimerEnd
    cmpl acc、@μ_lTimerEnd;|1029|
    b $C$L53, GEQ;|1029|
    ;出现 branchcc;|1029|
    MOVL ACC,@μ_lTimerEnd;|1030|
    MOVW DP、#_lTimerStart
    SUBL ACC、@μ_lTimerStart;|1030|
    MOVW DP、#_CpuTimer0Regs+2
    Addl ACC、@ë_CpuTimer0Regs+2;|1030|
    b $C$L54,UNC;|1031|
    ;分支发生;|1031|
    C$L53:
    MOVW DP、#_lTimerStart
    MOVL ACC,@_lTimerStart;|1033|
    MOVW DP、#_lTimerEnd
    SUBL ACC、@μ_lTimerEnd;|1033|
    C$L54:
    MOVW DP、#_lTimerGap
    MOVL @_lTimerGap,ACC;|1033|

    去除不必要的行后、汇编代码如下所示。

    左侧是 F2811、右侧是 F2809。 汇编代码几乎相同。

    在映射文件中、变量的地址与此类似。

    F2809.

    F2811

    在这两种情况下、均使用 RAM H 区域。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定。 我无法强制在我可以访问的'069和'379器件之间存在类似代码的差异。

    对于 F2811和 F2809、CPU 和 CPU 定时器在这些器件上是相同的、因此如果您看到周期计数的差异、则只能归因于代码或存储器访问时序。 您是否检查了我询问的 F2811器件版本?

    在 C 语言中编写代码时、依赖编译器来执行一致的任务来生成高效的汇编代码。 对编译器设置的更改可能会影响这一点、编译器版本也可能会影响这一点。 链接器也需要以一致的方式设置、以便变量位于类似的位置。 从反汇编代码中、我可以看到 F2811中有更多的 DP 负载(与我预期的测量结果相反-您能否仔细检查左侧的 F2811?)。 这可能是因为当您为该器件构建时、变量"_iTimerStart"和"iTimerEnd"不在同一数据页上、而是当您为 F2809构建时。

    在我看来、为了测量器件间的准确时序、最好是在汇编语言中进行编码。 在这种情况下、我只能建议您单步执行汇编代码、以尝试识别额外周期的进入位置。 您可以使用 CCS 时钟来帮助解决此问题。

    您能否发布您正在使用的编译器设置?

    此致、

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

    您好!

    CCS 工程文件(.pjt)中的编译器设置如下。 我使用'Debug'配置、以便显示'Debug'设置。 我使用 Code Composer Studio V3.3和代码生成工具5.2.12。

    [F2811]

    ["Compiler"设置:"Debug"]
    options=-g -q -pr -pdv -pds9 -fr"。\Debug"-i".\include"-i"C:\ti\c2000\ccgtools_313\include"-d"_debug"-d"large_model"-ml -v28

    ["DspBiosBuilder"设置:"调试"]
    选项=-v28

    ["Linker"设置:"debug"]
    options=-q -c -m"。\Debug\XPrima.map"-o"。\Debug\XPrima.out"-stack0x400 -w -x -l"。\Lib\rts2800_ml-V040610.lib"

    ["Mot_PWM.C"设置:"调试"]
    options="Compiler"+{-k}

    [F2809]

    ["Compiler"设置:"Debug"]
    options=-k -pds9 -fr"$(Proj_dir)\Debug_4.1.3"-FS"$(Proj_dir)\Debug_4.1.3"-i"$(Proj_dir)\include (TI)"-d"_debug"-d"large_model"-ml -mt -v28

    ["Linker"设置:"debug"]
    options=-c -heap0x2000 -m"。\Debug_4.1.3\ALLGrp_S100_Main.map"-o"。\Debug_4.1.3\ALLGrp_S100_Main.out"-stack0x400 -w -x

    ["F2809_Start.cmd"设置:"调试"]
    LinkOrder=1

    我进行了另一项测试、其中逐一插入 asm (" nop")。 但计时器计数增加的量并不是定期成比例的。

    asm (" nop") count / lTimerGap

       0 7.

    1 8.    

    2 12.    

    3 12.    

    4 13.    

    5   14.

    6   18.

    当 asm (" nop")计数从1到2和5到6时、为什么 lTimerGap 会突然增加? 这是否与缓存缺失或流水线有关?

    在另一个测试中、DATA_SECTION pragma 用于强制在同一数据页中分配变量。

    因此、映射文件显示变量位于同一数据页中。

    但是、加载 DP 寄存器仍然存在。

     .dwpsn 文件"Mot_PWM.C"、第610行、第2列、is_stmt
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|610|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart,ACC    ;|610|
     .dwpsn 文件"Mot_PWM.C"、第612行、第2列、is_stmt
     NOP
     .dwpsn 文件"Mot_PWM.C"、第613行、第2列、is_stmt
     NOP
     .dwpsn 文件"Mot_PWM.C"、第614行、第2列、is_stmt
     NOP
     .dwpsn 文件"Mot_PWM.C"、第615行、第2列、is_stmt
     NOP
     .dwpsn 文件"Mot_PWM.C"、第616行、第2列、is_stmt
     NOP
     .dwpsn 文件"Mot_PWM.C"、第617行、第2列、is_stmt
     NOP
     .dwpsn 文件"Mot_PWM.C"、行618、列2、is_stmt
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC、@ë_CpuTimer0Regs  ;|618|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|618|
     .dwpsn 文件"Mot_PWM.C"、第619行、第2列、is_stmt
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|619|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|619|
           b        $C$L34, GEQ           ;|619|
           ;分支电路出现;|619|
     .dwpsn 文件"Mot_PWM.C"、第621行、第3列、is_stmt
           MOVL     ACC,@μ_lTimerEnd      ;|621|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|621|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|621|
           MOVW     DP、#_lTimerGap
           MOVL     @_lTimerGap,ACC      ;|621|
     .dwpsn 文件"Mot_PWM.C"、第622行、第2列、is_stmt
           b        $C$L35, UNC           ;|622|
           ;分支发生;|622|
    $C$L34:    
     .dwpsn 文件"Mot_PWM.C"、第625行、第3列、is_stmt
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|625|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|625|
           MOVW     DP、#_lTimerGap
           MOVL     @_lTimerGap,ACC      ;|625|
    $C$L35:    

    我将尝试按照您的建议使用汇编语言进行编码、以测量准确的时序。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    可以让我对问题进行更新吗? 我想知道您是否创建了一个装配体模块、它是否产生了任何信息?

    谢谢。

    此致、

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

    您好!

    这已经有一段时间了、我太忙了、无法回答。

    感谢您的支持。

    正如您所建议的、我制作了一个汇编模块。

    此模块 由以下过程组成。

    1.创建一个仅包含时间测量功能的新 c 文件

    2.通过复杂生成 asm 文件

    3.去掉不必要的部分

    生成的文件与此类似。

    ;*********
    ;* TMS320C2000 C/C++ Codegen                        PC v4.1.3 *
    ;*创建日期/时间:2019年1月16日星期三11:53:49                *
    ;*********
     compiler_opts --mem_model:code=flat --mem_model:data=large --quiet --silicon_version=28
    fp .set XAR2

     .sect ".text"
     全局 _测量_时间_asm
     全局 _测量_时间_ASM1
     全局 _测量_时间_asm2
     全局 _测量_时间_ASM3
     全局 _测量_时间_asm4
     全局 _测量_时间_asm5
     全局 _测量_时间_asm6
     全局 _测量_时间_asm7
     全局 _测量_时间_asm8
     全局 _测量_时间_asm9
     全局 _测量_时间_asm10
     全局 _测量_时间_asm11
     全局 _测量_时间_asm12

    ;*********
    ;* FNAME:_measure_TIME                FR 大小:  0          *
    ;*                                                             
    ;*功能环境                                       *
    ;*                                                             
    ;*函数属性                                        *
    ;*                           0参数, 0 AUTO, 0 SOE    *
    ;*********

    测量_时间_ ASM:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L1,GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap
           MOVL     @_lTimerGap,ACC      ;|45|
           B        L2,UNC               ;|46|
    L1:    
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap
           MOVL     @_lTimerGap,ACC      ;|49|
    L2:    
           SPM      #0
           LRETR

    _测量_时间_ ASM1:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L11,GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap1
           MOVL     @_lTimerGap1、ACC      ;|45|
           B        L12,UNC               ;|46|
    L11:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap1
           MOVL     @_lTimerGap1、ACC      ;|49|
    L12:
           SPM      #0
           LRETR

    _测量_时间_平方米:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L21、GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap2
           MOVL     @_lTimerGap2、ACC      ;|45|
           B        L22,UNC               ;|46|
    L21:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap2
           MOVL     @_lTimerGap2、ACC      ;|49|
    L22:
           SPM      #0
           LRETR

    _测量_时间_ ASM3:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L31、GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap3
           MOVL     @_lTimerGap3,ACC      ;|45|
           B        L32,UNC               ;|46|
    L31:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap3
           MOVL     @_lTimerGap3,ACC      ;|49|
    L32:
           SPM      #0
           LRETR

    _测量_时间_asm4:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L41,GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap4
           MOVL     @_lTimerGap4、ACC      ;|45|
           B        L42,UNC               ;|46|
    L41:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap4
           MOVL     @_lTimerGap4、ACC      ;|49|
    L42:
           SPM      #0
           LRETR

    _测量_时间_ asm5:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
           NOP
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L51,GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap5
           MOVL     @_lTimerGap5,ACC      ;|45|
           B        L52,UNC               ;|46|
    L51:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap5
           MOVL     @_lTimerGap5,ACC      ;|49|
    L52:
           SPM      #0
           LRETR

    _测量_时间_ asm6:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L61,GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap6
           MOVL     @_lTimerGap6、ACC      ;|45|
           B        L62,UNC               ;|46|
    L61:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap6
           MOVL     @_lTimerGap6、ACC      ;|49|
    L62:
           SPM      #0
           LRETR

    _测量_时间_ asm7:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L71,GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap7
           MOVL     @_lTimerGap7,ACC      ;|45|
           B        L72、UNC               ;|46|
    L71:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap7
           MOVL     @_lTimerGap7,ACC      ;|49|
    L72:
           SPM      #0
           LRETR

    _测量_时间_ asm8:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L81、GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap8
           MOVL     @_lTimerGap8、ACC      ;|45|
           B        L82、UNC               ;|46|
    L81:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap8
           MOVL     @_lTimerGap8、ACC      ;|49|
    L82:
           SPM      #0
           LRETR

    _测量_时间_asm9:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L91、GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap9
           MOVL     @_lTimerGap9,ACC      ;|45|
           B        L92、UNC               ;|46|
    L91:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap9
           MOVL     @_lTimerGap9,ACC      ;|49|
    L92:
           SPM      #0
           LRETR

    _测量_时间_ asm10:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L101、GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap10
           MOVL     @_lTimerGap10,ACC      ;|45|
           B        L102,UNC               ;|46|
    L101:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap10
           MOVL     @_lTimerGap10,ACC      ;|49|
    L102:
           SPM      #0
           LRETR

    _测量_时间_ asm11:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L111,GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap11
           MOVL     @_lTimerGap11,ACC      ;|45|
           B        L112,UNC               ;|46|
    L111:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap11
           MOVL     @_lTimerGap11,ACC      ;|49|
    L112:
           SPM      #0
           LRETR

    _测量_时间_ asm12:
           MOVW     DP、#_CpuTimer0Regs+4
           和      @ CpuTimer0Regs+4、#0xffffff;|28|
           MOVL     ACC,@ë_CpuTimer0Regs  ;|30|
           MOVW     DP、#_lTimerStart
           MOVL     @_lTimerStart、ACC    ;|30|
    *在此处添加要测试的代码-开始
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
    *在此处添加要测试的代码-开始
           MOVW     DP、#_CpuTimer0Regs
           MOVL     ACC,@ë_CpuTimer0Regs  ;|42|
           MOVW     DP、#_lTimerEnd
           MOVL     @_lTimerEnd,ACC      ;|42|
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|43|
           MOVW     DP、#_lTimerEnd
           cmpl     acc、@μ_lTimerEnd      ;|43|
           B        L121、GEQ               ;|43|

           MOVL     ACC,@μ_lTimerEnd      ;|45|
           MOVW     DP、#_lTimerStart
           SUBL     ACC、@μ_lTimerStart    ;|45|
           MOVW     DP、#_CpuTimer0Regs+2
           Addl     ACC、@ë_CpuTimer0Regs+2;|45|
           MOVW     DP、#_lTimerGap12
           MOVL     @_lTimerGap12,ACC      ;|45|
           B        L122、UNC               ;|46|
    L121:
           MOVW     DP、#_lTimerStart
           MOVL     ACC,@_lTimerStart    ;|49|
           MOVW     DP、#_lTimerEnd
           SUBL     ACC、@μ_lTimerEnd      ;|49|
           MOVW     DP、#_lTimerGap12
           MOVL     @_lTimerGap12,ACC      ;|49|
    L122:
           SPM      #0
           LRETR

    ;*********
    ;*未定义的外部引用                              *
    ;*********
     全局 _lTimerEnd
     全局 _lTimerGap
     全局 _lTimerGap1
     全局 _lTimerGap2
     全局 _lTimerGap3
     全局 _lTimerGap4
     全局 _lTimerGap5
     全局 _lTimerGap6
     全局 _lTimerGap7
     全局 _lTimerGap8
     全局 _lTimerGap9
     全局 _lTimerGap10
     全局 _lTimerGap11
     全局 _lTimerGap12
     全局 _lTimerStart
     .global _CpuTimer0Regs

    在启用中断之前、我从 main()调用 measure_time_asm ()~ measure_time_asm12 ()。

    结果如下表所示。

    表1. 每个 DSP 中的 lTimerGap 值

    NOP 计数

    2809.

    2811.

    0

    6.

    4.

    1

    6.

    11.

    2.

    8.

    12.

    3.

    9.

    16.

    4.

    10.

    14.

    5.

    11.

    14.

    6.

    12.

    18

    7.

    14.

    19.

    8.

    14.

    22.

    9.

    14.

    23

    10.

    16.

    24

    11.

    17.

    28.

    12.

    18

    26

    结果很难理解。 如果添加了 nop 操作、则 Sometimesi lTimerGap 保持相同的偶数、甚至会降低。

     你怎么看?

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉耽误您的回答。 说实话、我正在为这个问题的想法而奋斗。 我与一位同事讨论了这个问题、他提出了一些有趣的问题:

    您能否检查两个器件上的闪存等待状态设置? 当您从闪存运行时、我们想知道等待状态是否可能配置不同、这会导致执行时序差异。

    此外、由于这些器件上的存储器映射非常相似、您可以将一个工程的.out 文件直接加载到另一个器件上。 如果您可以执行该操作并进行相同的计时测量、则会证明或排除软件是问题的罪魁祸首。 可以试试吗?

    此致、

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

    您好!

    问题是闪存等待状态。

    下表显示了当等待状态相同时、可以获得类似的结果。

    即使在2811中使用相同的等待、也会观察到一点差异、我认为这源自闪存的流水线。

    NOP 개수

    2809.

    等待= 3

    2811.

    等待= 5

    2811.

    等待= 3

    2811.

    等待= 3

    0

    6.

    4.

    2.

    2.

    1

    6.

    11.

    7.

    7.

    2.

    8.

    12.

    8.

    8.

    3.

    9.

    16.

    10.

    8.

    4.

    10.

    14.

    10.

    11.

    5.

    11.

    14.

    10.

    12.

    6.

    12.

    18

    12.

    12.

    7.

    14.

    19.

    13.

    13.

    8.

    14.

    22.

    14.

    13.

    9.

    14.

    23

    15.

    15.

    10.

    16.

    24

    16.

    16.

    11.

    17.

    28.

    18

    17.

    12.

    18

    26

    18

    19.

    如果时间允许、我将使用相同的.out 文件进行测试。 由于2809和2811之间的闪存存储器映射不相同、因此在不进行修改的情况下、同一.out 文件无法正常工作。 源程序很大、我需要删除不必要的部分才能下载相同的.out 文件。

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

    很好。  感谢您告知我们。

    此致、

    Richard