2020年1月19日アトミックとは、原子という意味の「アトム」に由来するソフトウェア用語です。ある操作がアトミックであるといえば、その操作は分かつことができないという意味になります。操作の不可分性をうまく言い表している用語だと思います。組み込みプログラマーは誰もが、この用語を使うかどうかはともかく、心のどこかでアトミック性というものを意識しておく必要があります。割り込みという名の悪魔が、あなたを混乱に陥れるチャンスを常に狙っているからです。操作のアトミック性を特に意識しなければならないのは、絶えず動いている値を抜き取ってくるとき、あるいはそれに変化を加えるときです。次の例を見れば、この種のバグがいかにレアで、再現が困難なものであるかがご理解いただけると思います。値を抜き取ってくるとき絶えず動いている値の簡単な例として、時刻のことを考えます。あるプログラムでは、時刻情報として次のような構造体を使っているものとします。常に現在時刻を格納しています。開発環境では、次のような極めて単純な操作が、アトミックにはなりません。1命令で成し得る操作ではないからです。この操作がアトミックでないとどうなるか。運悪く時刻の変わり目に当たると、バグになります。0011時59分でも12時00分でも問題がないのに、よりによって11時00分という値が取れてしまいました。ソースコード上では1行でも、このようなことが起こるのです。私の職場ではこれをデータの「泣き別れ」と呼んでいました。名前が付くぐらい、恐れられているということです。値に変化を加えるときビット操作も、アトミックでない操作の典型です。命令レベルでは少なくとも次の操作に展開されるからです。値を読むビットを変化させる値を書き戻すこのことは、出力ポートの上げ下げで問題になる場合があります。あるレジスタのビットを立てようとするのと同時に、運悪く他のタスクが別のビットを立ててしまったときなどです。これも、滅多に起きないからこそ恐ろしいバグの一つです。弱者の義務あるタスクから見て値が絶えず動いているということは、それは自身より優先度の高いタスクによって書き換えられているか、ペリフェラルのレジスタであるかのどちらかです。ここに一つのポイントがあります。アトミック性を意識しなければならないのは、常に割り込まれる側、つまり弱者の側であるということです。今あなたの書いているコードが強者の側なら、これに対して打てる手はありません。対策アトミック問題の対策については、問題領域によって取るべき手段が異なるため、とてもここに書き切れるものではありませんが、比較的単純なものをここでご紹介します。二度読み値を単に抜き取るだけなら、この対策が最もシンプルです。二度読みとは、厳密には「二連続一致するまで読み続ける」ということです。これだけで泣き別れは防げます。値を書き戻すケースでは、この対策が最もシンプルかつ確実です。アトミックでない操作を「割り込み禁止」と「割り込み許可」で挟めば済むからです。この割り込み禁止区間がシステム全体として許容されるかについては、十分に検討を重ねてください。許される限り、私はこの方法を強くお勧めします。これ以外の方法はどれをとっても複雑で、万人には理解しがたい代物だからです。割り込む側と割り込まれる側がいるから、問題が発生するわけです。実用上の支障がないなら、処理するコードを移動して優先度の差をなくすことで、この問題を排除することも選択肢の一つです。割り込み禁止はかけられない、優先度も変えられないとなると、次に取り得る手段がこれです。これはとても一言では語れない話なので、いずれ別記事にします。次の操作は、アトミックではありません。うっかりすると間に割り込まれてバグの原因になりますのでご注意ください。ビット操作ビット演算子はとにかく怪しいと覚えてください。0x04;インクリメント・デクリメント簡潔に書けるので見逃しがちですが、アトミックではありません。式の評価も、時には牙をむきます。間に割り込まれてバグを出したことがあります。次の操作は一般にアトミックであると考えられますが、クリティカルな局面では、念のため展開された命令コードをご確認ください。いずれかで、単一の変数であれば、その初期化や代入はまずアトミックであると考えられます。64ビットのロード・ストア命令を備えています。ビット操作のためのレジスタが二重に用意されている場合があります。セット用とクリア用です。0x02;このようなレジスタであれば、ビット操作は単なる値の代入に還元されますから、アトミックとなります。この種のレジスタにビット演算子を適用している例をよく見かけますが、非常に発見困難なバグの原因になりますので、ビット演算ではなく代入を使うよう、くれぐれもご注意ください。模倣するクラス設計の技法の一つに、インタフェースと呼ばれるものがあります。イディオムと呼ばれるテクニックがあります。AMアトミック性について、ここまで明示している記事を初めて見ました。組み込みにおけるこの問題については、もっとクローズアップされてもいいと思います。AMコメントありがとうございます。組み込み業界には、常識レベルなのに体系化されていない知識が結構あるように思います。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。