2017-11-09 4 views
1

I TFT-LCD-Bildschirm bin mit (ILI9163c-160 * 128). Es ist verbunden mit athrosAR9331 Modul mit spi. Athros AR9331 läuft mit OpenWRT Linux Distribution. Also fahre ich mein LCD mit spidev0.1. Wenn Sie den Bildschirm füllen oder eine Zeichenfolge auf dem LCD-Bildschirm schreiben, dauert das Drucken zu lange. Also, was kann ich tun, um eine ausreichende Druckgeschwindigkeit zu erhalten?Ausgabe mit TFT-LCD-Bildschirm Geschwindigkeit

Danke.

Dies ist die Funktion ich verwende Daten auf spi Stift schreiben spidev mit ...

void spi_transactor(unsigned char *write_data, int mode,int size) 
{ 
    int ret; 
    struct spi_ioc_transfer xfer[4]; 

    unsigned char *init_reg; 
    init_reg = (unsigned char*) malloc(size); 
    memcpy(init_reg,write_data,size); 

    if (mode) 
    { 
     gpio_set_value(_rs, 1); // DATA 
    } 
    else 
    { 
     gpio_set_value(_rs, 0); // COMMAND 
    } 

    memset(xfer, 0, sizeof xfer); 

    xfer[0].bits_per_word = 8; 
    xfer[0].tx_buf = (unsigned long)init_reg; 
    xfer[0].rx_buf = 0;    //(unsigned long) &buf_rx[0]; 
    xfer[0].len = size;    //wlength + rlength; 
    xfer[0].delay_usecs = 0; 
    xfer[0].speed_hz = speedx;  // 8MHZ 
    //xfer[0].speed_hz = 160000000; // 40MHZ 
    ret = ioctl(spi_fd, SPI_IOC_MESSAGE(1), &xfer); 

    gpio_set_value(_rs, 1); 
} 
+0

Hart im Allgemeinen zu sagen. Ich nehme an, dass Sie Speedx auf das Maximum eingestellt haben. Versuchen Sie, so viele Daten wie möglich in eine einzige Anfrage zu packen? Versuchen Sie, optimale Anzeigebefehle für das zu verwenden, was Sie anzeigen möchten? – Ctx

+0

ya ... das stimmt. Und ich versuche, so viele Daten wie möglich in eine einzige Anfrage zu packen, weil ich das ganze Bild des 160 * 128 Feldes drucken muss. Also zerbringe ich dieses Array in einigen Chunks und übertrage all diese Chunks einzeln. – Logan859

+0

Und was ist das Problem, * fbtft * -Treiber in eine Distribution hinzuzufügen und es als normale Konsole oder als tty-Fenster zu verwenden? – 0andriy

Antwort

-1

Die Frage Hauptleistung ist, dass Sie eine harte Kopie der Daten machen auf dem Heap senden , jedes Mal, wenn die Funktion aufgerufen wird. Sie legen die Kommunikationsparameter auch jedes Mal neu an, auch wenn sie immer gleich sind. Um die Sache noch schlimmer zu machen, hat die Funktion einen massiven Fehler: Sie verliert Speicher, als gäbe es kein Morgen.

Die Hardcopies sind nicht wirklich notwendig es sei denn die SPI-Kommunikation dauert zu viel Zeit für das Programm zu sitzen und beschäftigt-warten auf es zu beenden (eher wahrscheinlich). Was Sie in diesem Fall tun können, ist dies:

  • Lagern Sie die gesamte SPI-Geschäft zu einem separaten Thread aus.
  • Erstellen Sie eine Arbeitswarteschlange für den Thread mit Ihrem bevorzugten ADT für solche. Es sollte ein Thread-sicheres FIFO sein.
  • Daten werden vom Aufrufer als Hardcopy in den ADT kopiert.
  • Der Thread nimmt ein Stück Arbeit vom ADT und überträgt es von dort, ohne noch eine weitere Kopie zu machen.
  • Der Thread wartet auf die Kommunkation SPI, dann fertig stellt sicher, dass die ADT die Daten löscht, bevor die nächste Heimelf. Für harte Echtzeitanforderungen können Sie festlegen, dass der Thread die nächste Nachricht im Voraus vorbereitet, während er auf die vorherige Nachricht wartet.
  • Die Kommunikationsparameter „XFER“ werden einmal durch den Faden aufgebaut, es ändert sich nur die Datenzieladresse von Fall zu Fall verschieden.
+0

Danke ... @Lundin. Ich werde versuchen, meinen Code als Ratschlag zu ändern. Beim Drucken eines Strings auf dem LCD-Drucker werden mit dieser Funktion Daten für jedes Zeichen Pixel für Pixel gedruckt. Also, zu dieser Zeit ist es sehr langsam. Was kann ich in diesem Szenario tun? – Logan859

+0

@ Logan859 Wenn es eine Möglichkeit für Sie gibt, effektiv zu warten, bis die SPI-Aufgabe über die API beendet wird, dann sollte der Thread das verwenden und schlafen, bis SPI fertig ist. Wenn das nicht verfügbar ist, müssen Sie nur warten. Wie langsam/schnell der SPI ist, hängt hauptsächlich von der Baudrate ab. Übrigens sollten Sie auch schauen, ob DMA verfügbar ist - es würde das ganze Problem viel eleganter lösen. – Lundin

Verwandte Themen