1: 2007-01-30 (火) 08:58:04 |
現: 2024-01-06 (土) 22:39:09 |
| : | | : |
| task_a->langmode = 0; | | task_a->langmode = 0; |
| + | |
| /*fdタスク実験部*/ | | /*fdタスク実験部*/ |
| task_fdctl = task_alloc(); | | task_fdctl = task_alloc(); |
| task_run(task_fdctl,2,2); | | task_run(task_fdctl,2,2); |
| /*=============================*/ | | /*=============================*/ |
| + | |
| /* sht_back */ | | /* sht_back */ |
| sht_back = sheet_alloc(shtctl); | | sht_back = sheet_alloc(shtctl); |
| | | |
| void task_fdctl_main(){ | | void task_fdctl_main(){ |
| + | |
| struct TIMER *timer; | | struct TIMER *timer; |
| struct TASK *task = task_now(); | | struct TASK *task = task_now(); |
| int i=0,fifost,fifobuf[128]; | | int i=0,fifost,fifobuf[128]; |
| char s[60]; | | char s[60]; |
| + | |
| fifo32_init(&task->fifo,128,fifobuf,task); | | fifo32_init(&task->fifo,128,fifobuf,task); |
| timer = timer_alloc(); | | timer = timer_alloc(); |
| timer_init(timer,&task->fifo,1); | | timer_init(timer,&task->fifo,1); |
| timer_settime(timer,100); | | timer_settime(timer,100); |
| + | |
| struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; | | struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; |
| + | |
| for(;;){ | | for(;;){ |
- | | + | |
| io_cli(); | | io_cli(); |
| if (fifo32_status(&task->fifo) == 0){ | | if (fifo32_status(&task->fifo) == 0){ |
| task_sleep(task); | | task_sleep(task); |
| io_sti(); | | io_sti(); |
| + | |
| sprintf(s, "ST %d",fifo32_status(&task->fifo)); | | sprintf(s, "ST %d",fifo32_status(&task->fifo)); |
| boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16*3, 63, 31); | | boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16*3, 63, 31); |
| putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16*3, COL8_FF00FF, s); | | putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16*3, COL8_FF00FF, s); |
- | | + | |
| + | |
| } | | } |
| else { | | else { |
| fifost = fifo32_get(&task->fifo); | | fifost = fifo32_get(&task->fifo); |
| + | |
| io_sti(); | | io_sti(); |
| if (fifost = 1){ | | if (fifost = 1){ |
| timer_settime(timer,100); | | timer_settime(timer,100); |
| } | | } |
| + | |
| if (fifost >= 2){ | | if (fifost >= 2){ |
| sprintf(s, "Other! %d",fifost); | | sprintf(s, "Other! %d",fifost); |
| boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16*16, 63, 31); | | boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16*16, 63, 31); |
| putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16*16, COL8_FF00FF, s); | | putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16*16, COL8_FF00FF, s); |
| + | |
| + | |
| + | } |
| + | } |
| + | } |
| + | } |
| | | |
| + | -これで、とにもかくにも task_fdctlは走り出したようだ。 |
| | | |
- | } | + | **FIFOに送信?? [#vefc80d8] |
| + | -ここで問題になったのが、このtask_fdctl内のFIFOへの送信。これがどうしてもうまくいかない。 |
| + | |
| + | -console.c内に、テスト用の内部コマンド、「fd2」を搭載し、以下のようなコードを置いた。 |
| + | : |
| + | struct TASK *task_fdctl; |
| + | : |
| + | /*FDの実験2*/ |
| + | void cmd_fd2(struct CONSOLE *cons){ |
| + | |
| + | int i; |
| + | for (i=0; i>100;i++){ |
| + | fifo32_put(&task_fdctl->fifo,22); |
| + | } |
| + | |
| + | return; |
| + | } |
| + | : |
| | | |
| + | -いちおうエラーもなく、うまく行っているようなのだが、どうしてもtask_fdctlが反応してくれない。 |
| | | |
| + | -うーむ。どうすればtask_fdctl->fifoにデータを送信できるのだろう? また、fd2コマンドはいったいどこへ送信を行い、送られたデータ22はどうなってしまっているのだろう??? |
| | | |
| + | -ちょっと整理してみる。現在、とりあえずtask_a、task、task_fdctl、そしてtask_consが走っている。 |
| + | -コマンドラインということは、fd2はtask_consの中にある命令。つまり、この内部では他のタスクの名前などわからない。 |
| + | -なので、structでまったく別のものとして初期化動作をしてしまっているのだろうか??? |
| | | |
- | } | + | -うーん。たぶんそれが原因っぽい。console.cの先頭に struct TASK *task_fdctl; を書いておけばHariMain内の変数が使えるのかと勘違いしていたけど、よく考えるとそんなことあるはずないよなぁ。 |
- | } | + | -task_fdctlをranさせたあと、このタスクのことを他のタスクに解るようにしてやればいいんだよね?。どうしよう・・・? |
- | } | + | |
| + | **検証実験 [#r8d671f0] |
| + | -この予想が合っているかどうかを検証しよう。 |
| + | -現在動いているtask_a・task_cons・task_fdctl。これらで、task_fdctlについては、task_aとtask_fdctl自身が知っている。(task_consは現在知らないはず) |
| + | -そこで、以前にあっきーさんから聞いた、「ファンクションキー」に命令を割り当ててみることにしよう。(これなら、task_a内でFIFO送信が完了するはず。) |
| + | -これでもしうまくいったなら、やはり予想通りの不具合ということになる。 |
| + | |
| + | |
| + | |
| + | |
| + | -う〜〜〜〜〜〜ん??? おっかしい。こんどは固まってしまうぞ??? |
| + | -まず最初、bootpac.cにこんなコードを追加してみた。 |
| + | |
| + | : |
| + | task_run(task, -1, 0); /* 終了処理を確実にやらせるために、寝ていたら起こす */ |
| + | } |
| + | } |
| + | /*fd実験*/ |
| + | if (i == 256 + 0x3e){ |
| + | fifo32_put(&task_fdctl->fifo,3); |
| + | } |
| + | |
| + | if (i == 256 + 0x3c && key_shift != 0) { /* Shift+F2 */ |
| + | : |
| + | |
| + | -これで、task_fdctl内のFIFOに3が送信されるはず。そうすればなんらかの反応があるはずなのだが、なんと固まってしまう・・・・ |
| + | |
| + | -内部を抜いたり等したが、どうしても固まってしまうなぁ。念のため、ここbootpac.c内の&task_fdctl-fifoの値とtask_fdctl内での&fifoの値を比較してみたが、やっぱり同じだ・・・。なんだろう?これ??? |