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.

[参考译文] CCS/TMS320F28335:从不同文件调用时、同一函数的执行时间明显不同

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/588573/ccs-tms320f28335-the-execution-time-of-same-function-are-obvious-difference-when-call-from-different-files

器件型号:TMS320F28335

工具/软件:Code Composer Studio

您好!

我发现、从 不同文件调用时、同一函数的执行时间明显不同。 为什么? 还可以吗?

说明、

条件:CCS6.0;TMS320F28335/TMS320LF2407

我想测试 TMS320F28335的算术速度、因此我要使一 个简单的函数 运行。 但是 、在 main.c 和其他文件(非 main.c)之间调用同一函数时、执行时间会有所不同

a)函数在 main.c 中定义、执行时间为1.6us。

b)函数在 sub_program.c 中定义、执行时间为3.6us。

 这与我测试 TMS320LF2407时的情况相同。

A)

#include "DSP2833x_Device.h"    // DSP2833x 头文件包含文件
#include "DSP2833x_examples.h"  // DSP2833x 示例包含文件
#include "DSP28335_ex.h"
#include "para_space.h"
#include "myinclude.h"

void sub_programmer3 (void)

 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void main (void)

  InitSysCtrl(); //PLL、看门狗、时钟
  InitXintf16Gpio(); // configuer io,需要修改
  DINT; //禁用 CPU 中断
  InitPieCtrl();  //禁用 PIE 中断,清除所有 PIE 中断标志:
  IER = 0x0000;
  IFR = 0x0000; //禁用 CPU 中断并清除所有 CPU 中断标志:
  InitPieVectTable(); //初始化 PIE 矢量表,打开 PIE 中断
  configtestled();   // configuer io,需要修改
  LED1=1;
  //delay_time (10);
  LED1=1;LED2=1; LED3=0; LED4=0;
  Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart);
  InitFlash();
  //delay_US (1)=10.5us

while (1)
 {//示波器测试IO周期、用于测试CPU速度
 //调用子程序sub 程序();sub_program3 ();两个程序相同,但是放的位置不一样
//同样的程序代码,为什么调用sub 程序速度慢了很多?;与sub 程序3 ()比较;
 LED3=~LED3;            // IO口电平
 sub_program();          //test deley time 3.6us 子程序
 //sub_programmer3 ();       ///测试延迟时间 1.6us


    }

B)

#include "DSP2833x_Device.h"    // DSP2833x 头文件包含文件
#include "DSP2833x_examples.h"  // DSP2833x 示例包含文件
#include "DSP28335_ex.h"
#include "para_define.h"
#include "myinclude.h"

//*
void sub_program()

 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    编译器的工作方式是、当未应用优化时、它没有有关函数在不同文件中的全局变量位置的信息、因此它会为每个变量访问执行 DP 加载。 相比之下、当函数位于主文件中时、它会执行一个 DP 写入、其他所有内容都是一个单指令周期、因此周期计数要低得多。 我分别看到130个周期和355个周期、比您看起来要低一些。

    如果将优化设置为-o2、编译器将识别代码中的冗余并只执行一行。 计数将分别降至约22和26。 不同文件中的函数可能会有几个额外的周期、因为额外的 DP 负载不会完全消失。

    您得到的数字是合理的。 我建议至少应用级别-o2优化。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BTW、运行测试时是否启用了浮点(float_support=fpu32)? 我刚刚假设在运行函数时所有温度变量都是长整数。

    如果未启用 FPU 支持、您还可以尝试--postLink_opt 选项来消除 DP 负载。 如果启用了 FPU、则由于管道未受保护、它只能发出建议。 postLink_opt 选项是链接时优化选项、位于链接器开关(-z)之后。 这样您就可以摆脱这些额外的 DP 负载。

    此外、如果您使用的是数组而不是单独的全局变量、C2000的性能会更好。 C2000的一些主要性能优势是能够直接访问算术指令中的存储器操作数(而不必将值加载到寄存器中)以及自动递增地址寄存器操作数。 使用数组而不是 temps 应该突出显示其中的一些内容。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Richard
    这是我的主题。
    我没有使用浮点算术。 我只需定义以下变量:
    extern Int32 temp1;
    extern Int32 temp2;
    extern Int32 temp3;
    extern Int32 temp4;
    extern Int32 temp5;
    int32 temp1=1;
    int32 temp2=1;
    int32 temp3=1;
    int32 temp4=1;
    int32 temp5=1;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用 DSP TMS320F2407来测试相同的功能。测试平台是 CCS3.1

    void sub_program()

    TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
    TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
    TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
    TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
    TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
    TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
    TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
    TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
    TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
    TEMP1=0;temp2=0;temp3=0;temp4=0;temp5=0;temp1=1;temp2=1;temp3=1;temp4=1;temp5=1;
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    DSP TMS320F2407:当我从同一文件“main.c”调用 funion,我测试的程序执行时间为3.2us。
    因此、存在一个新问题。 您知道 DSP TMS320F2407基本频率为40M,TMS320F28335基本频率为150m,所以当 TMS320F2407中的程序执行时间为3.2us 时,TMS320F28335必须为0.85us。 但我测试 TMS320F28335程序执行时间是1.6us!
    当我从另一个文件“sepbes.c”调用相同的功能时,使用了 DSP TMS320F2407,我测试了程序执行时间为8.8us。
    这是 problem.because 电机控制算法对高性能 DSP 的严重需求。 如果载波频率定义为10k,则我的算法时间仅为100us。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的 TMS320F28335平台是 CCS6.0
    我设置了优化,例如--opt_info_-on 2,但没有效果。 我测试了 deley 时间是3.6us、当我从另一个文件调用相同的函数时。您知道从同一文件调用的相同函数、例如"main.c"、deley 时间是1.6us
    因此我设置-opt_for_spee-mf 3、也没有效果。
    我希望您运行我的套件来测试程序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要设置"-out_level"设置来影响 C 代码的优化方式。  在 CCSv6中、右键点击工程、然后选择"Properties"、然后转至"CCS Build -> C2000 Compiler -> Optimization "。  请参阅随附的窗口屏幕截图。

    此致、

    Richard

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

    首先、感谢您的解决方案、但我在下面有一个不同的界面。在 我执行您告诉我的操作后、我在这里没有看到任何不同的地方、所以我认为这可能不是我在这里遇到的问题。您是否有其他解决我的问题的解决方案?

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

    好的、谢谢。  我使用的是 CCS v6.1.3、因此显然自 v6.0以来、设置已移动。  我的机器上没有该版本。

    您能否在其他编译器类别下查看是否存在优化级别设置?  它应该是: "-opt_level"或"-O"。  如果是这样、您能否将其更改为-o2并查看这是否会产生影响?

    此致、

    Richard

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

    非常感谢!  问题得到解决。  

    在 CCS6.0,中 、"-out_level"设置路径为"CCS Build -> C2000 Compiler -> Basic option"

    谢谢!