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.

timestamp_get32返回负值



大家好!

6678  ccs5.3

在image_processing这个例子里,有用timestamp_get32计算用时。我修改了一些程序,仿照着测试时间。

core0.c

  t1 = timestamp_get32();

  init(args);

  message_put(args);  //core0给所有核发数据

  message_get(args);   //core0接收所有核处理后的数据

  t2 = timestamp_get32();

core0-7.c

  t3= timestamp_get32();

   algorithm_func();  //处理数据

  t4 = timestamp_get32();

其中,t1 ,t2是原有的,我添加了t3,t4。 t1 t2的值很正常,而t3,t4则会出现负值,似乎是越界溢出了,但是t3 t4是发生在t1之后t2之前的,应该都比t2要小。 Int32 值介于 -2,147,483,648 到 +2,147,483,647 。t2不过也就是9位数,所以为什么会出现负值的情况呢?请问该怎么解决?

谢谢!

  • 可能是饱和溢出了,使用32bit timestamp在4s就会饱和了,你可以试试64bit Timestamp_get64, 参考如下说明。

    http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/p/157013/570607.aspx#570607

  • 谢谢Andy!

    我换为使用start = _itoll(TSCH,TSCL); 不会出现负值的情况了。但是还是有问题,如我第一帖所说的4个取时间的位置,其中t1, t2是只有core0做的,而t3, t4是所有核都做的。正常应该是core0收到所有核传回的数据才会取t2值(t1->t3->t4->t2),但是非0核的t4的值却比t2值要大。

    我现在是想求出所有核中在t3处的最小值和t4处的最大值,算出算法处理的时间,然后t2-t1是总的处理时间,然后(t2-t1)-(t4max-t3min)是传输时间,但按上面的情况,这个传输时间是负值了。因为t3比t1大一点,但t4的值比t2还大很多。

    1. 我想问TSCL = 0。这个是要每个核都执行吗,还是一个核开启就行,如果要每个核都开启,那我怎么保证每个核从同一时间水平线开始计时的呢,因为我上面的4个位置并不是所有核都做也不在一个源文件中。

    2、TSCL是在什么情况下加1的,cycles的增加是相对于同一个核在同一个task中而增加的吗?

    3、有什么方法是对于所有核统一的计时时间吗,一旦我开启它,不论哪个核在哪里取时间都是以同一个开启时间为基准的。

    谢谢!

  • TSC是每个核都有的一个独立计数寄存器,一旦启动之后,这个寄存器就一直在累加,每次累加的频率是core 主频,如1GHz,则每1ns加1。多核很难拉到同一基准点,建议可以在每个core上分别记录各自算法处理的时间及数据传输的时间;core0记录从启动其他core开始到最终收齐每个core处理数据结束的这段时间即对应多核处理的时长。