Странная ситуация с производительностью.

SVP
Offline
Зарегистрирован: 16.04.2012

Странная ситуация с производительностью.

Есть родная megа 2560. Старовата, но дофига пинов итп.

Хотел прикрутить её к простой задаче, в числе прочего понадобился двухразрядный семисегментный индикатор.

Нашел какую-то библиотеку динамической индикации.

Моргает. Ощутимо.

Дальнейшие разборки показали, что loop вызывается раз в 30-40 МИЛЛИСЕКУНД !!!

Откуда столько не могу понять :(

Это действительно норма ?  

К примеру такое 

void setup() {
  Serial.begin(9600);  
  Serial.println("--- Start Serial Monitor SEND_RCVE ---");
}
 
 
void loop()
{
  unsigned long currentMillis = millis();
 
  Serial.print("currentMillis=");
  Serial.println(currentMillis);
 
  Serial.print("cycle=");
  Serial.println(millis()-currentMillis);
}
  
 
 
Дает на выходе такое
 
currentMillis=0
cycle=0
currentMillis=1
cycle=23
currentMillis=28
cycle=25
currentMillis=57
cycle=25
currentMillis=87
cycle=24
currentMillis=115
cycle=27
currentMillis=146
cycle=26
currentMillis=176
cycle=26
currentMillis=206
 
 
 

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Serial.print* довольно сильно замедляет loop. Используй ее только для отладки, а после закомментируй все упоминания - скорость возрастет в 2-3 раза.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если медленно, то уже сказали почему, если быстро, то смотрим сюда:

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

 

SVP
Offline
Зарегистрирован: 16.04.2012

Да, спасибо, тоже уже допер, что дело в нём.

Стало получше, но как-то всё равно довольно нешустро.

Каких-нибудь профайлеров не бывает простых в использовании ?

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013