У меня есть Arduino и беспроводной трансивер APC220. Я пишу библиотеку, которая считывает данные с APC, используя класс SoftwareSerial. Сначала я начал с (неправильного) кода, который вызывал ошибку seg, потому что переменная i
увеличивается, даже когда нет данных для чтения. В случаях, когда это случилось (случайно, когда данные были немедленно доступны), для выполнения этой функции потребовалось приблизительно 6 миллисекунд. Когда я помещаю оператор i++;
в нужное место (над закрывающей скобкой сразу над ним), функция занимает более 270 мс для запуска. Скорость имеет решающее значение для этой функции, поэтому мне интересно, что это такое о размещении этого заявления, что приводит к столь резкому увеличению времени.Время выполнения функции Arduino
Для кода ниже, buff
объявлен как 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;
}
Не могли бы вы добавить комментарии '//' в свой код, где 'i ++ ;' работает нормально и NOK, и добавляет сведения о длительности времени. –