プロセッサ用の SD カード SPI ドライバを作成しています。私は SPI ドライバーが優れていることを知っています。なぜなら、私はそれを LCD にも使用しており、今までは楽しくコマンドをカードに送信していたからです。ある特定のトランザクションで問題が発生していますが、これは他のトランザクションと何ら変わりはありません。
SPI バスにデータを書き出すと、受信と送信が完了したことを示す割り込みコールバックを待ちます。a の次のブール値フラグstruct
を trueに設定する 2 つのコールバックがあります。
m_transaction_status.sdts_rx_complete
m_transaction_status.sdts_tx_complete
通常のプログラム フローでは、これらのフラグが設定されるのを待ってから続行します。
while ((m_transaction_status.sdts_rx_complete == false) //
|| (m_transaction_status.sdts_tx_complete == false))
{
// Check whether we've had an error.
if (m_transaction_status.sdts_error == true)
{
LOG_ERROR(SD::MODULE,
"transfer_data: Transaction error.");
transfer_status = false;
break;
}
}
問題のトランザクションでは、コールバックにブレークポイントを設定し、両方のフラグが設定されていることを確認できますが、通常のフローに戻ると、変数が突然使用できなくなりfalse
、ループに永遠に閉じ込められたように見えます。このループは、他のすべてのトランザクションで問題なく使用されます。
これらの変数が設定されているのに、(どうやら) クリアまたは割り当て解除されているか、またはその他の不都合な理由について調査できる理由はありますか?
編集:
割り込みは確かにマイクロのものです(正確にはRenesas RL78)。
構造体宣言は次のとおりです。
/**
* The state of an SD SPI transaction.
*/
struct SDTransactionStatus
{
/** Transaction error flag. */
bool sdts_error;
/** Transmission completion flag. */
bool sdts_tx_complete;
/** Reception completion flag. */
bool sdts_rx_complete;
};
は、クラスstruct
のプライベート メンバーとして実装されます。SD
フラグは、コールバックの単純なセッター関数を介して設定されます。