2013-01-21 12 views
5

私は組み込みシステム(Cortex M0)用のコードを書いていますが、mutexes/spinlocks/etcのすべての贅沢を持っているわけではありません。私のMain()ループからディスクにフラッシュされる共有バッファ(ログファイル)にデータを追加する簡単な方法はありますか?割り込み保護されたバッファ

単一のプロデューサ(1つの割り込み)と単一のコンシューマ(メインループ)がある場合は、プロデューサが「ヘッド」を増加させ、消費者を「テール」とする単純なバッファを使用できます。そしてそれは完全に安全です。しかし、今私は複数のプロデューサー(割り込み)を持っているので、私は固まっているようです。

私は各割り込みに独自のバッファを与え、Main()でそれらを組み合わせることができますが、これには余分なRAMと複雑さが必要です。

+0

リンク先のランタイムライブラリはありますか?たぶんそれは "原子"関数を含んでいますか?または、そのような関数/ライブラリがない場合、CPUはアトミックに値を比較し、増減する命令を持っていますか?これらはセマフォやmutexの独自の実装に使用できます。 –

+0

@JoachimPileborgこれはNXP LPC11U35 CPUであり、RedLibライブラリとリンクしています。これは私が知っている限り原子的機能を提供していません。 – Muis

+0

私はこのシステムの割り込み構造に精通していません。しかし、同じ優先順位のあなたの割り込みですか?いずれにしても、バッファ用にスタックを使うことができるようです。または、このソリューションでスタックオーバーフローの問題を見越してもらえますか? –

答えて

5

単純なring buffer(円形配列)で実装することができます。ここでは、アクセス中にハードウェア割り込みソースをオフにします。 init、add、removeの関数のみが必要です。

特定のMCUがどのように割り込みを処理するかはわかりませんが、特定のハードウェアペリフェラルの割り込みのみを有効/無効にしている限り、それらは保留されたままになります。アプリケーションの性質によっては、グローバル割り込みマスクを無効にすることもできますが、それはやや粗悪です。

一般的に、着信割り込みを処理するコードが割り込み頻度よりも遅い場合、世界中のソフトウェアで修正されることはないため、割り込みを逃してしまう心配はありません。このようなシナリオを回避するには、データ損失を受け入れるか、CPUクロックを増やす必要があります。もちろんISRのコードをできるだけコンパクトに保つ​​ようにしてください。

+0

単一のプロデューサ/単一のコンシューマの場合、プロデューサがヘッドポインタのみを移動し、コンシューマがテールポインタのみを移動する限り、割り込みを無効にするか、アクセスをロックする必要はありません。 – Lou

+0

@Louアクセスがアトミックでない限り、これは正しくありません。ここではそうではありません。 – Lundin

+0

@ Lunding:アトミックではないものへのアクセス?一つの割り込みは変数への書き込みであり、もう一つの割り込みは変数への書き込みです。 Cortex M0のような32ビットプロセッサでは、部分的な32ビットの書き込みや読み出しができるとは思いません。 – Lou

関連する問題