私は Arduino と APC220 ワイヤレス トランシーバーを持っています。SoftwareSerial クラスを使用して APC からデータを読み込むライブラリを作成しています。i
私はもともと、読み取り可能なデータがない場合でも変数がインクリメントされるため、セグ フォールトを引き起こしていた以下の (間違った) コードから始めました。たまたま機能した場合 (たまたまデータがすぐに利用可能になった場合)、この関数の実行には約 6 ミリ秒かかりました。i++;
ステートメントを適切な場所 (すぐ上の右中括弧の上) に配置すると、関数の実行に 270 ミリ秒以上かかります。この関数には速度が重要なので、このような劇的な時間の増加を引き起こすステートメントの配置についてはどうなのか疑問に思っています。
以下のコードでは、buff
は as として宣言されchar buff[10];
、sSerial は のインスタンスです。SoftwareSerial
unsigned long updateLocation(Marker* marker) {
this->sSerial->print('~');
//initiate request from vision system
this->sSerial->flush();
this->sSerial->print('#');
this->sSerial->print(marker->num);
this->sSerial->print('*');
this->sSerial->flush();
unsigned long start = millis();
int state = 0, i = 0;
while((millis() - start) < 600) {
if(this->sSerial->available()) {
buff[i] = this->sSerial->read();
if(buff[i] == ',') {
buff[i] = 0;
switch(state) {
case 0:
i = -1;
state++;
break;
case 1:
marker->x = atof(buff);
i = -1;
state++;
break;
case 2:
marker->y = atof(buff);
i = -1;
state++;
break;
case 3:
marker->theta = atof(buff);
i = -1;
return (millis() - start);
break;
default:
return 0;
break;
}
}
// Correct location for i++; takes 270 ms to execute
}
// Incorrect location for i++; Takes 6 ms to execute
i++;
}
this->sSerial->print('~');
this->sSerial->flush();
return 0;
}