雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。

すこしタスクについて復習したので、実装実験。

  • まず、タスクを準備する。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);


		    }
	    }
		  }
}
  • これで、とにもかくにも task_fdctlは走り出したようだ。

FIFOに送信?? anchor.png Edit

  • ここで問題になったのが、この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させたあと、このタスクのことを他のタスクに解るようにしてやればいいんだよね?。どうしよう・・・?
Page Top

検証実験 anchor.png Edit

  • この予想が合っているかどうかを検証しよう。
  • 現在動いている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の値を比較してみたが、やっぱり同じだ・・・。なんだろう?これ???

最終更新: 2024-01-06 (土) 22:39:09 (JST) (82d) by