我們有一個使用3.2內核的ARM9 - 一切似乎都很好。最近我被要求添加一些代碼在啓動時在一些GPIO線上添加50ms脈衝。脈衝碼很好;正如預期的那樣,我可以看到這些線條不斷上升。不按我期望的方式工作的是udelay()
函數。閱讀文檔使我認爲單位是微秒,但在邏輯分析儀中測得的結果太短。所以我最終添加了這個代碼來獲得50ms。如何證明__udelay()在我的ARM嵌入式系統上正常工作?
// wait 50ms to be sure PCIE reset takes
for (i=0;i<6100;i++) // measured on logic analyzer - seems wrong to me!!
{
__udelay(2000); // 2000 is max
}
我不喜歡它,但它工作正常。在udelay
代碼中有一些奇怪的常量和指令。有人能告訴我這是如何工作的嗎?這個代碼在所有的時鐘初始化之後被調用,所以其他的一切似乎都沒問題。
在現代內核hrtimer_nanosleep應該足夠輕便。 – cdleonard
@cdleonard'''nanosleep'可能會在繁忙的循環中使用'udelay',具體取決於調度器模式和延遲長度。請參閱我在[高分辨率時機]上提供的鏈接(http://tldp.org/HOWTO/IO-Port-Programming-4.html)。 –
@ embedded.kyle - 非常感謝您的回答,但我不滿意。 mdelay只是在for循環中調用udelay,所以沒有任何幫助。而且udelay的數量已經不在1%或者50%的範圍之內了 - 如果一切正常(每個循環2ms),我預計會有25的循環計數器。如果它是50%折扣 - 比我的循環將是50.但6100?這太遙遠了,它讓我困惑不已。再次感謝,但我仍然在追求:) – Jeff