こんばんは。小坂です。 >ひやしたさんのアドバイスをみてふと気づきましたが、最初に問題を提起したプログ >ラムで、5msecの割り込み中で0.1msecの割り込みを許可していますが、許可をする前 >に、5msecの割り込み要因をクリヤしておかないと、0.1msecからの復帰後、5msecの >割り込みがまだ立っていますから、再度5msecの割り込みの頭から実行していたので >はないかと思いまして、 >#別ないいかたをします。(蛇足、蛇足) >割り込み二種類があります。 >割り込みA,Bです。 >Aが動作中にBを割り込ませるばあい、 >Aの処理が始まったら、絶対にAへの割り込み許可フラグは >リセットして、割り込みを動作しないようにしましょう! >さもないと、Bが終了したあと、Aの処理分岐箇所に戻る代わりに、 >なんと、Aがあたかも今割り込まれて実行してるかのように >振舞い、先頭から処理が再開されて、ややこしいっすよ。 この2つの表現は正確でないような気がします。 割り込みルーチン起動後,CPUの割り込み許可(CCRのIクリア,「EI」とかかれていました)の前にClear IMFAをやっておくとうまく動いているようですね。 割り込みはIMFAの立ち上がりエッジで起こっているわけでなく,highレベルで 起こるようです。(推測です) もしClear IMFAをこの関数の最後に書いておくと,CPUの割り込み許可(CCRのIクリア)を実行した直後に自分自身の割り込みがかかってしまうことになります。(「0.1msecからの復帰後」「Bが終了したあと」ではありません) これは二重タイマ割り込みとは関係ない話です。試しに,0.1msecの割り込みを最初から起こらないようにしておいて,Clear IMFAを「5msecの割り込み関数」の最後に書いて実行すると,CPUの割り込み許可(CCRのIクリア)直後に自分自身が割り込んで,なにも作業をしないのが観測されると思います。 ちなみにUIビットを用いたプログラムの時(SYSCR.BIT.UE=0),うまくいったのは,CCRのIクリアではなく,CCRのUIをクリア(「EI1」とかかれていました)していたために,プライオリティレベルの低い自分自身は割り込めなかったからだと解釈できると思います。 私もよい勉強をさせていただきました。感謝! **************************************************** 〒193 0997 八王子市椚田町1220-2 東京工業高等専門学校 情報工学科 小坂敏文 phone0426-68-5199 Fax68-5098