私はArduinoとAPC220ワイヤレストランシーバを持っています。私は、SoftwareSerialクラスを使用してAPCからデータを読み込むライブラリを作成しています。私はもともと(誤った)コードで開始しました。これは、読み取り可能なデータがなくてもi
変数がインクリメントされるため、segフォルトを引き起こしていました。データがすぐに利用可能になったときにうまく機能した場合、この関数の実行には約6ミリ秒かかりました。 i++;
ステートメントを適切な場所(そのすぐ上にある中かっこの上)に置くと、関数は実行するのに270ミリ秒以上かかります。この機能にはスピードが重要です。そのような劇的な時間の増加を引き起こすのは、そのステートメントの配置に関するものが何であるか不思議です。以下のコードの場合Arduino関数の実行時間
、buff
がchar buff[10];
として宣言され、sSerialはデータレディと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;
}
'i ++;'がOKとNOKで動作しているコードに '//'コメントを追加して、時間に関する詳細を追加できますか? –