os如何处理键盘的所有按键,显示or不显示,显示是如何显示
【0】README
0.1) source code and text decription are from orange’s implemention of a os , and for complete code , please visit 我待會上傳;
【1】 鍵盤輸入緩沖區(qū)
step1)緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)如下:
step2)對緩沖區(qū)進行添加操作:(只是對 keyboard_handler 添加了一些代碼, 上述荔枝圖)
step3)修改后的init_keyboard
step4)初始化時鐘中斷
【2】用添加的新任務(wù)處理鍵盤操作
- 終端任務(wù):我們的任務(wù)不僅會處理鍵盤操作、還會處理屏幕輸出等內(nèi)容, 這些操作共同組成同一個任務(wù)——終端任務(wù);
- keyboard_read():將掃描碼從緩沖區(qū)讀出,并打印;緩沖區(qū)的r_tail 指針移動, 而你是否記得將掃描碼存入緩沖區(qū) 是 緩沖區(qū)的 head指針移動;
【3】解析掃描碼
Attention:下面就是對 keyboard_read進行擴展了,像添加對小寫字符,數(shù)字的處理, 后面是 F1~F12的鍵處理, shift鍵處理,home鍵的處理等等;
Conclusion)修改的代碼內(nèi)容包括:添加了鍵盤中斷緩沖區(qū)的代碼,修改了 keyboard_handler()函數(shù) + init_keyboard()函數(shù) + 對小寫字母和數(shù)字的處理代碼;
C1.1)我們給出修改后的代碼調(diào)用過程(重點在于 keyboard_handler()函數(shù) + init_keyboard()函數(shù) ):
C1.2)如何取到用戶鍵入的數(shù)據(jù),以及顯示它們;
C2)運行結(jié)果為:
3.1)處理shift、alt、ctrl
注意:要將鍵的左右兩邊加以區(qū)分,如左shift和右shift的功能是不同的;(上上圖以及說明了)
3.2)處理所有按鍵
存在的問題-Problems 和 解決方法Solutions:
Problem1)如果掃描碼更加復(fù)雜一些,比如超過3個字符,如今的程序還不足以很好地處理;
因為當(dāng)一個掃描碼有不止一個字符時, 實際上會產(chǎn)生不止一次中斷。看個荔枝:如果我們按一下Shift + A,產(chǎn)生的 0x2A0x1E0x9E0xAA 是4次中斷接收來的;
- step1) 我們的鍵盤控制器8042 接收來自 鍵盤編碼器8048 傳送過來的鍵入數(shù)據(jù)的相應(yīng)掃描碼;
- step2) 8042收到掃描碼后,會把該掃描碼 編碼成 make code+break code的形式, 并將其放置到輸入緩沖區(qū)中,而8042的 輸入緩沖寄存器只有一個字節(jié)來存儲掃描碼;;
- step3) 8042告訴 中斷控制寄存器8259A 產(chǎn)生中斷, 交給鍵盤中斷處理程序去執(zhí)行;(如果此時鍵盤又有新的鍵被按下,鍵盤控制器8042 將不再接收 鍵盤編碼器8048傳送過來的掃描碼,一直到緩沖區(qū)被清空,所以這就是為什么引入輸入緩沖區(qū)的原因.)
我們再來個補充(對比假設(shè)):
- 假設(shè)1)添加鍵盤輸入緩沖區(qū)(占用內(nèi)存空間)后:只要鍵入數(shù)據(jù),那么就會觸發(fā)鍵盤中斷處理程序,該程序會從 鍵盤控制器8042的輸入緩沖寄存器中讀取鍵入數(shù)據(jù)的掃描碼,并存儲在鍵盤輸入緩沖區(qū)中(之前已經(jīng)建立在內(nèi)存空間中了),也即讓8042的輸入緩沖區(qū)被清空,這樣8042才會接收 鍵盤編碼器8048傳送過來的鍵入數(shù)據(jù)的 掃描碼;
- 假設(shè)2) 如果不添加鍵盤輸入緩沖區(qū)(占用內(nèi)存空間):只要鍵入數(shù)據(jù),那么就會觸發(fā)鍵盤中斷處理程序,該程序會從 鍵盤控制器8042的輸入緩沖寄存器中讀取鍵入數(shù)據(jù)的掃描碼,并顯示該掃描碼對應(yīng)的數(shù)據(jù);
- 假設(shè)2中的問題):如果CPU沒有立即響應(yīng)中斷處理程序 怎么辦? 這使得8042的輸入緩沖區(qū)不能被清空,反正一句話,就是要盡快讓鍵盤控制器8042的輸入緩沖器清空,這樣才能使得8042可以連續(xù)不斷地接受8048 傳送過來的掃描碼;
Solution1)我們將 從鍵盤控制器 8042 的輸入緩沖寄存器(只能緩沖一個字節(jié)的數(shù)據(jù))中讀取數(shù)據(jù)的代碼從 keyboard_read 函數(shù)中抽取出來,并封裝到 get_byte_from_kbuf()函數(shù)中; 這樣對于掃描碼比較長的字符來說,我們可以通過 keyboard_read 函數(shù)多次讀取鍵盤緩沖區(qū)中的數(shù)據(jù)(鍵入數(shù)據(jù)的掃描碼而已);
鍵盤緩沖區(qū)的作用(function)(干貨):
- 有了鍵盤緩沖區(qū), 8042 緩沖區(qū) 無需受到 task_tty 進程運行狀況的影響,因為鍵盤中斷處理程序 是將輸入的數(shù)據(jù) 保存到內(nèi)存緩沖區(qū)去了,這樣鍵盤控制器8042的輸入緩沖器被清空,可以繼續(xù)接受8048傳送過來的掃描碼;
Problem2)關(guān)于非打印字符的問題: 如果按下 諸如 F1、F2這樣的功能鍵,系統(tǒng)會把它當(dāng)做可打印字符來處理,從而打印出一個奇怪的符號;
Solutions2)我們的意思是: keyboard_read這個函數(shù)只是 負(fù)責(zé)讀取掃描碼就可以了(一次或多次調(diào)用get_byte_from_kbuf 函數(shù) ),至于如何處理, 不應(yīng)該由它來負(fù)責(zé)(因為不是所有鍵入的字符都是需要打印字符, 如Ctrl、Shift、大寫鎖定鍵、Esc鍵等);所以,我們又將打印字符的代碼抽取為 in_process ()函數(shù), 在in_process()函數(shù)中,依據(jù)掃描碼判斷鍵入的字符是否需要打印;(具體代碼調(diào)用如下圖所示)
總結(jié)
以上是生活随笔為你收集整理的os如何处理键盘的所有按键,显示or不显示,显示是如何显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 待机时间长的安卓手机(待机时间长的安卓手
- 下一篇: 电脑统计字数的快捷键(Word字数统计快