Frage

ich ein eingebettetes Projekt, das ich arbeite, und ich bin zur Codierung der Zeichen-LCD-Treiber.

Im Moment der LCD-Treiber unterstützt nur „dumme“ Schreiben. Zum Beispiel, sagen wir, Linie 1 einen Text auf ihm hat, und ich mache einen Aufruf der Funktion, dass Schreiben in der Leitung. Die Funktion wird einfach am Anfang der Zeile suchen und den Text (plus genug Leerzeichen zu löschen, was zuletzt geschrieben wurde) schreiben.

Das ist schön und gut, aber ich habe das Gefühl, es schrecklich ineffizient manchmal ist, da einige Linien sind einfach: "Einige Lesen: some-Value"

Anstatt „Brute-Force“ ersetzen die gesamte Zeile, wollte ich einige Codes entwickeln, die den besten Weg herauszufinden, würde zu Update die Informationen auf dem LCD-Display.

(nur als Hintergrund, es dauert 2 Bytes zu jeder char Position zu suchen. Ich kann dann beginnen, um die Zeichenfolge zu schreiben)

Meine Idee war es, zuerst eine Schleife hat. Diese Schleife würde die Eingabe in den letzten Schreib vergleichen, und dabei wäre es zwei Dinge abdecken:

A: Sammeln Sie alle Unterschiede zwischen dem letzten Schreib und dem Eingang. Für jedes zusammenhängende Segment (sei es gleich oder verschieden) zwei Byte in den Byte-Zählung hinzuzufügen. Dies wird in B verwiesen, um zu bestimmen, ob wir serielle Bandbreite verschwenden.

B: Die Schleife würde bestimmen, ob dies wirklich ein intelligentes, was zu tun ist. Wenn wir mehr Bytes am Ende mit, um die Zeile zu aktualisieren, als zu „Brute-Force“ die Linie, dann sollten wir einfach zurückkehren und die Brute-Force-Methode übernehmen lassen. Wir sollten die Smart-Write-Funktion so schnell verlassen, wie diese Bedingung zu verschwenden Zeit erfüllt ist.

Der nächste Teil der Funktion würde alle die Unterschiede nehmen, suchen auf dem LCD der erforderlichen Zeichen, und sie zu schreiben.

Wenn wir also eine Zeichenfolge wie diese bereits auf dem LCD: "Current Temp: 80F" und wir wollen, dass es zu aktualisieren, um "Current Temp: 79F"

Die Funktion wird durchgehen und sieht, dass es weniger Bandbreite in Anspruch nehmen würde einfach auf die „8“ und schreibt „79“ suchen. Die „7“ wird der „8“ und „9“ wird sich auf die „0“ abzudecken. Auf diese Weise wir verschwenden keine Zeit die gesamte Zeichenfolge auszuschreiben.

Scheint dies wie eine praktische Idee?

War es hilfreich?

Lösung

Es macht keinen Sinn, diese zu optimieren. 20 Byte bei 9600 Baud zu übertragen und bringt die Hardware 21 Millisekunden. Und nimmt die Software ein paar Mikrosekunden. Schnell genug, um die Anzeige schneller als das menschliche Auge aktualisieren immer um einen Faktor von 2. wahrnehmen konnte Und es ist nicht wie Sie die „Bandbreite“ müssen, gibt es keine zusätzlichen Daten, dass ich, dass Sie denken ‚d will auf dem seriellen Kanal multiplexen.

Andere Tipps

Unter der Annahme, dass der Versatz in die Anzeige Auto-Schritte, und es ist eine einzige Schreib zur Ausgabe jeden aufeinanderfolgende Zeichen, würde ich geneigt sein, einfach die gesamte Displayzeile jedes Mal zu schreiben, wenn es ein bestimmten Performance-Problem ist, dass Sie zu beheben versuchen, . dh:. Unnötige Optimierungen sind potenzielle zukünftige Wartung Kopfschmerzen und Ihre Zeit „Optimierung“ wäre besser für etwas ausgegeben werden, dass tatsächlich die Leistung der gesamten Anwendung beeinträchtigt

