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缓冲区就不会被初始化。
我们的操作系统还没有发声的功能,蜂鸣器发声的操作控制如下:
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缓冲区就不会被初始化。
相关文章推荐
- 30天自制操作系统之第17天 命令行窗口
- 30天自制操作系统之第11天 制作窗口
- 30天自制操作系统------命令行
- 30天自制操作系统------窗口操作
- 《30天自制操作系统》笔记(09)——绘制窗口
- 30天自制操作系统第九天
- 30天自制操作系统day23
- 30天自制操作系统day1
- 《30天自制操作系统》笔记三
- 「30天自制操作系统」 Stop & 「OS67 」 Start
- 读书笔记《30天自制操作系统》day12~day13
- 30天自制操作系统-第1天
- 《30天自制操作系统》读书笔记Day8
- 《30天自制操作系统》读书笔记Day10
- 30天自制操作系统------文件读取
- 《30天自制操作系统》09_day_学习笔记
- 30天自制操作系统-第3天-harib00b-注释
- 30天自制操作系统
- 《30天自制操作系统》前言、目录、样章欢迎阅读!
- 《30天自制操作系统》——从汇编到C