鄭玉章,徐愛鈞
(長江大學 電子信息學院,荊州 434023)
嵌入式開發過程中按鍵檢測算法的改進
鄭玉章,徐愛鈞
(長江大學 電子信息學院,荊州 434023)
為了解決嵌入式系統開發過程中,傳統按鍵檢測算法將單片機的資源全部用來做按鍵掃描,從而使CPU的利用率大大降低的問題。在傳統按鍵檢測算法的基礎上,提出了一種基于有限狀態機(FSM)的按鍵檢測程序算法。為了驗證基于FSM的按鍵檢測程序算法較傳統算法的優勢,在Keil uVison3集成開發壞境下,將兩種算法做了性能分析。通過性能分析窗口,可以看出新算法在CPU利用率方面得到了大大的提高。
嵌入式開發;按鍵檢測;FSM算法;Keil uVision3
在嵌入式系統中,按鍵和鍵盤是一種基本和常用的接口,它是構成人機對話通道的一種常用方式。按鍵和鍵盤能實現向嵌入式系統輸入數據、傳輸命令等功能,是人工干預、設置和控制系統運行的主要手段。眾所周知,傳統的按鍵接口程序采用軟件延時來檢測按鍵輸入,這種算法不僅使MCU的效率大大降低,而且也不容易同系統中其他功能模塊協調工作,系統的實時性極差。
除非當前系統搭載了實時操作系統,比如μC/OS-II,一旦當前任務要進行延時操作,系統就會自動進行任務調度,執行其他任務,當之前的任務延時完畢,系統會自動執行之前的任務。遺憾的是單片機系統資源有限,不適合搭載μC/OS-II實時操作系統,另外μC/OS-II用在商業上是要收費的,這又間接增加了系統開發的成本。因此本文針對以上不足,在不搭載實時操作系統的前提下提出一種新的算法來編寫鍵盤和按鍵接口的處理程序。實驗表明該算法能夠極大地提高CPU的利用率,在實際產品設計中具有一定的實用性。
嵌入式系統開發過程中,無論是針對低端的8051系列、AVR系列8位單片機,還是TI的MSP430系列16位單片機,亦或是更為高端的ARM、DSP,總是少不了通過按鍵完成人與微處理器直接的對話工作,即所謂的“人機交互”。
由于按鍵的開關為機械彈性觸點開關,加上人們按鍵時的力度、方向的不同,按鍵開關從按下到接觸穩定要經過數ms級的彈跳抖動,即在按下的幾十ms時間里,會連續產生多個脈沖。釋放按鍵時,電路也不會一下斷開,同樣會產生抖動。因此,為了確保MCU對一次按鍵動作只確認一次,在保證系統具有較好實時性的前提下,必須要進行消抖處理。
為了解決以上問題,人們進行了大量的研究,在硬件和軟件方面都下了不少功夫,在硬件方面有人提出采用R-S觸發器或RC積分電路,但是在硬件設計上增加了系統的成本;在軟件方面有人提出采用中斷輸入按鍵接口,的確能夠提高系統實時性,但是不能解決消抖問題,還是會出現輸入控制不穩定的現象。因此,在考慮節約成本的情況下,提出一種新的軟件算法來解決上述問題具有實際意義。
2.1 有限狀態機分析設計的基本原理
有限狀態機(FSM)是實時系統設計中的一種數學模型,是一種重要的、易于建立的、應用比較廣泛的、以描述控制特性為主的建模方法,它可以應用于從系統分析到設計(包括硬件、軟件)的所有階段。
很多實時系統,特別是實時控制系統,其整個系統的分析機制和功能與系統的狀態有相當大的關系。有限狀態機由有限的狀態和相互之間的狀態轉移構成,在任何時候只能處于給定數目的狀態中的一個。當接收到一個輸入事件時,狀態機產生一個輸出,同時也可能伴隨著狀態的轉移。 一個有限狀態機在數學上可以描述如下:
① 一個有限系統狀態的集合為:
其中:i=1,2,3,…,q。該式表明,系統可能存在的狀態有q個,而在tk時刻,系統的狀態為其中之一Si(唯一性)。
② 一個有限系統輸入信號的集合為:
其中:j=1,2,3,…,m,表示系統共有m個輸入信號。該式表示在tk時刻,系統的輸入信號為輸入集合的全集或子集(集合性)。
③ 一個狀態轉移函數F為:
狀態轉移函數也是一個狀態函數,它表示對于tk時刻,系統在某一狀態Si下,相對給定輸入Ij后,FSM轉入該函數產生的新狀態。這個新狀態就是系統在下一時刻的狀態,也是唯一確定的(唯一性)。
④ 一個有限的輸出信號集合為:
其中:l=1,2,3,…,n,表示系統共有n個輸入信號。該式表示在tk時刻,系統的狀態為Si時,其輸出信號為輸出集合的全集或子集(集合性)。這里需要注意的是,系統的輸出只與系統所處的狀態有關。
⑤ 時間序列為:
在狀態機中,時間序列是非常重要的一個因素,從硬件的角度看,時間序列如同一個觸發脈沖序列或同步信號;而從軟件的角度看,時間序列就是一個定時器。狀態機由時間序列同步觸發,定時檢測輸入,根據當前的狀態輸出相應的信號,并確定下一次系統狀態的轉移。在時間序列進入下一次觸發時,系統的狀態將根據前一次的狀態和輸入情況發生狀態的轉移。其次,時間序列可能是一個系統的輸入信號,影響到狀態的改變,進而影響到系統的輸出。所以對于時間序列,正確分析和考慮選擇合適的時間段的間隔也是非常重要的。若間隔太短,對系統的速度、頻率響應要求高,并且可能降低系統的效率;若間隔太長,系統的實時性差,響應慢,還有可能造成外部輸入信號的丟失。一般情況下,時間序列的時間間隔的選取,應稍微小于外部輸入信號中變化最快的周期值。
通常主要有兩種方法來建立有限狀態機,一種是“狀態轉移圖”,另一種是“狀態轉移表”,分別用圖形方式和表格方式建立有限狀態機。實時系統經常會應用在比較大型的系統中,這時采用圖形或表格方式對理解復雜的系統具有很大的幫助??偟膩碚f,有限狀態機的優點在于簡單易用,狀態間的關系能夠直觀看到。應用在實時系統中時,便于對復雜系統進行分析。
2.2 基于有限狀態機分析的按鍵檢測程序設計

