ザビタン開発日記
2009 | 01
2008 | 01 | 02 | 06 | 12
2007 | 10 | 11 | 12
10月 18 (木曜日) 2007
23:00
時計完成
 
時計でけたーーーー!
━━━━━━(゜∀゜)━━━━━━

まだ処理や修正がショボ〜い時計だけど、とにもかくにも時計、
そしてそれを管轄するタスクが完成した!!!

さ〜て・・・どうしよう?

ふとおもったんだけど、この時計タスク&ウィンドゥそのものを、
タスクバーとして配置しちゃだめかな???

リビジョン14
 
30日を過ぎたBlogにはコメントできません。
17:47
バグ?
 
あっれえぇぇぇぇ???

正常に動作してるのに、ずーっと動かしてるとqemuが落ちるなぁ?
なんでーー?

(こういうのは大抵、メモリなんだよなぁ)

・・・メモリ関係をいいかげんに写したツケかな・・・・

ちょっとチェック(というか、復習)してみよう。

           :
//メモリの定義??
struct MEMMAN *testmemman = (struct MEMMAN *) MEMMAN_ADDR;
           :
//このシートに書きこめるよう、バッファを確保する。
//大きいのでmemman_allocを使う(画素分)
unsigned char *testbuf=(unsigned char *) memman_alloc_4k(testmemman,400*200);
           :
//このタスクで使うfifoバッファを確保する
int *testfifo = (int *) memman_alloc_4k(testmemman,128*8);
//タスクのレジスタを初期化
testtask->cons_stack = memman_alloc_4k(testmemman,64*1024);
testtask->tss.esp = testtask->cons_stack + 64 * 1024 - 12;
//タスクの実行関数のアドレスを当て込む
testtask->tss.eip = (int) &test_task;
           :
//タスクが持つfiroに当て込みを行う
fifo32_init(&testtask->fifo, 128, testfifo, testtask);

あやしいのはたぶんこの辺・・・

えっと・・・まずはここ。

//メモリの定義??
struct MEMMAN *testmemman = (struct MEMMAN *) MEMMAN_ADDR;

これはいらないでしょう!
メモリマネージャはひとつで十分のはず。わざわざ別のを作る必要はないはず。

これもあやしいなぁ。

//このタスクで使うfifoバッファを確保する
int *testfifo = (int *) memman_alloc_4k(testmemman,128*8);

fifoの各データはint型のはず。int fifobuf[128] と同じだけのメモリが欲しければ128*4じゃないか? (intは4バイトだから)

おぉ!!!!!
この状態で約2時間動かしたけど落ちないぞ!??(^^

とりあえず暫定的にこれで大丈夫つーーーことで!!

リビジョン13






 
30日を過ぎたBlogにはコメントできません。

Referer  (1)
16:21
キーデータ等を受け取れるように2
 
わかったーーーーー━━━━━━(゜∀゜)━━━━━━ !!!!!

やっぱりそうかP501。完全に見落としてたよ!

//テストウィンドゥ
//メモリの定義??
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バッファを確保する
//ここで確保しておかないとダメ。タスク内部では
//セグメントがずれちゃうから(char buf[128]と同じ意味)
int *testfifo = (int *) memman_alloc_4k(testmemman,128*8);
//タスクのレジスタを初期化
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;
//最後に、sheetからでもタスクが解るようにsheet構造体にこのタスクを当て込む
testsht->task = testtask;
//タスクを走らせる
task_run(testtask, 2, 2); /* level=2, priority=2 */
//タスクが持つfiroに当て込みを行う
fifo32_init(&testtask->fifo, 128, testfifo, testtask);
//===========================================================


結局はこういうことだった。
メインであるtask_aはキーボードデータを受け取る。しかしその
データは複数のウィンドゥ(タスク)のどれに転送したらいいのか
わからない。そこで、key_winという変数によって、今一番上の
状態(アクティブ?)に
なっているsheetを記憶しておく。
そのシートを管轄しているタスクのfifoに転送しようとするわけ。
sheet構造体内部に、「俺はxxタスクさんの子分だよ!」という
値がある。ここに親分の名前(タスク)を当てておかないと
いけない。
これが当たっていれば親分がわかる。その親分の別の子分(そのタスクのfifo)にデータが送られる。

これが抜けてたんだね!!!
よーーし!
いよいよ時計にチャレンジ!

リビジョン12
 
30日を過ぎたBlogにはコメントできません。

Referer  (2)
14:19
キーデータ等を受け取れるように
 
えーーーっと! これかなぁ?P501。
 
30日を過ぎたBlogにはコメントできません。
13:30
タスク再設置でけた
 
実験用のタスクを設置することができたぞ!!
とりあえずこんなの。

:
:
//テストウィンドゥ
//=============================
//メモリの定義??
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

 
30日を過ぎたBlogにはコメントできません。

Referer  (1)
(1) 

PopnupBlog V3 Denali created by Bluemoon inc.