30天自制操作系统之第15天 多任务(1)
来源:互联网 发布:刺客信条4优化 编辑:程序博客网 时间:2024/05/21 01:29
多任务的本质是利用定时器和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)JMPFAR [ESP+4] ; eip, csRET
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 performancesprintf(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切换一次任务的简单多任务功能。
4 0
- 30天自制操作系统之第15天 多任务(1)
- 30天自制操作系统之第一天
- 30天自制操作系统之第1天
- 30天自制操作系统之第1周(一)【袖珍操作系统怎么转】
- 《30天自制操作系统》第1天
- 30天自制操作系统(第一天)
- 30天自制操作系统之第12天 定时器(1)
- 《30天自制操作系统》之——第03天
- 《30天自制操作系统》之——第04天
- 《30天自制操作系统》之——第05天
- 30天自制操作系统之第11天 制作窗口
- 30天自制操作系统之第17天 命令行窗口
- 30天自制操作系统之第0天备忘梳理
- 《30天自制操作系统》第0天
- 《30天自制操作系统》第2天
- 《30天自制操作系统》第3天
- 《30天自制操作系统》第4天
- 《30天自制操作系统》第5天
- 成员函数重载运算符和友元函数重载运算符的比较
- javaScript arguments 对象
- C++中string相关函数
- Java代码加密与反编译(一):利用混淆器工具proGuard对jar包加密
- Android 模拟器大小设置
- 30天自制操作系统之第15天 多任务(1)
- IT职业生涯:开源即是开放的简历
- retain的setter中第一次,release如何操作
- 错误““NameSpace.Test_Index.Dispose(bool)”: 没有找到适合的方法来重写
- Android快捷键
- Linux下.pro文件的写法简介
- HDU--3308 How Many Answers Are Wrong
- 输入一个字符串 保留大写字母和空格输出 例如输入He Is Dog 输出为H I D
- hdu Max Sum Plus Plus(动态规划+分段最大子段和)