22 簡單的鍵盤中斷測試

2021-10-01 14:14:59 字數 2311 閱讀 7419

先看一下硬體的連線:

鍵盤裡有個 8048 晶元,當按下某個按鍵時, 8048 就把這個鍵對應的數值傳送給 8042 ,8042就知道是哪個鍵被按下了,就會給 8259a 傳送中斷。

乙個按鍵被按下,產生的編碼叫通碼(makecode),斷開時叫斷碼(breakcode)。

按鍵有 3 種狀態,「按下」、「按下保持」、「彈起」。

有好幾種鍵盤掃瞄碼,需要乙個「中介軟體」來隱藏各套掃瞄碼的差異,這個「中介軟體」就是 8042。

總結:處理器和鍵盤之間的資料傳輸、命令控制都是通過這一中介軟體——8042.

其實就是 2 個埠, 4 個暫存器。

鍵盤的中斷訊號接在 8259a 主片的 ir1 上,對應的中斷號就是 0x21。

所以增加中斷入口程式中的0x21通道。

vector 0x21

,zero ;鍵盤中斷對應的入口

vector 0x22

,zero ;級聯用的

vector 0x23

,zero ;串列埠2對應的入口

vector 0x24

,zero ;串列埠1對應的入口

vector 0x25

,zero ;並口2對應的入口

vector 0x26

,zero ;軟盤對應的入口

vector 0x27

,zero ;並口1對應的入口

vector 0x28

,zero ;實時時鐘對應的入口

vector 0x29

,zero ;重定向

vector 0x2a

,zero ;保留

vector 0x2b

,zero ;保留

vector 0x2c

,zero ;ps/

2滑鼠vector 0x2d

,zero ;fpu浮點單元異常

vector 0x2e

,zero ;硬碟

vector 0x2f

,zero ;保留

修改my_interrupt.c中的巨集定義

#define idt_desc_cnt 0x30	 

// 目前總共支援的中斷數

新建兩個檔案 keyboard.c 和 keyboard.h 用來 鍵盤的中斷處理程式和鍵盤的初始化程式。

keyboard.c

#include

"keyboard.h"

#include

"../lib/kernel/print.h"

#include

"../kernel/my_interrupt.h"

#include

"../lib/std_int.h"

#define kbd_buf_port 0x60

// 鍵盤buffer暫存器埠號為0x60

/* 將從埠port讀入的乙個位元組返回 */

static uint8_t inb

(uint16_t port)

/* 鍵盤中斷處理程式 */

static

void

intr_keyboard_handler

(void

)/* 鍵盤初始化 */

void

keyboard_init()

編寫了鍵盤初始化函式,其中還註冊了鍵盤中斷處理函式。

在 init_all() 函式中要呼叫 keyboard_init() 。

還有,把時鐘中斷遮蔽掉,只開啟鍵盤中斷。

最終在main.c中。

main.c

int

main

(void

)

只是開啟中斷。

這樣,咱們每按下乙個按鍵,就會執行兩次中斷,每次中斷會在螢幕輸出 『k』。

鍵盤發出的中斷

在linux的世界裡,計算機系統外圍的硬體裝置是核心來管理的。核心與硬體有乙個介面。linux作業系統都提供了中斷機制。當硬體裝置想與linux作業系統通訊的時候,它首先會發出乙個非同步的中斷訊號去打斷處理器的執行,繼而打斷核心的執行。中斷通常對應著乙個中斷號,核心通過這個中斷號查詢相應的中斷服務程...

中斷方式的擴充套件矩陣鍵盤

來電了!電工總算煩了,沒想到會這麼快,多虧阿福,外面真是只能湊合,還是自個兒宿舍舒服,明天開焊!總圖最小系統 數碼管 與門實現鍵盤中斷觸發 解碼器實現矩陣鍵盤的擴充套件 擴充套件的矩陣鍵盤 程式 include 標頭檔案 include define uchar unsigned char 巨集定義...

測試真的不簡單,梳理22種測試方法與詳解

黑盒測試 不基於內部設計和 的任何知識,而是基於需求和功能性。白盒測試 基於乙個應用 的內部邏輯知識,測試是基於覆蓋全部 分支 路徑 條件。單元測試 最微小規模的測試 以測試某個功能或 塊。典型地由程式設計師而非測試員來做,因為它需要知道內部程式設計和編碼的細節知識。這個工作不容易作好,除非應用系統...