2010-08-21 36 views
19

我找到了tsc2007驅動程序,並根據我們的需要進行了修改。我們公司正在生產自己的TI DM365板。在這個電路板中,我們使用了TSC2007,並將PENIRQ引腳連接到DM365的GPIO0。在駕駛員身上看起來不錯。當我觸摸到觸摸屏光標移動,但同時我得到如何解決「BUG:調度while atomic:swapper/0x00000103/0,CPU#0」?在TSC2007驅動程序?

BUG: scheduling while atomic: swapper /0x00000103/0, CPU#0 

警告和嵌入式Linux正在崩潰。有2個文件,我修改並上傳到http://www.muhendislikhizmeti.com/touchscreen.zip一個是與計時器另一個不是。無論如何它都會給出這個錯誤。

我在網上找到了一個解決方案,我需要使用工作隊列和使用schedule_work()API調用。但現在它們對我來說很模糊。有沒有人有任何想法如何解決這個問題,並可以給我一些建議,在哪裏開始使用工作隊列。

回答

28

「Scheduling while atomic」表示您已嘗試在某處不應該睡覺的地方 - 如在受自旋鎖保護的關鍵部分或中斷處理程序中。

可以睡的東西的常見例子是mutex_lock(),kmalloc(..., GFP_KERNEL),get_user()put_user()

12

與第一個答案中所述的一樣,在調度程序變得混亂並因此無法正常工作時調度原子,這是因爲調度程序試圖在包含可調度代碼的部分中執行「調度()」一個不可調度的。

例如在受自旋鎖保護的部分內使用睡眠。試圖在自旋鎖保護的代碼中使用另一個鎖(信號量,互斥......)也可能會擾亂調度程序。另外,在用戶空間中使用自旋鎖可以驅動調度器表現如此。希望這有助於

2

謝謝你的前兩個答案,在我的情況下,這已經足夠了禁用搶佔:

preempt_disable(); 

// Your code with locks and schedule() 

preempt_enable(); 
+0

不夠準確:正如caf所說,鎖定不能睡覺。只有spinlock符合這個條件。無法使用互斥鎖(我不確定?),因爲當互斥鎖開始等待時,可以將CPU調度到其他處理器(因爲mutex_lock()內部是一個「might_sleep()」函數調用,這可能會導致重新計劃 - 因爲cond_resched()被調用,即使您將搶佔標誌設置爲off(這可能會導致另一個錯誤?),因爲自動計劃在搶佔標誌打開時完成?讓我們來討論。 – 2014-05-19 23:48:56

4

爲別人有類似的錯誤 - 我,因爲我有一個函數有這個問題,在原子上下文中調用時,使用kzalloc(..., GFP_KERN)時應該使用GFP_NOWAITGFP_ATOMIC

這只是當你不想要的時候睡眠函數的一個例子,這是你在內核編程中必須小心的事情。

希望這對其他人有用!

相關問題