首页 > 代码库 > 30天自制操作系统之第15天 多任务(1)
30天自制操作系统之第15天 多任务(1)
多任务的本质是利用定时器和far跳转在任务之间进行切换,具体来说,一开始先运行main函数(就是处理我们的鼠标、键盘和定时器等事件),0.02s后定时器超时,执行如下语句:
far-JMP指令指向的目标地址段是4*8,这是任务B的TSS所在,因此实际上是发生了任务切换,下面是任务B的TSS设定:
之后任务B得到执行,下面是任务B的函数:
在任务B中我们同样设定了超时时间为0.02s的定时器,也就是说在任务B执行0.02s后,又任务切换到了A,即上面的main函数中。切换到任务A,紧接着继续设定0.02s的定时器,这样反复进行下去,就出现了每0.02s切换一次任务的简单多任务功能。
farjmp(0, 4 * 8);
这是一个far跳转,先看一下farjmp的实现:
_farjmp: ; void farjmp(int eip, int cs) JMP FAR [ESP+4] ; eip, cs RET
far-JMP指令指向的目标地址段是4*8,这是任务B的TSS所在,因此实际上是发生了任务切换,下面是任务B的TSS设定:
set_segmdesc(gdt + 4, 103, (int) &tss_b, AR_TSS32);
之后任务B得到执行,下面是任务B的函数:
void task_b_main(struct SHEET *sht_back) { //for (;;) { io_hlt(); } struct FIFO32 fifo; struct TIMER *timer_ts, *timer_put; int i, fifobuf[128], count = 0; char s[11]; fifo32_init(&fifo, 128, fifobuf); timer_ts = timer_alloc(); timer_init(timer_ts, &fifo, 2); timer_settime(timer_ts, 2); timer_put = timer_alloc(); timer_init(timer_put, &fifo, 1); timer_settime(timer_put, 1); for (;;) { count++; io_cli(); if (fifo32_status(&fifo) == 0) { //io_stihlt(); io_sti(); } else { i = fifo32_get(&fifo); io_sti(); if (i == 1) { // each 0.01s refreshing the screen, not each count++, enhancing the performance sprintf(s, "%11d", count); putfonts8_asc_sht(sht_back, 0, 144, COL8_FFFFFF, COL8_0000FF, s, 11); timer_settime(timer_put, 1); } else if (i == 2) { farjmp(0, 3 * 8); timer_settime(timer_ts, 2); } } } }
在任务B中我们同样设定了超时时间为0.02s的定时器,也就是说在任务B执行0.02s后,又任务切换到了A,即上面的main函数中。切换到任务A,紧接着继续设定0.02s的定时器,这样反复进行下去,就出现了每0.02s切换一次任务的简单多任务功能。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。