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.

在CCS4中怎么查看一段程序的运行时间。芯片是25335

Other Parts Discussed in Thread: TMS320F28335

在网上找到clock enable的方法,我试了 结果左下角没有出现时钟图标。难道这个功能不支持28335?咋办

还有 例程中DELAY_US(A)函数误差有多大呢?感觉不是很准,用到单总线器件上不行

怎么能用软件写一段精确的延时函数呢?timer除外

大神们帮帮忙哈 

  • 我一般使用Timer0来看跑了多少个cycles来查看运行时间。

  • CCS里面的功能不是很准确,如果只是想确定一段代码的运行时间(绝对值),最准确也是最简单直接的方法是在前后加GPIO翻转,通过示波器量测。如果是想知道对应CPU时钟,则可以反汇编计算对应的指令周期数。

  • 可以支持TMS320F28335的,从CCSv5 IDE中找Example_2833xGpioSetup例程,Clock Cycle统计功能请参考下面的图设置。

    run->clock->enable, clock 清零

    程序从InitSysCtrl()到InitPieCtrl()这段时间花费的Clock Cycle如下图所示。

  • 这里真热闹,我也灌一下水。:)

    楼上说的是CCSV5,V4是不支持clock,也建议楼主用V5,建议按照2楼10#说的方法操作:

    processors.wiki.ti.com/.../Download_CCS

    DELAY_US(A)函数,如果按照要求放在RAM中,没有误差,具体的,DELAY_US(A)函数的源代码中有说明:

    ;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

     

    #define DELAY_US(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)

  • 刚刚我用CPU Timer0计数和Hanson提供的CCS的方法比对了一下,结果很接近,最多差4个cycle,可能是因为断点的位置问题。

    不知道CCS这种方法的原理是什么。

  • 感谢各位热情解答,获益匪浅。后来又试了一下DELAY_US(A)还是很准确的,可以直接用于单总线的延时

  • CCSV5里面的 clock是不是不够精确?我编了一个程序:

    for(frequency=1000;frequency<100000;frequency++)   .................1

    {   Calculate_Control_Word(frequency);                          ...................2

    if(frequency==99999)                                      ..................3

    {frequency=1000;}

    }

    我编译完下载到28335的RAM中去后,enable 了clock。发现 :

    从程序1到程序2,要12个机器周期;

    从程序2到程序3,要279个机器周期;

    从程序3到程序1,要7个机器周期。

    后来在这段程序没有变的情况下,又把.out文件重新下载到RAM中,发现

    从程序1到程序2,要20个机器周期;

    从程序2到程序3,要282个机器周期;

    从程序3到程序1,要1200个机器周期。

    请问这是怎么回事?这也相差太大了。每次重新加载后,有时正常,有时不正常。

    个人觉得受到计算机内存指令调用方面的影响,运用timer,CCS程序里的CLOCK方式都不准确吧?唯独GPIO口输出切换程序是在DSP

    内部执行,不牵涉到计算机内存环境改变的问题,应该最准确,但是不是很方便。因为我观察EPWM的couter计算时也发现

    同样一个程序,每次执行完用的机器周期是不一样的。

    用程序把timer里的值或EPWM里面couter的值显示出来,和用CCS里View的方式显示出来都应该一样。只要经过计算机读出来

    显示在CCS里面,就可能会不准确。最起码会出现不能保证每次加载后查看的机器数不尽相同。

    希望指正!

  • CCS中的clock不准确,指的是程序在FLASH中运行的时候,可能会涉及到flash pipeline,或者在外部ram中运行碰到CPU stall.

    PWM couter和cpu timer的测试应该是最准确的。

    我估计您测量的不准可能是因为运行中碰到中断,建议在一个最简的工程中测试。

    楼主新的问题,开一个新帖子吧。

  • 你好 ,我想问下 就是un->clock->enable, clock 清零 这个步骤具体是怎么操作的呀 我是新手 想测一下运行一个中断的时间

  • DELAY_US(A);是要放到ram里才能测得一个中断的循环频率吗

  • 我遇到同样的问题 要测试28335在flash中运行程序的时间 请问哪种测试方法在flash内运行更合适

  • 我也是用cpu_timer0周期数来看,直接给出代码实现:

    Uint16 BENCH_REGH;
    Uint16 BENCH_REGL;


    void BENCH_Start()
    {
        BENCH_REGH = 0;
        BENCH_REGL = 0;
        ReloadCpuTimer0();
        StartCpuTimer0();
    }

    void BENCH_Stop()
    {
        Uint32 cycles = 0;

        StopCpuTimer0();

        cycles = 0xFFFFFFFF - ReadCpuTimer0Counter();

        BENCH_REGH = HIWORD(cycles);
        BENCH_REGL = LOWORD(cycles);
    }

    我用以上的代码跟踪我的ISR中算法执行时间。