Re: [問題] 關於 kernel driver interrupt ISR

看板LinuxDev作者 (想要征服的世界)時間7年前 (2017/03/17 22:20), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/3 (看更多)
分兩部份討論這個問題 1. MCU是否可更改行為, 在buffer水位半滿的時候就發interrupt 通知AP 來取資料? 2. MCU不改行為的狀況下, 有什麼辦法可提高spi_sync的優先級? 確保spi_sync盡早完成 現在你的問題應該是卡在2, 有哪些辦法可以用? 先分析你目前handle interrupt 的方式 因為spi_sync會sleep,所以在top half中不可直接調用 spi_sync 需要把spi_sync放到 bottom half去做. 因此你透過request_thread_irq時註冊了一條kernel thread, 當 top half工作處理完時 會將此條需要 wake up的kernel thread叫起來 ( spi_sync的code在此thread內) 但因為此kernel thread也會被系統 scheduling. 導致spi_sync因為scheduling的關係 無法立即去跟MCU要資料 導致錯過timing, spi_sync時取得的資料無用 在這種情況下 如果不修改 (1) MCU的行為及設計 你沒有辦法從根本解決這個問題 你只能盡量調高kernel thread的priority, 但是仍然無法將錯誤率降到 0 bottom half的幾種能用的手段大概就是 request_thread_irq 不可調priority ,會sleep的環境可用 softirq 不可調priority ,會sleep的環境不能用 tasklet 可調priority, ,會sleep的環境不能用 workqueue 可調priority, ,會sleep的環境可用 也就是說,目前你可以嘗試用workqueue, 試試看調整丟進workqueue thread的priority 後(WQ_HIGHPRI) 看掉資料的情況有沒有比較好. 如果可以從根本改善設計的話 1. MCU的buffer水位半滿就要發interrupt通知AP取資料. 2. 可以在spi_sync()完成後 回個 io_complete 給MCU, 這才是比較完整的作法 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.47.7 ※ 文章網址: https://www.ptt.cc/bbs/LinuxDev/M.1489760401.A.565.html

03/25 15:31, , 1F
1.第一個問題 是可以的唷
03/25 15:31, 1F
文章代碼(AID): #1Oo_2HLb (LinuxDev)
文章代碼(AID): #1Oo_2HLb (LinuxDev)