Arduino schéma - arduino.sk

LiquidCrystal library - rychlost

Programovanie arduina
Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

LiquidCrystal library - rychlost

Poslaťod posjirka » Str 02. Sep 2015 23:18:17

na několik forech jsem narazil na nespokojenost uživatelů s knihovnami LiquidCrystal novějších verzí Arduino IDE.
Stáhnul jsem si tedy verzi 0017, 1.6.5, 1.0.5-r2, + 3 externí knihovny a K tomu jsem udělal testovací program :
Kód: Vybrať všetko
// test knihoven LiquidCrystal
// by jp 2015
// slouží pro porovnání rychlosti a náročnosti jednotlivých verzí Arduino IDE resp. jejich knihoven LiquidCrystal
// budu měřit dobu:
// - startu programu
// - vložení nového znaku do paměti
// - vyvolání znaku z paměti a zobrazení
// - mazaní celé obrazovky příkazem clear
// - mazaní celé obrazovky přepsáním mezerami
// - naplnění znaky LCD
// vše bude ve 4-bitovém provedení na shieldu LCD Keypad Shield DF T¨Robot starší verze
// vyvolají se jednotlivé funkce a změří se čas před a po . jejich orzdíl se pak na 5s zobrazí na LCD.



#include <LiquidCrystal.h>     // knihovna LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // piny kde je pripojen LCD panel

unsigned long oldTime = 0; // čas před
unsigned long newTime = 0; // čas po
unsigned long diffTime = 0; // rozdíl času

// znak
byte znak[8] = {
  0b00100,
  0b01010,
  0b10001,
  0b00100,
  0b01010,
  0b10001,
  0b00100,
  0b01010
};
void setup() {
  lcd.begin(16, 2);              // velikost LCD
  oldTime = 0; // čas před
  newTime = 0; // čas po
  diffTime = 0; // rozdíl času

}

void loop() {
// - startu programu
  lcd.clear(); // mazani lcd
  oldTime = micros(); // cas od startu
  lcd.setCursor(0,0); // nastav kurzor na 0,0
  lcd.print("START:"); 
  lcd.setCursor(0,1); // nastav kurzor na 0,0
  lcd.print(oldTime);
  delay(5000); 
// - vložení nového znaku do paměti
  oldTime = micros(); // aktualizace promenne
  lcd.createChar(1, znak);
  newTime = micros(); // aktualizace promenne
  diffTime = newTime - oldTime; // vypocet rozdilu
  lcd.clear(); // mazani lcd
  lcd.setCursor(0,0); // nastav kurzor na 0,0
  lcd.print("novy znak:"); 
  lcd.setCursor(0,1); // nastav kurzor na 0,0
  lcd.print(diffTime);
  delay(5000);
// - vyvolání znaku z paměti a zobrazení
  oldTime = micros(); // aktualizace promenne
  lcd.write(1);
  newTime = micros(); // aktualizace promenne
  diffTime = newTime - oldTime; // vypocet rozdilu
  delay(1000); // kontrolni pauza
  lcd.clear(); // mazani lcd
  lcd.setCursor(0,0); // nastav kurzor na 0,0
  lcd.print("zobrazeni znak:"); 
  lcd.setCursor(0,1); // nastav kurzor na 0,0
  lcd.print(diffTime);
  delay(5000);
// - mazaní celé obrazovky příkazem clear
  oldTime = micros(); // aktualizace promenne
  lcd.clear();
  newTime = micros(); // aktualizace promenne
  diffTime = newTime - oldTime; // vypocet rozdilu
  lcd.clear(); // mazani lcd
  lcd.setCursor(0,0); // nastav kurzor na 0,0
  lcd.print("lcd.clear():"); 
  lcd.setCursor(0,1); // nastav kurzor na 0,0
  lcd.print(diffTime);
  delay(5000);
// - mazaní celé obrazovky přepsáním mezerami
  oldTime = micros(); // aktualizace promenne
  lcd.setCursor(0,0); // nastav kurzor na 0,0
  lcd.print("                ");
  lcd.setCursor(0,1); // nastav kurzor na 0,1
  lcd.print("                ");
  newTime = micros(); // aktualizace promenne
  diffTime = newTime - oldTime; // vypocet rozdilu
  lcd.clear(); // mazani lcd
  lcd.setCursor(0,0); // nastav kurzor na 0,0
  lcd.print("mazani mezerami:"); 
  lcd.setCursor(0,1); // nastav kurzor na 0,0
  lcd.print(diffTime);
  delay(5000);
// - naplnění znaky LCD
  oldTime = micros(); // aktualizace promenne
  lcd.setCursor(0,0); // nastav kurzor na 0,0
  lcd.print("0123456789012345");
  lcd.setCursor(0,1); // nastav kurzor na 0,1
  lcd.print("abcdefghijklmnop");
  newTime = micros(); // aktualizace promenne
  diffTime = newTime - oldTime; // vypocet rozdilu
  delay(1000); // kontrolni pauza
  lcd.clear(); // mazani lcd
  lcd.setCursor(0,0); // nastav kurzor na 0,0
  lcd.print("naplneni:"); 
  lcd.setCursor(0,1); // nastav kurzor na 0,0
  lcd.print(diffTime);
  delay(5000);
}


(v případě poslední knihovny se ještě změní název knihovny) a porovnal je mezi sebou.
jako referenční kompilátor jsem použil Arduino 1.0.5-r2.
Ty rozdíly jsou celkem propastné:

