Ftrace公開課火熱報名中:Ftrace公開課:站在設計者的角度來理解ftrace(限50人)。課程第一期報名已截止且已開課,第二期報名請咨詢客服(小月微信:linuxer2016)。
Leo Hou,目前就職于IC行業某硬件數據加速獨角獸企業,從事虛擬化方向,聚焦于基于QEMU/KVM的IO虛擬化和系統虛擬化,主要負責虛擬化相關方案和團隊建設。
長期從事Linux內核驅動開發、Linux內核開發和Linux系統虛擬化(QEMU/KVM),喜歡分析Linux內核子系統基本原理并撰寫技術博客,長期關注kernel、QEMU的開源項目,經常參加相關開源社區活動。
(個人博客:https://leo-hou.github.io/)
??機械按鍵是指在硬件電路中,通過機械按鍵開關實現電平信號的通斷來達到按鍵觸發的硬件組件,見圖1.1:

??嵌入式等電子設計中,機械按鍵的檢測兩種方法:
● 掃描檢測:定時掃描IO口狀態
● 中斷檢測:啟用IO中斷
??此后的內容都是圍繞定時掃描IO口狀態的方式展開的。
??由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上就穩定的接通,在斷開時也不會一下子徹底斷開,而是在閉合和斷開的瞬間伴隨了一連串的抖動。設按鍵時間為Ta,抖動時間Td,則Ta、Td的特性如下(見圖1.2.1):
● Ta≈100ms(最快50ms);
● Td≈10ms;

??理想的按鍵波形是沒有抖動的,但實際的波形是有電平抖動的,對實際波形進行數字化抽象后會發現數字信號存在毛刺,見圖1.2.2:

為了消除電平信號的毛刺,目前工程上有兩種手段,硬件消抖和軟件消抖:
● 在硬件電路上和按鍵并聯濾波電容
● 延時確認:當檢測到按鍵狀態改變時,先延時20ms,再次檢測按鍵;
● 持續采樣:持續采集按鍵狀態,用數字狀態機邏輯來判斷按鍵動作。
??硬件消抖需要增加元器件,增加項目成本,軟件消抖采用延時確認方式時,軟件程序需要延時等待,延時過程不能進行其他處理,對程序架構不太友好,而持續采樣不會對程序流程造成阻塞,后續對持續采樣方式進行深入闡述。
??一次按鍵動作可以抽象為3個狀態,按下、抬起、長按:
● Keydown:一次按鍵操作的按下
● Keyup:一次按鍵操作的抬起
● Keypress:一次按鍵操作持續按住按鍵

??將軟件掃描按鍵狀態的軟件系統進行數字邏輯電路抽象:
● 時鐘抽象:軟件每隔20ms采集一次按鍵的狀態;
● 狀態抽象:連續掃描3次得到狀態序列011時,keydown才置1;
● 邏輯電路抽象:可以抽象為串行數據檢測器,只有輸入011才置1,采用同步時序邏輯電路的設計思路。

● Scankey:軟件定時掃描的按鍵IO口狀態(0/1);
● Keydown:一次按鍵操作的按下;
● 設按鍵輸入Scankey為X,輸出結果Keydown為Y;
● 設沒有1輸入以前的狀態為a;
● 設輸入一個1后為狀態為b;
● 設前后有兩個1輸入后狀態為c;
● 設連續有三個1狀態為d
??經過上面的數字邏輯抽象后,可以得到狀態轉換圖和狀態轉換表:

??通過上節的狀態轉換圖和狀態轉換表(圖2.2.1)可看出,狀態c和狀態d擁有相同的狀態轉換路徑,所以可以將狀態c和狀態d合并為同一個狀態c,化簡后得到相應的狀態轉換圖和狀態轉換表,見圖2.2.2.A:

??根據狀態分配原則,狀態M=3,所以取觸發器位數n=2,可以選用兩個D觸發器:D0和D1,且輸出為Q0、Q1。如果取Q1Q0的狀態00、01、10分別代表狀態a、b、c,依據狀態轉換圖得到如下卡諾圖。

將卡諾圖分解,得到圖2.2.2.C:

● 由Q1*、Q0*的卡諾圖,可得狀態方程:
Q1*=XQ0 +XQ1Q0*=XQ1ˊQ0ˊ
● 又因為D觸發器特性方程為Q*=D,所以有:
Q0* = D0Q1* = D1
● 結合狀態方程,得驅動方程:
D1 = XQ0 +XQ1D0 = XQ1ˊQ0ˊ
● 由Y的卡諾圖得輸出方程:
Y = XQ0??定義每次掃描得到的按鍵電平信號狀態的變量為Scankey,得按鍵按下Keydown相應C代碼:
D1=Scankey & (Q0 | Q1);D0=Scankey & (~Q0) & (~Q1);Keydown=Scankey & Q0;Q1=D1;Q0=D0;
??系統設計時申請一個時鐘定時器資源,20sm觸發一次,每次觸發定時中斷時掃描得到按鍵電平狀態Scankey,并進行上述算法運算,得到Keydown狀態,同理可推出Keyup和Keypress的算法,感興趣者可自行推算。
??上述數字狀態機軟件可以把一次按鍵操作的Keydown、Keyup、Keypress一起檢出,代碼精簡,效率高。當然這種方式對系統實時性有要求,狀態會隨輸入改變而改變,同時耗費系統定時器資源,需要定時查詢。
往期精華文章:【精華】Linux閱碼場原創精華文章匯總
閱碼場付費會員專業交流群
會員招募:各專業群會員費為88元/季度,權益包含群內提問,線下活動8折,全年不定期群技術分享(普通用戶直播免費,分享后每次點播價為19元/次),有意加入請私信客服小月(小月微信號:linuxer2016)
專業群介紹:
甄建勇-性能優化與體系結構
本群定位Perf、cache和CPU架構技術交流,覆蓋云/網/車/機/芯領域資深用戶,由閱碼場資深講師甄建勇主持。
李春良-Xenomai與實時優化
本群定位Xenomai與實時優化技術交流,覆蓋云/網/車/機/芯領域資深用戶,由閱碼場資深講師李春良和彭偉林共同主持。
周賀賀-Tee和ARM架構
本群定位Tee和ARM架構技術交流,覆蓋云/網/車/機/芯領域資深用戶,由閱碼場資深講師周賀賀主持。
謝歡-Linux tracers
本群定位Linux tracers技術交流,覆蓋云/網/車/機/芯領域資深用戶,由閱碼場資深講師謝歡主持。
?
?