RXマイコン、C++、割り込み対応の文字出力

ネットスタック作りは、未だ実装中、もうしばらくかかる・・・
意外と奥が深い、色々考えると、タイミングや応答の順番、イレギュラーな場合
など、色々考慮する必要があり、実験しながらなので、中々決まらない。
それでも、少しづつは進んでいる。

その過程で、イーサーネットの割り込みタスク(EDMAC)内から、文字出力
を行う事が多くなってきたが、文字出力は、排他制御されていないので、メイン
ループの出力と衝突すると、厄介な事になる(文字出力がハングアップする)そ
こで、どうにかできないか考えてみた。

void sci_putch(char ch)
{
    static volatile bool lock = false;
    static utils::fifo<uint8_t, 1024> tmp;
    if(lock) {
        if((tmp.size() - tmp.length()) >= 2) {
            tmp.put(ch);
        }
        return;
    }
    lock = true;
    while(tmp.length() > 0) {
        sci_.putch(tmp.get());
    }
    sci_.putch(ch);
    lock = false;
}

とりあえず、ロック機構を使ってリソースを包んで、ロック状態の場合は、一旦
バッファ(FIFOテンプレートクラス)に貯める。
ロックが外れたら、バッファに残っていた文字を取り出し、表示する。
※この取り出すタイミングは、多少問題で、文字出力が無いと、バッファに残っ
た文字が永遠に出力されない。
バッファに残った文字は、メイン部分で、タイマーの同期ループなどで出力する
ようにすればOKと思う。

カテゴリー: ソフトウェアー・エンジニアリング, 電子工作な日々 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です