圖1 按鍵狀態機轉換圖
圖1給出了一個簡單按鍵狀態機的狀態轉換圖。在圖1中,將一次按鍵完整的操作過程分解為3個狀態,時間序列周期為10 ms,即每隔10 ms檢測一次按鍵的輸入信號,并輸出一次按鍵的確認信號,同時按鍵的狀態也發生一次轉換。 圖1中“狀態0”為按鍵的初始狀態,當按鍵輸入為“1”時,表示按鍵處于開放狀態,輸出“0”(1/0),下一狀態仍舊為“狀態0”。當按鍵輸入為“0”時,表示按鍵閉合,但輸出還是“0”(0/0)(沒有經過消抖,不能確認按鍵真正按下),下一狀態進入“狀態1”。
“狀態1”為按鍵閉合確認狀態,它表示在10 ms前按鍵為閉合狀態,因此當再次檢測到按鍵輸入為“0”時,可以確認按鍵被按下了(經過10 ms的消抖),輸出“1”表示確認按鍵閉合(0/1),下一狀態進入“狀態2”。而當再次檢測到按鍵的輸入為“1”時,表示按鍵可能處在抖動干擾狀態,輸出為“0”(1/0),下一狀態返回到“狀態0”。
這樣,利用狀態1,實現了按鍵的消抖處理?!盃顟B2”為等待按鍵釋放狀態,因為只有等按鍵釋放后,一次完整的按鍵操作過程才算完成。 從對圖1的分析中可以知道,在一次按鍵操作的整個過程中,按鍵的狀態是從“狀態0”→“狀態1”→“狀態2”,最后返回到“狀態0”的。并且在整個過程中,按鍵的輸出信號僅在“狀態1”時給出了唯一的一次確認按鍵閉合狀態的信號“1”(其他狀態均輸出“0”)。所以,上面狀態機所表示的按鍵系統,不僅解決了按鍵抖動的問題,而且也確保在一次按鍵整個的過程中,系統只輸出一次按鍵閉合信號(“1”)。
一旦有了正確的狀態轉換圖,就可以根據狀態轉換圖編寫軟件了。在軟件中狀態機的程序結構,通常使用多分支結構(IF-ELSEIF-ELSE、CASE等)實現?;跔顟B機方式編寫的簡單按鍵接口函數如下:
advanced_read_key(void)
?
#define key_input PIND.7 //按鍵輸入口
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
?
char advanced_read_key(void) {
static char key_state = 0;
char key_press, key_return = 0;
key_press = key_input; //讀按鍵I/O電平
switch (key_state){
case key_state_0: //按鍵初始態
if (!key_press) key_state = key_state_1;
//鍵被按下,狀態轉換到按鍵確認態
break;
case key_state_1: //按鍵確認態
if (!key_press){
key_return = 1;
//按鍵仍按下,按鍵確認輸出為“1”
key_state = key_state_2;
//狀態轉換到按鍵釋放態
}
else
key_state = key_state_0;
//按鍵已抬起,轉換到按鍵初始態
break;
case key_state_2:
if (key_press) key_state = key_state_0;
//按鍵已釋放,轉換到按鍵初始態
break;
}
return key_return;
}
…
在Keil uVision3開發壞境中提供了性能分析工具,利用該工具,可以了解程序中哪部分的執行時間最長,調用次數最多,從而了解影響整個程序中執行的瓶頸。下面將傳統按鍵檢測算法和改進的基于FSM狀態機算法的CPU占用率情況通過性能分析窗口給予展示,如圖2、圖3所示。

圖2 傳統按鍵檢測算法的CPU性能分析圖

圖3 FSM改進算法的CPU性能分析圖

[1] Jean J Labrose.嵌入式實時操作系統μC/OS-II[M].2版.邵貝貝,等譯.北京:北京航空航天大學出版社,2012.
[2] 馬潮.AVR單片機嵌入式系統原理與應用實踐[M].北京:北京航空航天大學出版社,2011.
[3] 溫子琪.51單片機C語言創新教程[M].北京:北京航空航天大學出版社,2011.
[4] Atmel. Atmega16中文手冊.
[5] 宏晶科技STC89C51RC/RD+系列單片機器件手冊。
[6] keil Software.keil c51完全中文手冊,2003.
An Improved Key-detection Algorithm During the EmbeddedDevelopment
Zheng Yuzhang, Xu Aijun
(Electronics and Information Engineering,Yangtze University,Jingzhou 434023,China)
In order to solve the problem that traditional key detection algorithms make all MCU resources for key scan so as to reduce CPU utilization during the embedded development, a key detection program algorithm based on the finite state machine (FSM) is proposed on the basis of traditional key detection algorithms. In order to verify the superiority of the button detection program algorithm based on FSM,the performances of two algorithms are analyzed in Keil uVison3.Through the performance analysis window, the new algorithm has been greatly improved in CPU utilization.
embedded development;key detection;FSM algorithm; Keil uVison3
TP273
A
2014-02-21)