2011-06-17 85 views
2

我已經繼承了一個嵌入式項目,需要一些簡單的,按功能進行性能分析。它由運行uClinux(2.6.17.7-uc1)的Coldfire(MCF5328)組成。Coldfire高分辨率定時器(MCF5328)

我不是Coldfire或者uClinux(或者Linux)的專家,所以請原諒我的無知。

在Windows中,我只是簡單地使用QueryPerformanceCounter來訪問x86高分辨率定時器。記錄前後的計數器並比較差異。

我已經學會了Linux的對QueryPerformanceCounter的多個變體:

  • clock_gettime/RES
  • getnstimeofday
  • ktime_x

甚至通過訪問時間戳計數器

  • get_cycles

在uClinux版本上這些設備都不可用。所以看起來操作系統沒有高分辨率的定時器訪問。

這是否意味着Coldfire本身不提供這樣的功能?或者uClinux端口的作者是否將它們拒之門外?硬件上是否有我可以使用的東西,以及如何使用它?

回答

1

我最終在Coldfire上使用了四個DMA定時器之一。啓動定時器作爲自由運行的非中斷產生計數器是一件簡單的事情。這提供了一個12.5ns計數器(在80Mhz)。

1

鑑於你的內核有多大,你可能不支持高分辨率定時器。

如果您正在編寫內核驅動程序,則API不同。如果get_cycles()被刪除,這可能意味着您的CPU架構不支持循環計數器。由於你的內核很老,所以do_gettimeofday可能是你可以做的最好的,而不是寫一個驅動來直接查詢一些定時器硬件。

+0

在'clock_gettime'的情況下,linux/time.h甚至沒有它。如果我創建一個聲明讓它生成(所討論的驅動模塊動態鏈接到內核),則設備崩潰,因爲該函數在內核中不存在。對於ktime_x函數,它們存在於分發的頭文件中,但是在內核中不存在。在get_cycles的情況下,頭文件將其定義爲返回零的內聯函數(即它未實現)。 – Tergiver

+0

我在發行版文件中發現了確切的posix-timers.c文件,這意味着由於某些原因,該特定文件沒有內置。我猜測有1001個可能的原因可能不會被構建,其中一個是#define或config設置,該設置位於1001個事物的列表中。 – Tergiver

+0

是的,它是一個內核驅動程序,我的直覺是硬件不支持它。我希望能夠快速解決問題,因爲我只需要改變單個模塊的工作方式,並且需要對這些更改進行分析,以便不會比以前消耗更多的週期。 do_gettimeofday沒有足夠的解析度。 – Tergiver