[H8-ML(2131)] RE: [H8-ML(2130)] Re: IRQ割り込みについて
From: "Norio Onda" <n.onda@xxxxxxxxxxxxxxxxxxx>
Date: 2002年08月09日(金)08時36分36秒
TANAKAさん、こんにちは。

> >ご指摘のとおりISRを「空読み」してみたらうまくいきました。ありがとうございます。
> >確かにマニュアルに読んでから0を書き込むとなっているんですね。
> >マニュアルの言葉の重さを思い知らされました。
> >でも、一体どういうロジックになっているんだろう?...
> 
> このケースのように単一のビットを操作する場合は
> ビット操作命令を使うのが便利です。
> ビット操作命令は、対象とするバイトを読み出し、ビット操作を施し、
> 必要ならバイト毎書き込む、という流れになります。
> これはバイト単位で読み出してビット操作をして…という
> ビット操作命令に拠らない方法でも同じことです。
> で、このときbit0をクリアしようとしているときに
> bit1が立ったらどうなるかを考えてみてください。
> [byte読出] -> (bit1が立つ) -> [bit0を0に] -> [byte書込]
> となると読み出したbyteはbit1が立つ前のものですので0になってます
> これを書き込んだ時にもしbit1が0になってしまったら、
> プログラムはbit1が立ったという事実を知ることができませんが、
> H8の仕様ならbit1の1をまだ読み出していませんから0は書き込まれません。
> また
>  (bit1が立つ) -> [byte読出] -> [bit0を0に] -> [byte書込]
> だとしたら、bit1は読み出されていますが1が書き込まれますから1のままです。
> とまぁこのように、安全にビット単位の処理ができるようにこのような仕様に
> なっている、というわけですね。
 なるほど、安全にビット単位の処理を行うための仕掛けだったんですね。
私はだたクリアすることしか頭になかったので、フラグを調べるということを
全く考えておりませんでした。このような仕様なら、フラグが1になったのを
読みそこなうことがないわけですね。また、フラグのクリアを転送命令で
フラグを読み出し、ただ0を書き込んでいただけなので、ビット操作命令
で書いてみます。(プログラムも短くなりますね)

ありがとうございました。

-----------------------------
恩田紀雄
n.onda@xxxxxxxxxxxxxxxxxxx
スレッド概略
[2127(R)](起点)
 └[2130(U)]
   └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]