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