3: 2007-01-26 (金) 10:44:29 |
4: 2007-01-28 (日) 18:58:17 |
| そして、このtask_fdは常に動いている。他のタスクが指令を出せばいつでも単独でFDを読み込み、その結果を番地で返す。ただし用が終わるとほぼスリープ状態でじっと待っている。そんなタスクにしないといけない。 | | そして、このtask_fdは常に動いている。他のタスクが指令を出せばいつでも単独でFDを読み込み、その結果を番地で返す。ただし用が終わるとほぼスリープ状態でじっと待っている。そんなタスクにしないといけない。 |
| | | |
| + | -そういうわけで、こんなところにこんあタスク定義を置いてみた。 |
| + | : |
| + | *((int *) 0x0fe4) = (int) shtctl; |
| + | 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); |
| + | /*=============================*/ |
| | | |
- | #COLOR(red){うっわぁ! だめだこれ! タスクの習得が甘いようだな。よくわからんぞ!。(ちょっと15日目から復習しなおし!)} | + | /* sht_back */ |
| + | sht_back = sheet_alloc(shtctl); |
| + | : |
| | | |
| + | -あとは、この新設タスクがちゃんと動いてくれるかどうかをチェックするため、とりあえずtask_fd_main()をfd.c内に仮設置してみる。 |
| | | |
| + | void task_fdctl_main(){ |
| | | |
| + | struct FIFO32 fifo_fd; |
| + | struct TIMER *timer_1s; |
| + | int i = 0; |
| + | int fifost, fifobuf[128]; |
| | | |
| + | fifo32_init(&fifo_fd, 128, fifobuf, 0); |
| + | timer_1s = timer_alloc(); |
| + | timer_init(timer_1s, &fifo_fd, 100); |
| + | timer_settime(timer_1s, 100); |
| | | |
| + | struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; |
| + | unsigned char s[8]; |
| + | |
| + | for(;;){ |
| + | |
| + | io_cli(); |
| + | fifost = fifo32_get(&fifo_fd); |
| + | if ( fifost = 100){ |
| + | i = i++;; |
| + | |
| + | sprintf(s, "%02X",i); |
| + | boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 31, 31); |
| + | putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FF00FF, s); |
| + | timer_settime(timer_1s, 100); |
| + | } |
| + | |
| + | io_sti(); |
| + | } |
| + | } |
| + | |
| + | -うむ。細かいところはアレだが、たぶんこれでタスクとしてはうまく動いているだろう。とりあえず雛形は完成としよう。 |
| | | |
| | | |
| | | |
| 場所はとりあえず、メモリマップから 0x00008400〜0x0000E3FFまでを確保することにしよう。 | | 場所はとりあえず、メモリマップから 0x00008400〜0x0000E3FFまでを確保することにしよう。 |
| + | |
| + | *FDタスクとの通信 [#ie1755dd] |
| + | -当たり前だが、このFDコントロールタスクは指令を出さなければずっと眠っていなくてはいけないもの。 |
| + | --どこか他のタスクが指令を出す。 |
| + | --受け取った指令により、FDタスクが「独自に・独立して」処理を行う。 |
| + | --終了後、結果を元のタスクに返す |
| + | -こういう動作が必要になるな。 |
| + | -はりぼてWikiのページだと、 |
| + | # データリード: [1] [セクタ番号] [セクタ数] [番地] [FIFO32*] [データ] |
| + | # データライト: [2] [セクタ番号] [セクタ数] [番地] [FIFO32*] [データ] |
| + | -とある。なるほど。先頭の値をコマンド化して、後続のデータをパラメータ化したりするのか!? |
| + | -たとえば、こういうことをしたほうが確実かなぁ?? |
| + | # データリード: [1] [セクタ番号] [セクタ数] [番地] [FIFO32*] [データ][コマンド終了コード] |
| + | # データライト: [2] [セクタ番号] [セクタ数] [番地] [FIFO32*] [データ][コマンド終了コード] |
| + | |
| + | -それともう一つ。データの運搬というか受け渡し。 |
| + | --taskAから、セクタを読めと指令。 |
| + | --FDタスク。指令を受信。 |
| + | --FDタスク、指令が実行可能なら実行。セクタを読む。 |
| + | --FDタスク、指令を終了してtaskAに通知。かつ、読み取ったデータをtaskAに運搬 |
| + | |
| + | -・・・まあいいや。とりあえず、一番根幹たる、「指定セクタを読む」だけを、まず実装してみよう。 |
| + | |
| + | **セクタ単体読み出し関数(API予備軍?)の実装。 [#ic8c3a32] |
| + | --必要なパラメータは、「論理セクタ番号」「読んだデータの格納場所」と、「終了ステータス」だね。 |
| + | --じゃ、こんなのを妄想してみる。 |
| + | |
| + | int fd_read_sector(int r_sec,int *data) |
| + | { |
| + | int cc,hh,ss; /*物理セクタ格納用*/ |
| + | |
| + | if( r_sec > 2879 ){ |
| + | return -1; |
| + | } |
| + | |
| + | ss = r_sec % 18 +1; /* 論理セクタを物理セクタに変換*/ |
| + | hh = (r_sec / 18) % 2; |
| + | cc = (r_sec / 18) /2 / 80; |
| + | |
| + | /*データリード: [1] [セクタ番号] [セクタ数] [番地] [FIFO32*] [データ]*/ |
| + | io_cli(); |
| + | fifo32_put(fd_ctl_task->fifo,1); |
| + | fifo32_put(fd_ctl_task->fifo,ss); |
| + | fifo32_put(fd_ctl_task->fifo,hh); |
| + | fifo32_put(fd_ctl_task->fifo,cc); |
| + | fifo32_put(fd_ctl_task->fifo,data); |
| + | io_sti(); |
| + | |
| + | return; |
| + | } |