30天自制操作系统 下载本文

7 多任务进阶(harib12g) …… 303

真正的多任务也成功了!

真正的多任务不会发生这样的问题,因此这种方式更好……话虽如此,但其实即便是 harib12g,在任务B发生bug的情况下,也有可能出现键盘输入失去响应的问题。例如,明明写了 io_cli();却忘记写io_sti();的话,中断就会一直处于禁止状态,即使产生了计时器中断请求,也不 会被传递给中断处理程序。这样一来,mt_taskswitch当然也就不会被调用,这意味着任务切换也 就不会被执行。

其实CPU已经为大家准备了解决这个问题的方法,因此我们稍后再考虑这个问题吧。 好,我们在真机环境下运行一下,看看速度会不会变慢。咦?速度非但没有变慢,反而变快 了?运行结果是6493300,和之前的14281323相比,性能的差距是2.2倍。harib12f的时候还是差3 倍来着,这次也太快了吧。我们再把timer_settime(timer_put,1);删掉,看看如果不显示计数只显示 速度会怎样?说不定速度会变得更快呢?哇!结果出来了,6890930,居然达到了2.07倍,离理 想值2.0倍又近了一步呢。

现在想想看,为什么速度反而会变快呢?我想这是因为在任务切换的时候,我们不再使用 FIFO缓冲区的缘故。之前我们向FIFO中写入超时的编号,然后从中读取这个编号来判断是否执 行任务切换,相比之下,现在的做法貌似对于CPU来说负担更小些,一定是这个原因吧。

哎呀,不知不觉就已经很晚了。今天就先到这里吧,我们明天继续。

1 2 3 4

5 6 7

8 9 10

11 12 13 14 14 15

第 16 天

多任务(2)

??任务管理自动化(harib13a) ??让任务休眠(harib13b) ??增加窗口数量(harib13c) ??设定任务优先级(1)(harib13d) ??设定任务优先级(2)(harib13e)

11

任务管理自动化(harib13a)

大家好!昨天我们已经实践了很多关于多任务的内容,不过今天我们还得继续讲多任务。可 能有人会说,―老是讲多任务都听腻了啊!,但多任务真的非常重要(当然,如果你不想做一个‖ 多任务的操作系统,那就不重要啦)。从笔者的角度来说,希望大家能够在充分做好多任务机制 的基础上,再利用多任务逐步完善操作系统本身。因此,大家再稍微忍耐一下吧。

在15.7节中,我们已经实现了真正的多任务,不过这样还不够完善,或者说不太好用。如果 我们想要运行三个任务的话,就必须改写mt_taskswitch的代码。笔者认为,这样的设计实在太逊 了,如果能像当初定时器和窗口背景的做法一样(具体如下),是不是觉得更好呢?

task = task_alloc(); task->tss.eip = ○×; task->tss.esp = △◇;

像上面这样设定各种寄存器的初始值 task_run(task);

我们就先以此为目标,对代码进行改造吧。

■■■■■

于是我们写了下面这样一段程序,struct TASKCTL是仿照struct SHTCTL写出来的,首先我们 来看结构定义。