2011-12-21 3 views
0

私はARMマイクロコントローラプログラミングの初心者であり、解決すべき次の問題があります。 ISR_TimerISR_BufferISRとmain()の同期を実装する方法は?

  1. は、プログラムに2つのISRのがあります。 ISR_Timerは5分ごとに実行されます。 ISR_Bufferは、外部デバイスのバッファを埋める(毎秒数回)必要があるたびに実行されます。外部デバイスバッファは小さいものです。
  2. ISR_Bufferは、外部SRAMからのフィルバッファにデータを取り込みます。 SRAMには2つの大きなバッファがあります。最初は現在使用され、2番目は再計算に使用されます。それから彼らは交換されます。
  3. ISR_Timerは、のメイン()が外部SRAMの2番目のバッファを再計算することを示すフラグを設定します。その後、ISR_Bufferはそのバッファを使用します。最初のものは次回の再計算に使用されます。再計算には約1分かかります。

問題は、両方のメイン()とISR_Bufferアクセス​​、外部SRAM、それらのアクセスアトミックではないということです。 main()関数は、バッファの再計算中にSRAMにデータを書き込みます。 ISR_Buffersは小さなデバイスバッファを満たすためにデータを読み取ります。この問題を解決するには?

IDE:IAR。 チップ:AT91SAM7。

+0

はこの宿題ですか?もしあれば、宿題にタグを付けてください。 –

答えて

1

私が正しく理解している場合は、cyclic bufferを使用できます。正しく実装されているので、原子の書き込みと読み取りを保証します。

または、バッファ操作中に割り込みをマスクして、ISRにデータへのアクセスがないようにすることができます。main()しかし、これらの操作は高速でなければなりません。そうしないと外部デバイスがバッファアンダーフローを起こします。

関連する問題