しゃけなべいびー雑多

シャケについて真剣に語ります(嘘)

C言語 グローバル変数に気をつけよう

おはようございます。こんばんは。こんにちは。

 

最近、なぜかビット演算しているのに値がたまに変わらなーい。って、騒いでいた若手がいたので、原因を備忘録。

 

原因は、割り込み中とメインループで平然とグローバル変数を共有してた点ですね。メインループでビット演算してる時に割り込み発生して、割り込み処理中もビット演算していたためです。

 

C言語上は、ビット演算一行ですが、実際の実行ステップ数が1とは限りません。

アセンブラに直してみるとよくわかります。

メインループでビット演算中(演算対象の値をレジスタに入れた後)に割り込みが発生してそこでもビット演算した。その後、メインループに戻ってきてビット演算の続きを実行するが、この時は、レジスタの値を見るので割り込みで実施したビット演算がなかったことになってしまった。という、話。

 

まあ、違うタスクで色々なグローバルなメモリの値を参照変更するなら、割り込み禁止とか、色々と対策が必要になるのでちゃんと考えようということですね。

動いちゃったらからまあいいや-。から、一歩抜け出そう! 

 

では、シャケなベイビー!!

はじめて読む8086―16ビット・コンピュータをやさしく語る (アスキーブックス)

はじめて読む8086―16ビット・コンピュータをやさしく語る (アスキーブックス)