我的硬件是否存在时间.h clock()的问题?

7
我将尝试测量在OMAP ZOOM 3430 MDK所配备的TMS32064x+ DSP上执行一段代码所需的时钟周期数。我查看了DSP芯片的“程序员指南”,发现该DSP支持 clock() 函数。
我的操作非常简单,只需执行以下操作:
start = clock();
for (i=0;i<100;i++){
    /* do something here */
}
stop = clock();
total = stop - start;

然后将"start"、"stop"和"total"的值放入之前分配给ARM处理器的共享内存中。然后在ARM端简单地将其打印到屏幕上。 问题是,在我的第一次执行中,我总是得到相同的"total"值,然后在我的下一次运行中,我总是得到0!"start"和"stop"的值与"total"的值一起变化。 最奇怪的是它们似乎遵循一个比特模式!我把输出放在下面:
# ./sampleapp
Total = 63744
Start clock() value = 0x000000f9
Stop  clock() value = 0x0000f9f9
# ./sampleapp 
Total = 4177526784
Start clock() value = 0x00f9f9f9
Stop  clock() value = 0xf9f9f9f9
# ./sampleapp
Total clock cyles = 0
Start clock() value = 0xf9f9f9f9
Stop  clock() value = 0xf9f9f9f9

显然,clock()函数的功能不是很好,但我不确定这是因为我做错了什么还是因为我的硬件不支持这种类型的功能。有任何想法吗?


你确定时钟返回这些值吗?你可能只是遇到了访问共享内存的问题? - Vicky
TI有没有任何示例?我记得他们在一些其他CODEC示例中也计算了执行的经过时间。我不记得他们是否使用了clock() API。但它似乎在解码器或编码器示例代码中起作用。 - simon
我没有见过任何同时使用DSP的CODEC示例。如果你知道其中一个,麻烦提供一个参考或链接。 - Can Bal
可能是这样!我会向TI询问这个问题。 - Can Bal
1
你尝试过使用 gettimeofday() 吗? - swegi
显示剩余6条评论
6个回答

2

从目前为止阅读的问题来看,我认为原帖作者在这个问题上拥有比迄今为止的贡献者更多的知识,并且怀疑DSP上的clock()函数可能已经损坏(或不受支持,返回未定义的结果)。


我开始相信这也是事实,所以不再需要将这个问题留为未解答。感谢大家。 - Can Bal
你真谦虚,Can Bal。你开始同意相信自己比贡献者拥有更多的知识,并选择了那个回答。很好 :) 我也同意clock()在OMAP上是有问题的。 - ustun
看起来你不是唯一一个在 clock() 函数上遇到麻烦的人。或许这里提供的解决方案可以帮到你。https://dev59.com/8HRB5IYBdhLWcg3wj32c - hookenz

0

也许您可以使用一些内联汇编来直接访问CPU的计数器寄存器。

TMS320C64x+在TSCL、TSCH中有一个64位时间戳寄存器。计数器在重置时未启用,您必须先写入寄存器以启动计数器(也许这就是clock的问题所在?)。从寄存器读取不是很简单,因为每个半部分必须使用单独的指令进行读取(而且您可能会遇到中断...)。


我不知道这是一个旧问题。这就是我没有注意时间戳的后果! - Dietrich Epp

0

奇怪的是,为什么你需要一个先前分配的共享内存?为什么不试试使用普通的堆栈变量?有我漏掉的东西吗?


2
是的,你忽略了一个事实,那就是显示结果的代码在另一块处理器上运行,即主 ARM CPU,而展示出来的代码则运行在 DSP 处理器上。 - unwind

0
也许你需要先初始化时钟。

据我所知,clock()将参考点作为可执行文件的初始调用。我不知道如何手动初始化/重置其值。你怎么做? - Can Bal
我刚刚重新阅读了手册,标准没有提供这样做的方法。 - swegi

0
你是如何打印输出的?也许问题实际上是在显示结果方面?在大多数平台上,clock_t 是一个 long long 类型。如果你使用 printf 和 %d 一起使用,你可能会得到不同的结果,这就是你看到的情况。

我打印了sizeof(clock_t),它是4。它被定义为无符号整数。 - Can Bal
坚持这个方向,你的打印代码是否经过验证?你是否通过相同类型的内存传输/打印输出输入了一些值,以检查它们是否正确传递? - DevSolar

0
假设开始和结束变量的类型为 'clock_t',并且您的共享内存在另一端对传递的数字的解释方面也是如此,那么您的问题不在于调用时钟,而在于处理开始、结束时间之间差异的方式。
我认为您的问题在于两者之间的共享内存。您能否请发一下代码,以展示您如何在两个独立的处理器之间共享内存?

我只是使用TI在其dmmcopy示例中使用的相同方法。MPU端示例: http://gitorious.org/ti-dspbridge/userspace/blobs/master/source/samples/mpu/src/dmmcopy/dmmcopy.cDSP示例: http://gitorious.org/ti-dspbridge/userspace/trees/master/source/samples/dsp但我不认为问题出在共享内存上,因为我可以正确地将硬编码值从DSP传递到CPU,而不是开始、停止和总变量。 - Can Bal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接