我的硬件上的time.h clock()坏了吗?

时间:2009-07-03 10:31:22

标签: c++ c embedded clock omap

我尝试测量在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端的屏幕上。

问题是,在我第一次执行时,我总是得到相同的“总”值,然后在我的下一次运行中,我总是得到0! “开始”和“停止”值与“总”值一起显示。

最奇怪的是他们似乎遵循了一点点模式!我把输出结果放在下面:

# ./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()运行不正常,但我不确定这是因为我做错了什么,还是因为我的硬件不支持这种类型的东西。有什么想法可能会发生这种情况吗?

6 个答案:

答案 0 :(得分:2)

从阅读到目前为止的问题,我会说原始海报比目前的贡献者有更多的知识,并且怀疑时钟()被破坏(或不支持,并返回未定义)似乎很可能在DSP上。

答案 1 :(得分:0)

奇怪的是,为什么需要以前分配的共享内存 。为什么不尝试使用普通的堆栈变量?有什么我想念的吗?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你是如何打印出来的?也许问题实际上是显示结果?

在大多数平台上,clock_t很长。如果您使用带有%d的printf,您可能会得到可变结果,这就是您所看到的。

答案 4 :(得分:0)

假设start和end变量的类型为'clock_t',并且你的共享内存假设在另一端对传递的数字的解释相同,那么你的问题不在于调用时钟,而是你处理差异在开始结束时间之间。

我相信你的问题在于两者之间的共享内存。您能否发布代码以显示您如何在两个独立的处理器之间共享内存?

答案 5 :(得分:0)

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

TMS320C64x +在TSCL,TSCH中有一个64位时间戳寄存器。 重置时计数器未启用您必须先写入寄存器才能启动计数器(这可能是clock的问题?)。从寄存器中读取并不是很简单,因为必须使用单独的指令读取每一半(并且您可以获得中断......)。