TFT LCD屏幕速度问题

时间:2017-11-09 09:21:58

标签: c linux-device-driver embedded-linux openwrt lcd

我正在使用TFT LCD屏幕( ILI9163c - 160 * 128)。它与spi连接 athros AR9331 模块。 Athros AR9331正在运行 OpenWRT linux发行版。所以,我用 spidev0.1 驱动我的液晶显示器。在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);
}

1 个答案:

答案 0 :(得分:-1)

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

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

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