|
1: 2007-01-30 (火) 08:58:04 |
| + | すこしタスクについて復習したので、実装実験。 |
| | | |
| + | -まず、タスクを準備する。bootpac.cの先頭で |
| + | struct TASK *task_a, *task,*task_fdctl; |
| + | -こんなことして、タスク task_fdctl を登録。 |
| + | -次に、このタスクを実際に動かすため、各種設定&初期化。(task_aの初期化の後くらいに入れた) |
| + | : |
| + | task_a->langmode = 0; |
| + | |
| + | /*fdタスク実験部*/ |
| + | task_fdctl = task_alloc(); |
| + | task_fdctl->tss.esp = memman_alloc_4k(memman,64*1024)+64*1024; |
| + | task_fdctl->tss.eip = ( int ) &task_fdctl_main; |
| + | task_fdctl->tss.es = 1*8; |
| + | task_fdctl->tss.cs = 2*8; |
| + | task_fdctl->tss.ss = 1*8; |
| + | task_fdctl->tss.ds = 1*8; |
| + | task_fdctl->tss.fs = 1*8; |
| + | task_fdctl->tss.gs = 1*8; |
| + | task_run(task_fdctl,2,2); |
| + | /*=============================*/ |
| + | |
| + | /* sht_back */ |
| + | sht_back = sheet_alloc(shtctl); |
| + | : |
| + | |
| + | -次に、task_fdctl_main関数の内容を実装。(これはfd.cというファイルに割った) |
| + | |
| + | void task_fdctl_main(){ |
| + | |
| + | struct TIMER *timer; |
| + | struct TASK *task = task_now(); |
| + | int i=0,fifost,fifobuf[128]; |
| + | char s[60]; |
| + | |
| + | fifo32_init(&task->fifo,128,fifobuf,task); |
| + | timer = timer_alloc(); |
| + | timer_init(timer,&task->fifo,1); |
| + | timer_settime(timer,100); |
| + | |
| + | struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; |
| + | |
| + | for(;;){ |
| + | |
| + | |
| + | io_cli(); |
| + | if (fifo32_status(&task->fifo) == 0){ |
| + | task_sleep(task); |
| + | io_sti(); |
| + | |
| + | sprintf(s, "ST %d",fifo32_status(&task->fifo)); |
| + | boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16*3, 63, 31); |
| + | putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16*3, COL8_FF00FF, s); |
| + | |
| + | |
| + | } |
| + | else { |
| + | fifost = fifo32_get(&task->fifo); |
| + | |
| + | io_sti(); |
| + | if (fifost = 1){ |
| + | sprintf(s, "Timer %d",fifost); |
| + | boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16*13, 63, 31); |
| + | putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16*13, COL8_FF00FF, s); |
| + | timer_settime(timer,100); |
| + | } |
| + | |
| + | if (fifost >= 2){ |
| + | sprintf(s, "Other! %d",fifost); |
| + | boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16*16, 63, 31); |
| + | putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16*16, COL8_FF00FF, s); |
| + | |
| + | |
| + | } |
| + | |
| + | |
| + | |
| + | |
| + | } |
| + | } |
| + | } |