TFT 液晶显示屏速度问题

Issue with TFT lcd screen speed

我用的是TFT液晶屏(ILI9163c - 160*128)。用spi连接athros AR9331模块。 Athros AR9331 是 运行 OpenWRT linux 发行版。所以,我用 spidev0.1 驱动我的 LCD。在 LCD 上填满屏幕或写入任何字符串时,打印时间过长。那么,我该怎么做才能获得足够的打印速度。

谢谢。

这是我使用 spidev 在 spi 引脚上写入数据的函数...

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);
}

这里的主要性能问题是每次调用该函数时,您都会在堆上制作要发送的数据的硬拷贝。您还每次都从头开始设置通信参数,即使它们始终相同。更糟糕的是,该函数有一个巨大的错误:它会泄漏内存,就好像没有明天一样。

硬拷贝并不是真正必要的除非SPI 通信花费太多时间让程序坐下来忙着等待它完成(很有可能)。在这种情况下你可以做的是:

  • 将整个 SPI 业务外包给一个单独的线程。
  • 为线程创建一个工作队列,为此使用您最喜欢的 ADT。应该是线程安全的FIFO。
  • 调用者将数据作为硬拷贝复制到 ADT 中。
  • 线程从 ADT 中挑选一个工作块并从那里传输它,而无需制作另一个硬拷贝。
  • 线程等待 SPI 通信完成,然后确保 ADT 删除数据,然后再获取下一个数据。对于硬实时要求,可以让线程在等待上一条消息的同时提前准备下一条消息。
  • 通信参数"xfer"由线程设置一次,它只是根据不同的情况改变数据目标地址。