私は自分のもののインスピレーションとしてそれを使用して、いくつかのコード(実際にはArduPilot)を調べています。今、私は重大なバグを見つけたと思います - しかし大声で叫ぶ前に ;) 誰かが私が C++ を誤解していないかどうかをチェックするのを手伝ってくれるかもしれません.
方法があります(私はそれを単純化しました):
void GCS_MAVLINK::update(void) {
// receive new packets
mavlink_message_t msg;
mavlink_status_t status;
// process received bytes
while (data_available()) {
uint8_t c = receive_data();
// Try to get a new message
if (parse_and_accumulate(c, &msg, &status)) {
handleMessage(&msg);
}
}
}
これは定期的に呼び出されます。使い果たされるまでバッファからデータを読み取り、最終メッセージへの参照とステータス構造体とともに外部解析関数にスローして、副作用によって更新します。パーサーがメッセージの完了を確認するたびに、メッセージが消費されます。
ここまでは順調ですね。メッセージの途中でバッファが空になるとどうなりますか? OK、残りはおそらく次のスケジュールされた呼び出しでバッファに到着します。しかし、割り当てられたローカル/スタックはどうなりますか!!! メッセージとステータス変数? 私の知る限り、その間にスタックの使用によるあらゆる種類のごみで上書きされた可能性があります。スタック ポインタがシフトした可能性さえあります。
私が馬鹿にする前に、ここに大きな問題があるように見えることを誰かが確認するのを手伝ってくれませんか..
また、msg 変数と status 変数を静的にして「修正」しても、それらはメソッドを含むクラスのインスタンスごとに別々になりますよね?
よろしくソレン