您的位置:首页 > 其它

30天自制操作系统------增加命令行窗口

2017-08-23 11:06 218 查看
一、蜂鸣器发声

我们的操作系统还没有发声的功能,蜂鸣器发声的操作控制如下:

    1、音高操作

 (1)AL=0xb6;OUT(0x43,AL)

 (2)AL=设定值的低8位;OUT(0x42,AL)

 (3)AL=设定值的高8位;OUT(0x42,AL)

 (4)设定值为0时当作65536来处理

 (5)发声的音高为时钟除以设定值。也就是说设定值为1000时相当于发出1.19318KHz的声音;设定值为10000时相当于119.318Hz。因此设定2712即可发出约440Hz的声音。

2、蜂鸣器ON/OFF

     (1)使用I/O端口0x61控制

     (2)ON:IN(AL,0x61);AL|=0x03;AL&=0x0f;OUT(0x61,AL)

     (3)OFF:IN(AL,0x61);AL&=0x0d;OUT(0x61,AL)

   我们的代码中已经有了关于端口的操作,只要根据以上的操作将其写到API里即可使用。

 

二、增加更多的颜色

操作系统开发到现在只有16种颜色,我们将光的三原色红蓝绿的每种颜色赋予6个色阶,这样我们就可以得到6*6*6=216种颜色。

而纯色之间不同的混合方式也可以产生不同的颜色,我们使用3种不同的混合方式产生不同的颜色,相邻色阶之间使用3种不同方式进行混合,那么每种颜色就会产生6+3*5=21级色阶。

 

三、增加命令行窗口

我们写了很多应用程序,但是我们并不能同时运行两个应用程序,因为我们只有一个命令行窗口。为了可以同时运行两个应用程序,我们可以打开两个命令行窗口。

打开两个窗口不是问题,问题在于“要向哪个命令行窗口输出字符”,原本只有一个命令行窗口,我们将命令行变量cons保存在内存0x0fec中,但是如果有两个命令行窗口的话,就没有办法保存两个cons变量。

所以我们将修改TASK结构体如下(增加变量cons和ds_base):

struct TASK
{
int sel,flags; /*sel用来存放GDT的编号*/
int level;
int priority; /*优先级*/
struct FIFO fifo;
struct TSS tss;
struct CONSOLE *cons;
int ds_base;
};

这样就可以区分不同命令行窗口。然后将代码中相关操作进行相应的修改。

 

以前我们一次只能运行一个应用程序,所以我们对每个应用程序的数据段和代码段的分配都是一样的,但是如果有两个命令行窗口,可以同时运行两个应用程序的话,后运行的应用程序则将覆盖先运行应用程序的数据段和代码段,导致应用程序无法正常运行。

所以我们需要修改数据段和代码段的分配,以task->sel来分配应用程序的数据段和代码段。从而解决内存覆盖的问题。

 

四、变得更像真正的操作系统

我们原来的task_a的窗口到现在已经没有什么用了,所以我们要把它给删掉。

将其删掉之后很多按键的操作就不需要再区分task_a窗口和其他窗口了。

笔者将一般字符、退格键、回车键归为一类情况,但是我在调试过程中发现这样并不能识别退格键和回车键,所以就将其分开写,如下:

if(s[0]!=0) //一般字符
{
fifo_put(&key_win->task->fifo,s[0]+256);
}
if(data==256+0x0e)//退格键
{
fifo_put(&key_win->task->fifo,8+256);
}
if(data==256+0x1c)//回车键
{
fifo_put(&key_win->task->fifo,10+256);
}

因为删掉了task_a的窗口,所以输入窗口的初始值也就只能改成命令行窗口之一了。

注意:为了使得操作系统可以正常运行,我们要将console的FIFO在bootpack.c中就进行初始化。这是因为命令行窗口任务的优先级比较低,只有当bootpack.c中的HariMain休眠之后才会运行命令行窗口,而如果不运行这个任务的话,FIFO缓冲区就不会被初始化。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  操作系统