[問題] 關於 kernel driver interrupt ISR
先進們好,現在狀況是這樣的。目前 MCU 端要傳 data 給我 AP 開發板端,透過一根
gpio,註冊為irq,我這邊寫了個 driver,當中用到的 API 為 request_threaded_irq。
這個 api 的第二個參數 handler(上半部)為 null,第三個參數為一個 function thread
這個 thread(下半部),會透過 spi_sync 來跟 MCU 要資料,至於甚麼時候 MCU
會透過 irq 來通知我的 driver? 也就是每 1ms(每秒1000筆) 來通知我,我
每次透過 spi_sync要到的 64 byte 資料,都還會做個 check crc 的錯誤判斷,只要
有錯,這64 byte 就作廢。錄了 7200 秒,crc error 98 筆,大概1%,想要降至0.x%
看了波型,發現錯誤的時機點幾乎都是,MCU發了irq,而我的 driver 卻沒有馬上
進入 thread 發 spi command 來要資料,都是延遲了才要,也就是延遲進入 thread。
我估狗了中斷機制,和API查詢,發現用 request_threaded_irq 創造的 thread,
會類似於 workqueue 這下半部機制,而且屬於 process 上下文。既然屬於process
它就會被 kernel 來排班,甚麼時候執行,是看 kernel 而定。
request_thread_irq 裡面有個 irqflags 參數,我給他設定為 IRQF_ONE_SHOT,這個
參數代表表的是 當我這個 thread 執行完畢,才會再把 irq 打開,所以我猜想,
也許就是 kernel 還在處理 thread 的 task,irq 還沒被打開,所以 MCU 就算發 irq
我可能會導致延遲去處理,或者甚至不理IRQ(有看過波型也有發生過)。請問有甚麼可
行的方向來解決我想要即刻去處理中斷的問題?
1 我有想過把 thread 要做的內容寫在第二個參數的上半部 funcion,既然是上半部
的中斷的函式,driver 一定能立即去做處理。可是這又有一個問題,我在網路上
搜尋到,在中斷的 context 下,規定他不能睡眠,也不能阻塞,我 spi_sync 似乎
是個阻塞的 function,我除了作 spi_sync 也有做 input_sync 的 function,這看
起來也是個阻塞同步 function。中斷函式一定不能加上阻塞的嗎? 即使它運作時間
非常短?
2 softirq (下半部機制方法)???
希望能有些資訊能從前輩們獲得,萬分感激。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.220.69.181
※ 文章網址: https://www.ptt.cc/bbs/LinuxDev/M.1488966659.A.105.html
→
03/09 10:49, , 1F
03/09 10:49, 1F
→
03/09 10:49, , 2F
03/09 10:49, 2F
→
03/09 12:57, , 3F
03/09 12:57, 3F
→
03/09 12:58, , 4F
03/09 12:58, 4F
→
03/09 13:00, , 5F
03/09 13:00, 5F
→
03/09 13:01, , 6F
03/09 13:01, 6F
→
03/09 13:02, , 7F
03/09 13:02, 7F
→
03/09 13:02, , 8F
03/09 13:02, 8F
→
03/09 13:03, , 9F
03/09 13:03, 9F
→
03/09 13:04, , 10F
03/09 13:04, 10F
→
03/09 13:04, , 11F
03/09 13:04, 11F
→
03/09 13:05, , 12F
03/09 13:05, 12F
推
03/10 12:53, , 13F
03/10 12:53, 13F
→
03/10 12:54, , 14F
03/10 12:54, 14F
→
03/11 11:26, , 15F
03/11 11:26, 15F
→
03/11 11:27, , 16F
03/11 11:27, 16F
→
03/11 11:27, , 17F
03/11 11:27, 17F
→
03/13 00:09, , 18F
03/13 00:09, 18F
→
03/13 00:10, , 19F
03/13 00:10, 19F
→
03/13 00:10, , 20F
03/13 00:10, 20F
→
03/13 00:11, , 21F
03/13 00:11, 21F
→
03/13 00:12, , 22F
03/13 00:12, 22F
→
03/13 00:12, , 23F
03/13 00:12, 23F
→
03/13 00:12, , 24F
03/13 00:12, 24F
推
03/13 09:19, , 25F
03/13 09:19, 25F
→
03/13 09:20, , 26F
03/13 09:20, 26F
→
03/14 19:17, , 27F
03/14 19:17, 27F
→
03/14 19:18, , 28F
03/14 19:18, 28F
→
03/14 19:20, , 29F
03/14 19:20, 29F
→
03/14 19:21, , 30F
03/14 19:21, 30F
→
03/14 19:29, , 31F
03/14 19:29, 31F
→
03/14 19:29, , 32F
03/14 19:29, 32F
→
03/14 19:30, , 33F
03/14 19:30, 33F
→
03/14 19:31, , 34F
03/14 19:31, 34F
→
03/17 16:50, , 35F
03/17 16:50, 35F
→
03/17 16:51, , 36F
03/17 16:51, 36F
討論串 (同標題文章)
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章