实现一个命令行任务,首先需要一个命令行窗口,然后需要一个命令行任务,在命令行任务中实现命令行的相关功能。
一、创建一个命令行窗口
创建命令行窗口就是在屏幕上画个窗口出来,实际就是操作显存,这一部分利用前面已经实现的makewindow8函数即可实现。
二、创建一个命令行任务
有了命令行窗口,我们再来实现命令行的功能。
(1)光标闪烁功能
在刚开始做命令行时,命令行的功能就是光标闪烁即可,也就是说命令行任务中需要一个定时器来控制光标色块的颜色,使之产生闪烁的效果。在HariMain函数中已经实现过光标的闪烁功能,该功能还需要使用一个FIFO队列,通过在队列中存放不同的数值,可以使得光标的颜色进行变换,实现方法与HariMain中光标闪烁的实现方法相同。
(2)切换输入窗口
目前用户使用键盘输入数据时,所有的数据都被task_a给接收了,新建的命令行窗口完全就是个摆设,为了使得命令行窗口可以接收数据,在HariMain中设置整型变量key_to,
key_to=0时,task_a接收键盘数据;key_to=1时,命令行任务接收键盘数据。键盘数据都保存在各任务的FIFO中。而key_to值的切换则是由主程序HariMain负责监听Tab键来进行切换的,同时在切换窗口的同时,窗口标题栏的颜色发生改变。
(3)实现字符输入
只要各个任务可以接收到字符编码,那么该任务就可以实现字符输入的功能,各个任务接收到的字符编码都保存在其FIFO中,在《30天自制操作系统》中,作者将FIFO与TASK绑定,结构体FIFO中还有个TASK的指针成员,作者的代码运行起来没有问题,但是我根据作者的步骤编写出来的操作系统就运行不起来,在VMWare上就会出现导致虚拟CPU关闭的错误。
所以我直接将命令行任务的FIFO在bookpack.c定义为全局变量来避免此问题。
(4)符号的输入
键盘上的有些按键与SHIFT键结合就可以产生其他字符,为了使得编写的操作系统可以显示这些字符,我们需要监测SHIFT键的状态,SHIFT键的按下与抬起都有相应的编码,只需要监测是否有这些编码产生即可。
|