2015年6月8日月曜日

zynqのドライバ入門 myledサンプルから一歩進みたい

Digilentのmyledサンプルまではフォローできました。これでFPGA(PL)にAXIで繋いだレジスタへのwriteができ、同じものをreadしてCPU側で表示することができました。

この先やりたいことは組み込み用途ならだいたいみんな一緒で

  1. myledサンプルだと、一度read/writeするたびにcloseしないといけないので遅い。連続rwしたい。
  2. 割り込みハンドリングしたい
  3. 大容量データを転送したい

といった順序で戦っていくことになります。



まず1番目についてですが、現状の/proc/myledデバイスを open->read->close または open->write->close するコンボでどれだけオーバーヘッドがあるか、ユーザーコード側で100万回ループさせて確認してみました。

readの方はコンソールに文字を出すと/dev/nullに捨ててもかなりのオーバヘッドになるので、コード内で読み捨てしています。

  • open->write->close ×100万回 = 156秒  ⇒ 1回あたり 0.15msec
  • open->read->close ×100万回 = 76秒    ⇒ 1回あたり 0.07msec

人間の速度からすれば高速ですが、10msecごとにIOをポーリング監視したい、といったような組み込み用途ではさすがに見過ごせない遅さです。


3番目の大容量転送は、DMAやらブロックデバイスやらが登場しそうな気がするのでいったん忘れることにして、とにかく1番と2番をなんとか学習したいと思います。


あちこちの先輩方の記事を見ると、このあたりに関してはUIOを使うと簡単そうなのでちょっと試してみたのですが・・・

0 件のコメント:

コメントを投稿