Hinweis: Wenn das Display-Update ist tatsächlich eine Anwendung Performance-Problem zu beeinflussen, haben Sie wahrscheinlich ein Gefühl dafür, wie viel schneller muss es sein .... dann Sie (und uns) können Sie Ihre eigene Anleitung, wie viel Optimierung sein ist genug.

Die Implementierung Sie planen, scheint für das Problem zu komplex zu sein. Alle benötigten Vergleichens kann tatsächlich den Betrieb verlangsamen, wenn der Prozessor nicht schnell ist.

Wenn Sie nur den Temperaturwert zu aktualisieren müssen zum Beispiel, sollten Sie nur den Temperaturwert aktualisieren und die festen Texte ignorieren. Sie müssen für jedes Feld die Koordinaten im Speicher haben, die aktualisiert werden muss. Dann bewegen Sie einfach die Schreibposition zu dieser Position und den Wert. Das ist, wie ich es normalerweise tun.

Wenn die Bildschirmaktualisierung immer noch zu langsam ist, können Sie Assembly-Sprache betrachten. Zum Beispiel machten vor ein paar Jahren mir Software für eine Armbanduhr Typ Gerät mit Dot-Matrix-LCD-Display. Die Anzeigeaktualisierung zu langsam war (fast eine Sekunde, um die gesamte Anzeige beispielsweise zu aktualisieren, wenn Scrollen), so dass ich nur die niedrigste Level-Routine in Assembly (mit 30 Linien der Montage etwa 20 Zeilen C ersetzt) ??geschrieben. Die resultierende Funktion war halb so groß und 3-mal schneller als die optimierte C-Funktion, und jetzt die Anzeigeaktualisierungsgeschwindigkeit war ausreichend.

Auf diese Weise wir verschwenden Zeit mit dem Schreiben nicht aus dem gesamten String.

Sie sollten nicht viel Zeit, um alle verschwenden, sicherlich weniger als die Zeit es dauern würde, alle diese Prüfung tun.

Was ist die Verbindung mit dem LCD? SPI / I2C / parellel?

Was auch immer es ist, wenn DMA durch den SoC auf der Schnittstelle unterstützt wird, es zu benutzen.

Wenn nicht, sollten Sie nicht zwischen tx Bytes warten um, vor allem, wenn der Befehlstakt des Prozessors ist viel höher als die Uhr der Datenverbindung. Dies ist wahrscheinlich wahr, da die meisten Zeichen-Display ist i mit haben niedrige max Uhr Spezifikationen gearbeitet haben.

Verwenden Sie entweder eine Interrupt-Routine zu behandeln jedes Byte Senden oder ‚Hybrid‘ Ansatz verwenden, wenn Sie das Routing steuern Interrupt kann (werden tun dies für die Energieeinsparung). Theres eine interessante aufzuschreiben hier

Für eine Zeichenanzeige, diese Art von Update-Optimierung ist es, was die curses Bibliothek alles über war. Zurück in dem Tag, wenn wir zu großen Computern mit dummen Terminals und Telefonleitungen mit 1200 Baud oder weniger gesprochen, war es oft schwierig, den Bildschirm schnell genug zu aktualisieren, um Programme interaktiv über die langsame Modem-Verbindung zu fühlen. Die Flüche Bibliothek machte es praktisch durch einen Cache zu halten, was auf dem Bildschirm des Benutzers sein soll und eine nahezu optimale Anzahl von Bewegung und Löschbefehlen durchsetzt mit normalen Zeichen für die Anzeige zu senden. Es erforderte, dass das Terminal Unterstützung in irgendeiner Form Cursorpositionierung.

Die Flüche Bibliothek lebt auf in ein paar Formen und ncurses , zum Beispiel , ist bekannt, Open Source und unter der GPL lizenziert.

Grundsätzlich Sie ncurses zu sprechen Sie mit Ihrem Display-Controller anpassen könnten und lassen Sie es die ganze harte Arbeit zu tun.