knihovna ................................................... | 0017 ..... | 1.0.5 ..... | 1.6.5 ..... | Liquid V1.2.1 * . | New Liquid ** | FAST 1.1 ***
IDE ...........................................................| 0017 ..... | 1.0.5 ..... | 1.6.5 ..... | 1.0.5 .............. | 1.0.5 ........... | 1.0.5
-----------------------------------------------------------------------------------------------------------------------------
start programu - us......................................| 7044 ..... | 16408 .... | 16552 .... | 113848 ........... | 14660 ......... | 149188
----------------------------------------------------------------------------------------------------------------------------
vložení nového znaku do paměti - us ..............| 2892 ..... | 3004 ...... | 3188 ..... | 1128 ................| 756 ............. | 3456
-----------------------------------------------------------------------------------------------------------------------------
vyvolání znaku z paměti a zobrazení - us .........| 320 ...... | 340 ........ | 356 ....... | 92 .................. | 84 .............. | 396
-----------------------------------------------------------------------------------------------------------------------------
mazaní celé obrazovky příkazem clear - us .......| 1304 .... | 2348 ....... | 2372 ...... | 2100 .............. | 2096 ........... | 3304
-----------------------------------------------------------------------------------------------------------------------------
mazaní celé obrazovky přepsáním mezerami -us .| 10936 .. | 11379 ..... | 12052 .... | 2956 .............. | 2912 ........... | 13248
-----------------------------------------------------------------------------------------------------------------------------
naplnění znaky LCD -us ............................... | 10936 ... | 11364 ..... | 12040 .... | 2944 .............. | 2904 .......... | 13236
-----------------------------------------------------------------------------------------------------------------------------
velikost - byte .......................................... | 3784 ..... | 4006 ...... | 3792 ...... | 4462 .............. | 4142 .......... | 4496



* https://bitbucket.org/fmalpartida/new-l ... V1.2.1.zip

** https://github.com/marcmerlin/NewLiquidCrystal

*** https://www.pjrc.com/teensy/td_libs_LiquidCrystal.html

Ve výsledku jsem zjistil, že nejlepší je asi použít https://github.com/marcmerlin/NewLiquidCrystal , která je nejrychlejí ze všech a zabírá podobně místa jako ostatní knihovny.
Rychlost je ovšem až 5x větší než u standardních dodávaných knihoven.

Máte někdo ještě typ na nějákou knihovnu LCD k testu?

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: LiquidCrystal library - rychlost

Poslaťod budvar10 » Štv 03. Sep 2015 8:23:44

Skúšal si knižnicu od Francisco Malpartida ?
Ja ju používam už veľmi dlho a kedysi na začiatku sa mi javila bezkonkurenčná, potom som sa už tým viac nezaoberal. Je to na GitHube. Má tam aj benchmarky.

Príspevky: 33
Registrovaný: Pia 26. Jún 2015 21:17:41

Re: LiquidCrystal library - rychlost

Poslaťod barado » Štv 03. Sep 2015 9:03:58

budvar10 píše:Skúšal si knižnicu od Francisco Malpartida ?
Ja ju používam už veľmi dlho a kedysi na začiatku sa mi javila bezkonkurenčná, potom som sa už tým viac nezaoberal. Je to na GitHube. Má tam aj benchmarky.


Ahoj.
Podla webu sa jedna o "modifikovanu" (doplnenu) kniznicu prave od Francisco Malpartida.
Ale neporovnaval som ju v kode. Mozno by ju mohol posjirka porovnat priamo v tom jeho teste.

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: LiquidCrystal library - rychlost

Poslaťod budvar10 » Štv 03. Sep 2015 13:35:11

Ach, jasné. Nečítal som to dôsledne. :oops:
Je tam presne tá verzia čo používam 1.2.1 a samozrejme tá New.. je nejaký derivát od Malpartida.

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: LiquidCrystal library - rychlost

Poslaťod posjirka » Štv 03. Sep 2015 17:03:07

knihovna od Francisco Malpartida je ta s jednou hvězdičkou a v běhu programu byla celkem rychlá, ale ten strat je zarážející. Co tam tak dlouho dělá?
NevLiquidCrystal (**) vyšla nejlíp i když asi bude vcelku podobná originálu už jen podle počtu, názvu a velikosti souborů.
Dovnitř jsem se nedíval, ale inspirace pro new LiquidCrystal je asi jasná.

Ten test se může zdá jako nimrání se v nesmyslech, mě ale není jedno co dělá mikroprocesor o 10ms víc při přepisu řádků, když nemusí.
Při smyčkách po 100ms máte mazání a nový zápis v extrémech bud 14ms nebo 5ms.... a ten buffer taky není nekonečný :)

Príspevky: 74
Registrovaný: Štv 04. Dec 2014 22:15:58
Bydlisko: Banská Bystrica

Re: LiquidCrystal library - rychlost

Poslaťod Robo Ulbricht » Pia 04. Sep 2015 14:58:16

Tá rýchlosť je asi robená v jedinej funkcii. Asi sa spoliehajú na to, že kompatibilné čipy nevyžadujú to čakanie, čo tam ma originálna verzia.

Kód: Vybrať všetko
// https://github.com/marcmerlin/NewLiquidCrystal/blob/master/LiquidCrystal.cpp
void LiquidCrystal::pulseEnable(void)
{
   // There is no need for the delays, since the digitalWrite operation
   // takes longer.
   digitalWrite(_enable_pin, HIGH);   
   waitUsec(1);          // enable pulse must be > 450ns   
   digitalWrite(_enable_pin, LOW);
}

// ide 1.6.5
void LiquidCrystal::pulseEnable(void) {
  digitalWrite(_enable_pin, LOW);
  delayMicroseconds(1);   
  digitalWrite(_enable_pin, HIGH);
  delayMicroseconds(1);    // enable pulse must be >450ns
  digitalWrite(_enable_pin, LOW);
  delayMicroseconds(100);   // commands need > 37us to settle
}

Späť na Software