看板 LinuxDev 關於我們 聯絡資訊
※ 引述《roylee17 (把我id還我阿......)》之銘言: : ※ 引述《musicguitar ()》之銘言: : : 想請問. : : 如果使用一個share的interrupt.也就是除了我自己的裝置會觸發這個中斷 : : 其他裝置也會觸發. : : (實際上這個是X86裡的IRQ9.ACPI interrupt,我需要知道GPE0 觸發訊號) : : 我是否需要做spin lock或是semaphore去做lock的動作. : 需要 lock 與否,是取決你要存取的資料是否共享 : 而不是因為 irq 是不是共用 : : 因為我在kernel 2.6.32使用這兩個lock都會出現kernel error(類似kernel bug)的訊息. : : 我的ISR所做的事是去動作I2C.讀取device的暫存器. : ^^^^^^^^^^^^^^^^^^ : 除了你的 ISR 外,有其他的 code flow 會存取這個暫存器嗎? 抱歉!! 剛剛確認一下我的程式.更新兩個訊息. 1. 我的kernel是2.6.31 2. ISR的動作 因為是透過SCI發出的中斷. ISR中會做的事是讀取GPE暫存器.確認是否是我要擷取的interrup. 基本上.這個站存器只有我去讀取.如果是我的訊號.會將interrupt flag清掉. 沒有其他code flow會處裡這個暫存器了. : 另外,ISR 中,不適用 semaphore : 或是其他需要 process context 的同步機制 不好意思.semaphore跟spinlock印象已經有點久遠了!(好像還有mutex) 不太記得這兩個用法上的差異.什麼時候該用哪種. 我會再去查查資料. 可以請問.ISR為何不適用semaphore??? : spin lock 應該是沒問題的(需不需要是另外一回事) 初始化沒問題.我都有做到. : 如果你的 lock 是自己建的,記得初始化 : 如果是 lock 系統中現有的某個 lock, : 那要檢查一下整個 lock 的使用情況, : 你有沒有 double lock/unlock : error message 可以貼上來 error message要等我一下.手邊目前沒辦法得到!! : : 另外.我曾在kernel 2.6.29中.semaphore不會出現error.只有spin lock會! : : 所以我覺得奇怪.ISR中.到底需不需要再做lock的動作. : : 因為我一lock就當機了!!!所以我現在是把lock都拿掉了!! : : 不知道會不會出問題... 另外一個問題.在kernel 2.6.31中多出一個lock的方式. DECLARE_RWSEM(isrlock); down_write(&isrlock); up_write(&isrlock); 不知跟semaphore有沒有差別? 我之前有用過mutex, spinlock,跟這個semaphore. 使用這三種都會當機!!!出現error! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.231.26.212 ※ 編輯: musicguitar 來自: 61.231.26.212 (02/20 18:51) ※ 編輯: musicguitar 來自: 61.231.26.212 (02/20 18:54)
james732:semaphore會造成context switch, spin lock不會 02/20 19:00
james732:而ISR中,不應該發生context switch,所以不該用sem 02/20 19:01
richliu:你的 ISR 有沒有先 disable IRQ ? 02/21 16:37
musicguitar:對!!我忘記disable了.是否disable就不需要lock? 02/22 23:25
richliu:你是 SMP 就要 lock, 如果不是就可以不要 lock 02/25 18:28