0

私はARMマイクロコントローラープログラミングの初心者で、次の問題を解決する必要があります。

  1. プログラムにはISR_TimerISR_Bufferの 2 つの ISR があります。ISR_Timer は 5 分ごとに実行されます。ISR_Buffer は、外部デバイス バッファがいっぱいになるたびに実行されます (1 秒間に数回)。外部デバイス バッファは小さいものです。
  2. ISR_Bufferは、外部 SRAM からバッファを満たすデータを受け取ります。SRAM には 2 つの大きなバッファがあります。1 番目は現在使用されており、2 番目は再計算に使用されています。次に、それらが交換されます。
  3. ISR_Timerは、 main()が外部 SRAM の 2 番目のバッファーを再計算することを示すフラグを設定します。その後、ISR_Buffer はそのバッファーを使用します。最初のものは、次の再計算に使用されます。再計算には約 1 分かかります。

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

井出: IAR. チップ: AT91SAM7。

4

1 に答える 1

1

私の理解が正しければ、循環バッファを使用できます。正しく実装されていれば、アトミックな書き込みと読み取りが保証されます。

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

于 2011-12-21T15:50:28.580 に答える