2013-02-22 65 views
4

我正在使用STM32微控制器,並附加了最少的庫。我想使用<ctime>(可能還有新的std::chrono)的clock()函數,但我堅持返回-1的clock()<ctime>中的clock()函數如何訪問系統時鐘?

這並不奇怪,因爲我不希望gcc-arm-none-eabi中的庫知道我的微控制器的外圍佈局。

我該如何告訴clock它從哪裏得到滴答計數?我是否可以簡單地重新聲明它,或者是否需要實現一個較低級別的函數?

+0

[您可能會發現這是很有幫助的。(https://github.com/libopencm3/libopencm3/blob/master/lib/stm32/timer.c) – 2013-02-22 17:53:37

+0

@ H2CO3:我沒有那麼多要價_「如何我是否得到系統時鐘?「_因爲我是_」鑑於我可以獲得系統時鐘,我如何將它與'time.h'頭連接起來?「_ – Eric 2013-02-22 17:57:24

+0

在這種情況下:您必須重新實現clock()函數。 – 2013-02-22 17:59:27

回答

1

這通常是將libc實現移植到新平臺的一部分工作。當您編譯glibc或newlib(C標準庫的兩個最流行的實現)副本時,您必須提供一系列存根方法,其中一個方法將提供時間。 gcc-arm-none-eabi是newlib中預定義的目標,它實現了很多這些存根,但不是用於獲取時間的存根,因爲就像您說的這些是特定於應用程序的。

要做的最好的事情就是自己構建工具鏈,實現這個方法。您可以按照here的說明操作,但在構建newlib之前編輯目標以填充此存根。有關實施存根的很好參考可用here

另外,您可以直接實現自己的clock功能,當你鏈接您的應用程序會更喜歡你的版本,在一個庫中。不過要注意的是,這意味着庫中任何調用clock的東西仍會調用破壞的庫版本,因此您可能需要重新實現很多功能。

+0

謝謝。 'times'是我正在尋找的函數名稱。我假設我鏈接'_times'的代理的'libnosys.a'庫? – Eric 2013-02-22 18:05:02

+0

我認爲'libnosys.a'實現'times'失敗。你可能需要的是使用'libgloss'而不是使用'libnosys.a',在任何存根就可以灌裝。 – jleahy 2013-02-22 18:21:30

+0

不,沒有任何工具鏈重新編譯定義'_times'就訣竅了。感謝您的鏈接。 – Eric 2013-02-22 19:24:00