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

作者: waterdisney (想要征服的世界)   2017-03-17 22:19:59
分兩部份討論這個問題
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,
這才是比較完整的作法
作者: NAMESTANLY (Stanley~ New life)   2017-03-25 15:31:00
1.第一個問題 是可以的唷

Links booklink

Contact Us: admin [ a t ] ucptt.com