CARD_ReadRomAsync

構文

#include <nitro/card.h>

void CARD_ReadRomAsync(u32 dma, const void *src, void *dst, u32 len, MIDmaCallback callback, void *arg);

引数

dma 転送に使用するDMAチャンネルを0からMI_DMA_MAX_NUMの範囲で指定します。
TWLモードで動作していれば、新規DMAチャンネルを(MI_DMA_USING_NEW+0)から(MI_DMA_USING_NEW+MI_DMA_MAX_NUM)の範囲で指定することも可能です。
範囲外のチャンネルまたは明示的にMI_DMA_NOT_USEを指定するとDMA転送は使用せずCPUによって直接処理されます。
src 転送元の CARD ROM アドレス
dst 転送先のメモリアドレス
len 読み出すデータのバイト長
callback 完了時のコールバック関数
必要ない場合は NULL を指定します。
有効なDMAチャンネルを指定した場合、このコールバックはDMA割り込みハンドラ内から呼び出されます。
arg 完了時のコールバック関数に与える引数
callback に NULL を指定した場合は単に無視されます。

返り値

なし。

説明

ROM の配置されたデバイスからデータを非同期的に読み込みます。

有効なDMAチャンネルを指定されている場合、MI_StopDma( ) で明示的に停止してから使用します。
また、前回のアクセスが完了していなければ完了までブロッキングします。

この関数で明示的に CPU 転送を指定した場合は、同期版のCARD_ReadRom( ) と同じ動作になります。

注意

内部動作

内部でDMA転送が発生するかどうかの条件は、動作モードや 実行ROMファイルの形式によって異なります。これは ROMからデータをリードする際のハッシュチェックの有無の違いに起因するものです。


(1) NITRO モードで動作する場合や、.tlf ファイルを TWL モードで実行する場合は以下の説明を参照してください。

この関数は、以下の条件を満たした場合に限りDMA転送とIRQハンドラを使用して非同期的に動作します。
この場合にはカードデータの転送とCPU処理を並列に行うことができます。

これらの条件に合わない場合は、DMA転送の指定の有無にかかわらずCARDライブラリ内部のスレッドを使用してCPU処理による非同期処理を実行します。
このスレッドについては、CARD_GetThreadPriority( )の説明を参照ください。

DMA転送の条件を満たすために実際にアプリケーションで注意すべき点は主に以下の通りです。


(2) .srl や .tad を TWLモードで動作する場合は以下の説明を参照してください。

TWL実機でTWLモード動作をする場合もこれに該当します。

これらの場合は転送データのハッシュチェックを行うためにライブラリの用意した一時バッファに一旦DMA転送を行います。そののち、転送先のアラインメントによらず一時バッファから転送先へ CPU 転送を行います。また、この一時バッファはしばらく保存されているので、同じ番地を続けざまにリードした場合は一時バッファへの DMA転送が発生しない状況もあります。この場合は CPU転送しか発生しません。

CPU 転送は CARDライブラリの内部スレッドを使用します。従ってスレッドの優先度によって読み込みが完了するまで本関数から返ってこないという場合もあり得ます。このスレッドについては CARD_GetThreadPriority() の説明を参照してください。

参照

CARD_ROM_PAGE_SIZE, CARD_LockRom, CARD_ReadRom, CARD_TryWaitRomAsync, CARD_WaitRomAsync, CARD_GetThreadPriority

履歴

2010/05/04 動作モードとROM形式によるDMA転送/CPU転送の説明を追記
2008/11/19 DMAチャンネルの指定範囲について動作モードとの関連を追記
2008/01/24 DMAチャンネルの指定範囲について追記
2006/05/10 転送先範囲が32バイトアラインメントされていないとDMA転送されないように仕様変更
2005/08/22 [内部動作] の項を大幅に修正
2005/06/01 コールバックが割り込みハンドラから呼び出される旨を補足
2005/04/28 DMAチャンネル0が指定できない旨を追記
2004/12/09 記述修正 「IOプロセッサ」→「ARM7プロセッサ」
2004/11/02 引数名をヘッダファイルと同一に訂正
2004/07/28 コールバックの型を修正
2004/07/19 内部動作説明の変更
2004/07/09 関数形式の変更による記述の修正 / 内部動作説明の追加
2004/07/05 初版