この記事について
Arduino IDE の開発 で FIFO / FILO の処理をしてみます。
キューとスタック
一時的にデータを溜め込んでおいて、あとで1個づつ処理したいこと、よくありますよね?
C++ の標準的な手法で解決してみます。
今回は Arduino IDE での開発を想定してみます。
なお、いわゆる普通の Arduino (Unoやそのクローンなど)ではコンパイルが通らないようです。
ESP-WROOM-02 / 32 であれば問題なく動作するようなので、そちらで動かしてみます。
FIFO処理 (queue:キュー)
FIFO とは First In, First Out の略、つまり 先入れ先出し です。
データを入れ物に溜め込んでおいて、先に入れたものから順に取り出していくようなイメージです。
使い方
説明は省略。ソースを見れば誰でも分かると思う。
詳細は このへん を確認しましょう。
queue.ino
#include <queue>
std::queue<int> q;
void setup() {
Serial.begin(115200);
Serial.println("");
// キューに値を貯め込む
q.push(1);
q.push(2);
q.push(3);
// キューのサイズを確認
int size = q.size();
// 3 が表示される
Serial.printf("size=%d\n", size);
// キューから値を取得する
int value = q.front();
// 1 が表示される
Serial.printf("value=%d\n", value);
// キューの値を捨てる(FIFOなので先頭の値が捨てられる)
q.pop();
// キューから値を取得する
value = q.front();
// 2 が表示される
Serial.printf("value=%d\n", value);
}
void loop() {
}
FILO処理 (stack:スタック)
FILO とは First In, Last Out の略、つまり 先入れ後出し です。
データを入れ物に溜め込んでおいて、後に入れたものから順に取り出していくようなイメージです。
使い方
上記と同様に説明は省略。
詳細は このへん を確認しましょう。
stack.ino
#include <stack>
std::stack<int> s;
void setup() {
Serial.begin(115200);
Serial.println("");
// スタックに値を貯め込む
s.push(1);
s.push(2);
s.push(3);
// スタックのサイズを確認
int size = s.size();
// 3 が表示される
Serial.printf("size=%d\n", size);
// スタックから値を取得する(FILOなので最後の値が取得される)
int value = s.top();
// 3 が表示される
Serial.printf("value=%d\n", value);
// スタックの値を捨てる(FILOなので最後の値が捨てられる)
s.pop();
// スタックから値を取得する
value = s.top();
// 2 が表示される
Serial.printf("value=%d\n", value);
}
void loop() {
}
まとめ
C++って便利ですねw
Arduino IDEで開発をしていると、Cでの開発に頭が行ってしまい、C++の標準的な仕組みを忘れがちなので、面倒な処理をやる必要が出てきたらC++を少し調べてみましょう。