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"由线程设置一次,它只是根据不同的情况改变数据目标地址。
我用的是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"由线程设置一次,它只是根据不同的情况改变数据目标地址。