実験用のタスクを設置することができたぞ!!
とりあえずこんなの。
:
:
//テストウィンドゥ
//=============================
//メモリの定義??
struct MEMMAN *testmemman = (struct MEMMAN *) MEMMAN_ADDR;
//まず下敷きをもらってくる
struct SHEET *testsht = sheet_alloc(shtctl);
//このシートに書きこめるよう、バッファを確保する。
//大きいのでmemman_allocを使う(画素分)
unsigned char *testbuf=(unsigned char *) memman_alloc_4k(testmemman,400*200);
//このバッファをtestwin下敷きで使用できるように当て込む
sheet_setbuf(testsht,testbuf,400,200,-1);
//バッファにウィンドゥを作成する
make_window8(testbuf,400,200,"testwin",0);
//新しいタスクを作るため、taskmanからタスクをもらってくる
struct TASK *testtask = task_alloc();
//このタスクで使うfifoバッファを確保する
int *testfifo = (int *) memman_alloc_4k(testmemman,128*4);
//タスクのレジスタを初期化
testtask->cons_stack = memman_alloc_4k(testmemman,64*1024);
testtask->tss.esp = testtask->cons_stack + 64 * 1024 - 12;
//タスクの実行関数のアドレスを当て込む
testtask->tss.eip = (int) &test_task;
testtask->tss.es = 1 * 8;
testtask->tss.cs = 2 * 8;
testtask->tss.ss = 1 * 8;
testtask->tss.ds = 1 * 8;
testtask->tss.fs = 1 * 8;
testtask->tss.gs = 1 * 8;
//これは実行関数に渡す引数(引数 *sheetを渡す)
*((int *) (testtask->tss.esp + 4)) = (int) testsht;
// *((int *) (testtask->tss.esp + 8)) = memtotal;
//タスクを走らせる
task_run(testtask, 2, 2); /* level=2, priority=2 */
//タスクが持つfiroに当て込みを行う
fifo32_init(&testtask->fifo, 128, testfifo, testtask);
:
:
void test_task(struct SHEET *sheet){
struct TASK *task = task_now();
struct TIMER *timer1 = timer_alloc();
int i;
char s[20];
int counter = 0;
timer_init(timer1,&task->fifo,10);
timer_settime(timer1,1000);
for(;;){
counter++;
if (counter > 100000){counter = 0;}
io_cli();
if (fifo32_status(&task->fifo) ==0){
io_sti();
}
else{
i = fifo32_get(&task->fifo);
io_sti();
}
sprintf(s,"counter=%06d",counter);
putfonts8_asc_sht(sheet,32,32,COL8_008484,COL8_FFFFFF,s,14);
}
}
や〜っとタスク設置のパターンを把握できた〜・・・
でもこれ、まだ問題があるんだよね。このtesttaskウィンドゥにキーボードデータがいくと(キーを押したりすると)
フリーズして画面が壊れちゃう・・・
これはたぶん、task_aのfifoが受け取ったキーデータの行き先とかの
処理をなんにもしてないせいだと思うんだけど、どこだったっけ・・・
リビジョン11