ここから本文です

現在、自作OS用にフロッピーディスクドライバーを作成しています。 自分では解決...

ktu********さん

2017/11/319:50:54

現在、自作OS用にフロッピーディスクドライバーを作成しています。
自分では解決できない問題が起きたので質問させていただきます。

まず、ソースコードの一部を以下に記します。

/*
* fdd.h
*/
#include <stdbool.h>

extern bool_fdd_irq_flag;


/*
* fdd.c
*/
#include "fdd.h"
#include "asm.h" // sti(), outb()

bool fdd_irq_flag = false;

static void fdd_wait_irq()
{
while (!fdd_irq_flag);

fdd_irq_flag = false;
}

void init_fdd()
{
sti();

// reset
outb(0x00, 0x03f2);
outb(0x0c, 0x03f2);

fdd_wait_irq();
// 以下省略
}


/*
* irq.c
*/
#include "fdd.h"

void do_fdd()
{
fdd_irq_flag = true;
}

上記のままだと、do_fdd()は呼び出されるにもかかわらずfdd_irq_wait()のwhileループで無限ループに陥ってしまいます。
しかし、whileループを以下のように書き換えるとなぜか無限ループには陥りません。

while (!fdd_irq_flag)
printf("loop");

キーボード割り込みとPIT割り込みが正しく動いているので割り込みはしっかり機能していると思います。

なぜこのようなことが起きるのでしょうか?
また、どのように修正すれば無限ループに陥らないようにできるでしょうか?(上記の方法以外で)

閲覧数:
29
回答数:
2
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tre********さん

2017/11/320:02:30

(再投稿です)

>bool fdd_irq_flag = false;★

>static void fdd_wait_irq()
>{
>while (!fdd_irq_flag);

>fdd_irq_flag = false;
>}

★の行を

volatile bool fdd_irq_flag = false;

としたらどうなりますか?

  • 質問者

    ktu********さん

    2017/11/320:08:21

    fdd.c:6:15: error: conflicting type qualifiers for ‘fdd_irq_flag’
    volatile bool fdd_irq_flag = false;

    fdd.h:9:13: note: previous declaration of ‘fdd_irq_flag’ was here
    extern bool fdd_irq_flag;

    というエラーが表示されました。

  • その他の返信(2件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2017/11/3 20:14:06

ソースファイルとヘッダファイル両方にvolatileが必要だったんですね。
また1つ勉強になりました。

ベストアンサー以外の回答

1〜1件/1件中

pis********さん

2017/11/320:03:43

volatile 付けてないからコンパイラが悪さしてるんじゃね?

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる