c - TFT 液晶显示屏速度问题

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

我使用的是 TFT LCD 屏幕 (ILI9163c - 160*128)。用spi连接athrosAR9331模块。 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 中挑选一个工作 block 并从那里传输它,而无需制作另一个硬拷贝。
  • 线程等待 SPI 通信完成,然后确保 ADT 删除数据,然后再获取下一个数据。对于硬实时要求,可以让线程在等待上一条消息的同时提前准备下一条消息。
  • 通信参数“xfer”由线程设置一次,它只是根据不同情况更改数据目标地址。

关于c - TFT 液晶显示屏速度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47198053/

相关文章:

linux - 如何确定 NTP 通信状态

Android、AOA2、USB 同步音频流

c - 关闭写入器后从管道读取被阻塞

c - setxattr 失败,操作不受支持

c - 减慢模拟器速度

linux - 尝试写入 block 设备时权限被拒绝

c++ - 在 Fedora 20 中查找简单设备驱动程序的头文件

linux - 如何知道 "lag"/串口传输延迟?

c - Windows 和 *nix 编译检测

c - 对于 C 中的无符号整数,确定 X 的长度是否最多为 Y 的一半(以二进制表示)