embeddedなブログ

組み込みシステムに関することや趣味に関することをダラダラと書いていきます(^^)

SDIOバスの高速化

2012-01-16 18:11:59 | Windows Embedded CompactまたはCE

SDIOドライバはコントローラに対してリクエストを発行したときに、通常はコントローラからの完了割り込みを待ちます。

大きなデータ転送を伴うリクエストの場合は、データ転送が完了するまでは、ドライバは割り込み待ち状態に入り、他のスレッド処理をする方がシステム全体の性能アップにつながるので、割り込み利用によるアドバンテージがあるといえます。

しかし、データ転送を伴わない、あるいはサイズが小さいデータ転送リクエストの場合には、通常すぐにコントローラから応答が返るにも関わらず、ドライバは割り込み待ち状態になってしまいます。 ドライバが割り込み状態に入ると、タスクが他のスレッドに切り替わり、割り込みが上がって入るにも関わらず、すぐに割り込み完了処理ができません。 このタスクスイッチと割り込み処理のオーバヘッドによりSDIOバスの性能が劣化します。

逆にいうと、このオーバヘッドを無くすことで性能向上が見込めます。 このテクニックがFast-Path です。

このオーバヘッドを無くすために、あるサイズ以下のデータ転送リクエストのときのみ割り込み待ちをせず、CPUによるポーリングでリクエスト完了を待ちます。 これにより、タスクスイッチが発生せず、また割り込みのオーバヘッドも発生しないため高速にリクエストが完了できます。

Fast-Pathを実行するかどうかを決めるデータサイズは、以下のレジストリでThresholdという値により定義できます。 デフォルトでは2KBとなっています。

[HKEY_LOCAL_MACHINE\Drivers\Builtin\SDBusDriver]
   "Order"=dword:15
   "Dll"="SDBus.dll"
   "Prefix"="SDC"
   "ThreadPriority"=dword:64     ; default thread priority for dispatch thread
   "RequestListDepth"=dword:30   ; pre-allocated requests
   "Flags"=dword:10000 ; DEVFLAGS_TRUSTEDCALLERONLY
   "IClass"=multi_sz:"{20FA98A8-B298-4b32-8D72-C716AEE2FA84}=%b","{6F40791D-300E-44E4-BC38-E0E63CA8375C}=%b"
   "Threshold”=dword:0x800

詳しくは、SDIO Fast-Path Support に記載されています。


最新の画像もっと見る