Die offene Frage ist, ob es der Mühe wert ist. Bei 9600 Baud, können Sie 960 Zeichen pro Sekunde senden. Das ist schnell genug, um vollständig eine 4 Zeilen mit 20 Spalt LCD 12-mal pro Sekunde neu streichen. Also, wenn Sie in einem PIC oder ATtiny laufen, wo Sie vielleicht, dass UART in Software implementieren und müssen die Zyklen, um tatsächlich etwas Nützliches zu tun, gibt es wahrscheinlich wenig Vorteil sein, um zu klug zu sein.

sagte, dass es nach wie vor in der Regel sinnvoll ist Ihren festen Text einmal zu malen, und aktualisieren Sie einfach die angezeigten Werte wie sie sich ändern.

Textmodus LCD

Ich stimme mit anderen, wenn Sie schreiben im Textmodus, dann ist es nicht wirklich jeder Punkt dieser Ebene auf den Charakter zu tun. Die Bearbeitungszeit benötigt, um die Berechnungen zu tun, solange die Zeit wahrscheinlich nehmen, um tatsächlich das Zeug schreiben.

Ferner wird eine pro Zeichen Ebene wird durch ein wenig Speicher kauen, wie Sie benötigen, um Puffer was gerade angezeigt wird (das heißt, was wurde zuletzt geschrieben).

Sie kann den Prozess durch die Spaltung vereinfachen den Bildschirm in Abschnitte (Linien neigen dazu, die bequem zu sein) und dann das Markieren, wenn diese Linie ändert. Dies ist besonders nützlich, wenn Sie in einen Speicherpuffer des Bildschirms schreiben möchten, und synchronisieren Sie es später (in einem Weckalarm zum Beispiel).

Reduzierung von Design

Anstatt diese bis zu dem Fahrer des Ausscheidens zu erreichen, können Sie Schreibzeit auf der Anwendungsebene verringern, indem sichergestellt wird Sie nur die Sachen, die Änderungen schreiben. Dies könnte durch Bestimmung spezifischer Wert Zellen erreicht werden, im Wesentlichen wie folgt vor:

char text[50];
int val;
...
lcd_print("The count is ", 0, 0); // Print static text at the coords (0,0)
sprintf(text, "%d", val);
lcd_print(text, 0, 13); // Print changing text at (0,13)
...
sprintf(text, "%d", val);
lcd_print(text, 0, 13); // Print changing text at (0,13)

Und nicht:

char text[50];
int val;
...
sprintf(text, "The count is %d", val);
lcd_print(text, 0, 0); // Print all text at the coords (0,0)
...
sprintf(text, "The count is %d", val);
lcd_print(text, 0, 0); // Print all text at the coords (0,0)

Grafikmodus LCD

Auf der anderen Seite, wenn Ihr Schreibvorgang recht teuer ist, wie meine (~ 20 Bytes, um ein Zeichen im Grafikmodus Zeichnung), dann auf Zeichenbasis spart Zeit wäre sinnvoll. Es gibt zwei Systeme Sie verwenden können. Das erste ist, wie Sie beschreiben, aber man könnte wie auch berücksichtigen (wenn grafischen Modus) das Konzept eine horizontale Pixelzeile durch die Textzeile zu puffern.

Das Schreiben jedes Zeichen auf einer Basis pro Zeichen erfordert die Schreib Cursor auf die Pixelzeile manuell bewegen, vorausgesetzt, Ihr horizontal zeichnen, und dann von oben nach unten. Dieser Schritt könnte, indem er all Top-Linien aller Zeichen in einer Textzeile, oder noch besser eine geänderte Untergruppe (zB „ABC“ und dann getrennt „I“ in „XXXDEFGHX“ -> „ABCDEFGHI“) entfernt werden.

Natürlich Speicher der genaue letztere Methode würde davon abhängen, wie viele Pixelzeilen, die Höhe eines Zeichens aus. Je mehr Linien, desto größer ist die Ersparnis (weil Sie benötigen die Cursor mehrmals zu bewegen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top