Я пытаюсь создать тахометр на С++ для своего ESP32. Когда я раскомментирую Serial.printf("outside rev: %d \n", rev);
вне условного оператора, он работает, но когда я его комментирую, я получаю значения, которые на порядок больше, чем должны быть (700 оборотов без, против 7 оборотов с). Мое лучшее предположение состоит в том, что оператор печати замедляет loop()
ровно настолько, чтобы incrementRevolutions()
переключал глобальную переменную passedMagnet
с true на false перед следующим циклом. Это имело бы смысл, так как задержка обновления passMagnet позволила бы newRevCount++;
запускаться несколько раз. Но это, очевидно, то, что я не могу отладить ни с помощью операторов печати, ни с помощью пошаговой отладки, учитывая чувствительный ко времени характер состояния гонки.
bool passedMagnet = true;
int incrementRevolutions(int runningRevCount, bool passingMagnet)
{
// Serial.printf("passedMagnet: %d , passingMagnet %d , runningRevCount: %d \n", passedMagnet, passingMagnet, runningRevCount);
int newRevCount = runningRevCount;
if (passedMagnet && passingMagnet)
{ //Started a new pass of the magnet
passedMagnet = false;
newRevCount++;
}
else if (!passedMagnet && !passingMagnet)
{ //The new pass of the magnet is complete
passedMagnet = true;
}
return newRevCount;
}
unsigned long elapsedTime = 0;
unsigned long intervalTime = 0;
int rev = 0;
void loop()
{
intervalTime = millis() - elapsedTime;
rev = incrementRevolutions(rev, digitalRead(digitalPin));
// Serial.printf("outside rev: %d \n", rev);
if (intervalTime > 1000)
{
Serial.printf("rev: %d \n", rev);
rev = 0;
elapsedTime = millis();
}
}
Это известная проблема с программированием на Arduino или C++? Что мне делать, чтобы это исправить?
Serial.printf()
и без него, и вы должны знать, является ли это узким местом - person Jack Lilhammers   schedule 14.02.2021Serial.printf()
и 17708 микросекунд без него, то есть почти в два раза дольше. - person James Jordan Taylor   schedule 14.02.2021