分享在使用 cgo 串接現有的 c library 讀取, usb 裝置送來的訊息的應用所遇到之困難。此應用目的是讀取一把自製的 usb 鍵盤的 debug message,但因 cgo call performance,channel 的特性而讀取到異常的訊息。我將分析問題的成因,以及最後的解決方法。
我是一位人體工學鍵盤的推廣者,鍵盤使用自製的韌體,這樣的鍵盤可以輸出 debug message 和定義每顆按鍵的功能。如果讓越常按的按鍵功能能越靠近手指自然擺放的位置,就可以減少手需要移動的距離。
為了有數據研究自己的使用按鍵紀錄來改進該鍵位如何擺放,我讓鍵盤透過 usb 輸出我日常按鍵盤的紀錄。但原先用於讀取 usb debug message 的程式是另一隻純 c 語言寫成程式,所以一開始我本來以為簡單使用 cgo 直接將原來的 library 串起來就可以了,沒想到就在過程中遇到因為太多 cgo call 而造成速度上不去,進而造成收到的 message 會有 lost。另外我也因為 go channel 的 lock 特性,即便使用 buffer channel,也會遇到因 performance 而與底層的 library 無法配合,導致讀取過程中失敗而卡死的情況。我想分享如何改善 cgo call 和解決 channel 造成的瓶頸,最終才成功讀取並把資料輸出,以及我怎麼透過 go 的特性與設計來協助我開發,和我之後還打算串接的應用。
About lschyi
Software Developer, also an ergonomic keyboard developer.