2017-11-09 18 views
1

TFT液晶画面(ILI9163c-160 * 128)を使用しています。 athrosAR9331モジュールspiで接続されています。 Athros AR9331はOpenWRTのLinuxディストリビューションで動作しています。だから、私はLCDをspidev0.1で運転しています。画面を塗りつぶしたり、文字列をLCDに書き込んだりすると、印刷に時間がかかりすぎます。ですから、十分な印刷速度を得るためには何ができますか?TFT液晶画面での問題

ありがとうございました。

これは、ここでの主なパフォーマンスの問題は、あなたがヒープ上に送信するデータのハードコピーを作成することである

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

一般的に言うのは難しいです。私はあなたがspeedxを最大に調整したと仮定します。単一の要求にできるだけ多くのデータをパックしようとしますか?表示したいものに最適な表示コマンドを使用しようとしますか? – Ctx

+0

そう...本当です。そして私は160 * 128配列の全体イメージを印刷する必要があるので、私はできるだけ多くのデータを単一の要求にパックしようとしています。だから私はいくつかのチャンクでこの配列を壊し、すべてのこのチャンクを1つずつ転送するよりも。 – Logan859

+0

そして、* fbtft *ドライバをディストリビューションに追加して通常のコンソールまたはttyウィンドウとして使うというのはどうですか? – 0andriy

答えて

-1

...私はspidevを使用して、SPIピン上のデータを書き込むために使用している機能です関数が呼び出されるたびに呼び出されます。また、常に同じであるにもかかわらず、毎回ゼロから通信パラメータを設定します。状況を悪化させるために、この関数には大きなバグがあります。明日がないかのようにメモリをリークします。

SPI通信には、プログラムが座って終了するまでに多大な時間がかかっています(むしろそうかもしれません)。その場合にできることは次のとおりです。

  • SPIビジネス全体を別のスレッドにアウトソーシングします。
  • お気に入りのADTを使用してスレッドの作業キューを作成します。これはスレッドセーフなFIFOでなければなりません。
  • データは、呼び出し元によってハードコピーとしてADTにコピーされます。
  • スレッドはADTから1つの作業塊を取り出し、もう1つのハードコピーを作成することなくそこから送信します。
  • スレッドはSPI通信が完了するのを待ってから、ADTがデータを削除したことを確認してから次のデータを取得します。ハードリアルタイムの要件については、前のスレッドを待っている間にスレッドが次のメッセージを前もって準備するようにすることができます。
  • スレッドによって通信パラメータ "xfer"がに設定された後、データ宛先アドレスが大文字と小文字に変更されます。
+0

ありがとう... @ランディン。あなたのアドバイスとして私のコードを修正しようとします。しかし、LCDに文字列を印字している間、この関数は各文字ごとにピクセル単位でデータを出力します。そう、その時はとても遅いです。そのシナリオで私ができること。 – Logan859

+0

@ Logan859もしあなたがSPIタスクが終了するのを効果的に待つ何らかの方法があれば、そのスレッドはそれを使ってSPIが完了するまでスリープするべきです。それが利用できない場合は、ちょっと待ってください。 SPIがどれほど遅い/速いかについては、主にボーレートに依存します。 DMAが利用できるかどうかを調べるべきです。それは、問題をもっともっとエレガントに解決するでしょう。 – Lundin

関連する問題