Compare commits

...

2 Commits

Author SHA1 Message Date
Yourtion
8534999b7b 做个简单的多任务(1) 2016-04-22 14:57:05 +08:00
Yourtion
de40053c3d 任务切换进阶 2016-04-22 14:49:44 +08:00
3 changed files with 34 additions and 9 deletions

View File

@@ -22,7 +22,7 @@ void HariMain(void)
struct FIFO32 fifo;
char s[40];
int fifobuf[128];
struct TIMER *timer, *timer2, *timer3;
struct TIMER *timer, *timer2, *timer3, *timer_ts;
int mx, my, i, cursor_x, cursor_c, task_b_esp;
unsigned int memtotal;
struct MOUSE_DEC mdec;
@@ -60,6 +60,9 @@ void HariMain(void)
timer3 = timer_alloc();
timer_init(timer3, &fifo, 1);
timer_settime(timer3, 50);
timer_ts = timer_alloc();
timer_init(timer_ts, &fifo, 2);
timer_settime(timer_ts, 2);
memtotal = memtest(0x00400000, 0xbfffffff);
memman_init(memman);
@@ -128,7 +131,10 @@ void HariMain(void)
} else {
i = fifo32_get(&fifo);
io_sti();
if (256 <= i && i <= 511) { /* 键盘数据*/
if (i == 2) {
farjmp(0, 4 * 8);
timer_settime(timer_ts, 2);
} else if (256 <= i && i <= 511) { /* 键盘数据*/
sprintf(s, "%02X", i - 256);
putfonts8_asc_sht(sht_back, 0, 16, COL8_FFFFFF, COL8_008484, s, 2);
if (i < 0x54 + 256) {
@@ -185,7 +191,6 @@ void HariMain(void)
}
} else if (i == 10) { /* 10秒定时器 */
putfonts8_asc_sht(sht_back, 0, 64, COL8_FFFFFF, COL8_008484, "10[sec]", 7);
taskswitch4();
} else if (i == 3) { /* 3秒定时器 */
putfonts8_asc_sht(sht_back, 0, 80, COL8_FFFFFF, COL8_008484, "3[sec]", 6);
} else if (i <= 1) { /* 光标用定时器*/
@@ -278,5 +283,25 @@ void make_textbox8(struct SHEET *sht, int x0, int y0, int sx, int sy, int c)
void task_b_main(void)
{
for (;;) { io_hlt(); }
struct FIFO32 fifo;
struct TIMER *timer_ts;
int i, fifobuf[128];
fifo32_init(&fifo, 128, fifobuf);
timer_ts = timer_alloc();
timer_init(timer_ts, &fifo, 1);
timer_settime(timer_ts, 2);
for (;;) {
io_cli();
if (fifo32_status(&fifo) == 0) {
io_stihlt();
} else {
i = fifo32_get(&fifo);
io_sti();
if (i == 1) { /*任务切换*/
farjmp(0, 3 * 8);
timer_settime(timer_ts, 2);
}
}
}
}

View File

@@ -28,7 +28,7 @@ void asm_inthandler21(void);
void asm_inthandler27(void);
void asm_inthandler2c(void);
unsigned int memtest_sub(unsigned int start, unsigned int end);
void taskswitch4(void);
void farjmp(int eip, int cs);
/* fifo.c */
struct FIFO32 {

View File

@@ -16,7 +16,7 @@
GLOBAL _asm_inthandler20, _asm_inthandler21
GLOBAL _asm_inthandler27, _asm_inthandler2c
GLOBAL _memtest_sub
GLOBAL _taskswitch4
GLOBAL _farjmp
EXTERN _inthandler20, _inthandler21
EXTERN _inthandler27, _inthandler2c
@@ -207,6 +207,6 @@ mts_fin:
POP EDI
RET
_taskswitch4: ; void taskswitch4(void);
JMP 4*8:0
RET
_farjmp: ; void farjmp(int eip, int cs);
JMP FAR [ESP+4] ; eip, cs
RET