第四步:创建键盘中断处理模块和初步搭建程序执行系统

来源:互联网 发布:雪梨开的淘宝店铺 编辑:程序博客网 时间:2024/05/21 03:54

键盘中断处理模块:
    在前一步,已经可以对键盘中断有反应了,但是按下一次键盘按钮后,就不再反应了。这是因为,必须要向键盘数据端口取出从键盘传来的扫描码后,才会继续等待与保存下一个键盘中断产生的扫描码。

    键盘每个按钮按下时和持续按下不松开会产生键盘中断,以及对应按键的扫描码(scan_code),松开时,也会产生键盘中断,此时对应键盘提供的叫做中断码(Break Code),详情见“keyboard.h”的宏定义。


对于同一个键盘按钮,扫描码和中断码有如下关系:
扫描码(scan_code)+ 0x80 = 中断码(Break Code)

    此外,一些特殊的键盘按钮,会有E0或E1前缀。
    总之,扫描码(中断码)与对应的ASCII码和功能键的映射有自己的一套规则。在编写键盘驱动时,为了简便,都是建立一个数组,通过使用扫描码或是换算成扫描码的中断码作为下标,查找到对应的按键ASCII码或功能键。具体见 “keyboard.h”里的keymap[]数组。对于一些组合键,再进行特殊处理。

    关于键盘中断处理,就解释到这,很多的,可以看看下面“keyboard.h”和“keyboard.c”等具体的代码。


程序执行系统:
    程序执行系统,或者说“域结构”是我的操作系统特有的一个执行机制,用于代替普通的操作系统里的进程调度机制。简单的说,“域结构”就是一个双向链表,每个节点都包含一个无参无fanh值的函数(执行函数)。通过不断循环调用每个节点的执行函数以及动态的添加或删除执行函数节点形成的一个程序执行系统。
    与普通的操作系统里的进程调度机制相比,“域结构”机制是以函数为单位依次轮换执行,而进程调度是以进程(某个独立的程序)为单位根据调度算法轮换执行。
    相对来说,“域结构”机制有诸多缺点,最大的一个问题是可靠性与安全性。但是出于个人原因,我还是选择了使用这种调用机制。

    键盘中断处理模块,虽然是通过“域结构”调用的,但是基本的流程还是和常用的键盘驱动程序一样。但这只是暂时测试用的,使用“域结构”编写的“域程序”需要遵循特定的规则,在接下来的几步里,会逐步改进“域结构”并修改这个键盘处理模块。

下面是此次修改了的文件和新添加的文件:
code:i8259.c(改)
因为修改不大,仅是修改了一个函数,所以不全部贴出来了。
将:

改为:(就是将原来的宏hwint_master(1),展开为具体代码,并将调用中断处理函数表的函数改为调用OnKeyEvent()函数)


code:kernel.c(改)

 

code:yu.h(新)

 

code:yu.c(新)

 

code:keyboard.h(新)

 

code:keyboard.c(新)