ザビタン開発日記
2009 | 01
2008 | 01 | 02 | 06 | 12
2007 | 10 | 11 | 12
10月 23 (火曜日) 2007
17:32
FDアクセス:親タスクで複数のFIFO
 
おぉ! 



なんかいけたっぽいゾ!!!!



だったらアレをこうしてここをこうやって・・・・
 
name: @Guest  Comment:
13:02
FDアクセス:親タスクで複数のFIFO
 
ちょっとこの関数内でのFIFOが行き詰ってる。



一種ブランチして、親タスクにタイマーと別のFIFOを用意して実験してみることにしよう・・・
 
name: @Guest  Comment:
12:15
FDアクセス:番外
 
うっちゃんへ。



スマンスマン。ちょっとソースをいい加減なとこから持ってきて貼り付けちゃった。

タイマーの設定の部分はいい加減というかいろいろな実験の名残り。

今はこんな感じです。



int send_sec_read(int C, int H, int S)

{

struct TIMER *timer1 = timer_alloc();

int fifobuf[128];

struct FIFO32 fifo;

fifo32_init(&fifo,128,fifobuf,0);



fifo32_put(&fifo,10);

return;



これで、この部分をコールしているFDタスクが固まっちゃうんですよねぇ。

そんなわけで、今はFIFOそのものを復習&検証中・・・(´・ω・`)



ちなみに、タイマーそのものはちゃんと動いているよう。

逆に言えば、タイマーを設置(たとえば3秒とか)すると、

確実に3秒後に固まるです。(つまり、設置したタイマーはちゃんと

設定通り、このFIFOにputをしているようなのです。
 
●uchan@Guest -- 10/23 14:43
変数 fifo と fifobuf は自動変数(スタックに確保される)だからreturnしたら使えなくなります。
●hideyosi -- 10/23 17:31
(゜∀゜)  ナンカソレガゲンインクサイカモ・・・
●hideyosi -- 10/25 09:34
うっちゃんのヒント(え?サルでも知ってるって?/(^o^)\)をよく考えてみた。結果、リターンがいつ起こっても問題ないように、親元にタイマとFIFOを設置して、それを変数として渡すように改造しますた! これなら、この子関数がretして消えちゃっても、親側でちゃんと存在し続けるからと考えて。これがどうやらアタリのようです。感謝!!

name: @Guest  Comment:
10月 22 (月曜日) 2007
22:52
FDアクセス:FIFOがうまくいかん
 
FDCにコマンドを送る場合、「待ち」がある。

で、万が一、その「待ち」があまりにも長いなんて場合はエラー

としてブレイクしようと考えた。そんなわけでこんなコードを書いたんだけど、



int send_sec_read(int C, int H, int S)

{

struct TIMER *timer1 = timer_alloc();

int fifobuf[4];

struct FIFO32 fifo;

fifo32_init(&fifo,4,fifobuf,0);

timer_init(timer1,&fifobuf,10);



//コマンド送信前の確認および待ち

timer_settime(timer1,300);

while(io_in8(0x03f4) & 0x11 != 0x00 )

{

if (fifo32_status(&fifo) !=0)

{

if (fifo32_get(&fifo) == 10)

{

return 5;

}

}

}



どうもFIFOがうまくいってないらしい・・・

散々悩まされた(タイマーの不具合かと思い)んだけど、もっと

根本で、このFIFOにデータをput(fifo32_putで)しただけで

固まってしまうことがわかった。(やっとこさ・・・)

うううううううん! なんだろう?
 
●uchan@Guest -- 10/23 06:24
あれ?timer_init(timer1,&fifobuf,10);って?

name: @Guest  Comment:
19:54
FDアクセス:時間待ち
 
うーーーん・・・困った・・・



コマンドの発行などで「待ち」が必要なんだよなぁ。

(待ちとは言うけど、逆に言えばあるコマンドが何秒以上返事がない場合はエラーにするとかも必要になる)



今はりぼてに搭載されているタイマーって、FIFOにタイムアウトを

発行する仕組みだから、コード内(たとえばこんなの)



//コマンド送信前の確認および待ち

while(io_in8(0x03f4) & 0x11 != 0x00 ){}



で、もし永遠にこれが帰ってこないようならブレイクしないと

いけないよね?



こういう場合、どうしたらいいんだろう。

まさかforでカウントするなんて乱暴なことできないしなぁ・・・



システムの現在時刻を取得して・・・・

うーーーん。これしかないのかなぁ。なんかもっとスマートで

いい方法があるような・・・





・・・って! まったまった!!! 勘違いかも???

FIFOって別にタスク専用じゃねーじゃん!!

・・・ってことは・・・・
 
name: @Guest  Comment:
19:40
FDアクセス:エラー処理
 
ベタ〜っとFDD読み込みのコードを書いて実験。

ほぼ、とにもかくにも、OKという感じになってきたので

これを関数にまとめ・分類し始めた。



・・・うーん。でもこれ、複雑だなぁ・・・



もしミスがあった場合、これじゃどこに問題があるのかわからなくなっちゃいそう。



そこで、エラーコードを返すようにすることにした。



で、



そのエラーコードだけど、最初にちゃんと決めておかないとまずそうだね・・・

 
name: @Guest  Comment:
12:14
FDアクセス:論理to物理
 
えーーっと・・・



論理セクターを物理セクターに変換するのってどうするんだっけ・・・



たしか、ケツから割り算してあまりで出していくはず・・・



あーー! 思い出したぁ!!!!

たしかこれ、前にKタンに教えてもらったんだ!



答えはn進数変換だ!(割り算二回でOKだーーー!)(^^



・・・あ”・・・

C言語の場合は2回ってわけにはいかないのか・・・ orz
 
name: @Guest  Comment:
10:43
FDアクセス:BPE解析
 
0x7C00に読み込んだのは正解のようですぞ!?



順調にBPEの取得&解析完成〜。



いよいよ、これら情報を元にアクセス。ファイル読み取りまでいけるか!???



リビジョン27
 
name: @Guest  Comment:
00:13
FDアクセス:DMA候補場所
 
ここでメモリマップを試作中・・・



でね?



セクターを読む場所を、IPLが読み込まれる位置(0x00007C00)にしてみたらどうかってぇ〜思ったのよ。



ここなら確実に「もう使わない。もう使ってない」といえるうえに、

ちょうど512だしね。



ここに読むようにDMAに指定して、読み終わったらタスク内に設けた

変数に転送させると!



こんなんで どっすか? げっげぇ〜ろぉ〜♪
 
name: @Guest  Comment:
10月 21 (日曜日) 2007
09:19
FDアクセス:格納メモリ
 
FDDのセクタがとりあえず読めるようになって、FDDのコントロール

の方法のパターンはつかめたと思う。これを使って

よりちゃんとしたFDDコントロールをしていかないといけないね。



でもその前に。

FDから読み込んだデータはDMAの指定によってメモリに格納されるんだけど、

それ、どこにしたら適当かなぁ???



メモリマップをもう一回整理して、どこかに隙間を作って、他のタスクやらが使えないように設定しておかないとなぁ。

それともうひとつ。

FDコントロールは独立したタスクだけど、あくまでもFDコントロールのため。

最終的には他のタスク(たとえばコマンドから呼ばれるとか)から

呼べて、かつ、答えを返してもらえるようにしなきゃいけない。



どういうふうに設計したらいいかなぁ。

まだまだタスクの理解が甘いオイラには考えどころですなぁ・・・
 
name: @Guest  Comment:
1 2 (3) 4 5 6 7 » 

PopnupBlog V3 Denali created by Bluemoon inc.