この質問は、OSなしで小型マイクロコントローラをプログラミングすることについてです。特に今はPICに興味がありますが、質問は一般的です。
私は時間を保つために次のパターンを数回見ました:
タイマー割り込みコード(タイマーが毎秒起動するとします):
...
if (sec_counter > 0)
sec_counter--;
...
メインラインコード(割り込みなし):
sec_counter = 500; // 500 seconds
while (sec_counter)
{
// .. do stuff
}
メインラインコードが繰り返されたり、カウンターがさまざまな値(秒だけでなく)に設定されたりする場合があります。
sec_counter
メインラインコードのへの割り当てがアトミックでない場合、ここに競合状態があるように思われます。たとえば、PIC18では、割り当ては4つのASMステートメントに変換されます(一度に各バイトをロードし、その前にメモリバンクから適切なバイトを選択します)。割り込みコードがこの途中にある場合、最終的な値が破損している可能性があります。
不思議なことに、割り当てられた値が256未満の場合、割り当てはアトミックであるため、問題はありません。
私はこの問題について正しいですか?このような動作を正しく実装するためにどのパターンを使用しますか?いくつかのオプションがあります。
- sec_counterへの各割り当ての前に割り込みを無効にし、後で有効にします-これはきれいではありません
- 割り込みを使用しないでください。ただし、開始されてからポーリングされる別のタイマーを使用してください。これはクリーンですが、タイマー全体を使い果たします(前の場合、1秒の起動タイマーは他の目的にも使用できます)。
他のアイデアはありますか?