他のスレッドで「H8/36094:IRQ0の処理が起動しないことがある」というのを見かけましたが
SH7670で下記のようなソースで自作関数を作成しています
ソースここから→
/////////////////////////////////////////////////////////////////////////タイマを設定するTIME_PROC tproc[]={{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},};BOOL bWaitTimer=FALSE;BOOL WaitTimer(int msec,void (*pc)()){ int i; CMT.CMSTR.BIT.STR1=0;//タイマ停止 for(i=0; i<10; i++){ if(tproc[i].msec ==0){ tproc[i].msec =msec; tproc[i].pc =pc; //1m Sec タイマ開始 if(!bWaitTimer){ bWaitTimer=TRUE; cpu_ms1_start //タイマを開始させるマクロ } CMT.CMSTR.BIT.STR1=1;//タイマ開始 return TRUE; } } //登録できない return FALSE;}/////////////////////////////////////////////////////////////////////////////////////1mSインターバルタイマvoid cmi1_(void){ BOOL flg; int i; void (*pc)(); CMT.CMCSR1.BIT.CMF &= 0; CMT.CMSTR.BIT.STR1=0; flg=FALSE; for(i=0; i<10; i++){ if(tproc[i].msec > 0){ tproc[i].msec--; if(tproc[i].msec == 0){ pc = tproc[i].pc; tproc[i].pc=0; pc(); } } if(tproc[i].msec > 0)flg=TRUE; } if(!flg){ bWaitTimer=FALSE; return; } CMT.CMCSR1.WORD=0; CMT.CMCNT1.WORD=0; CMT.CMCOR1.WORD=1000; CMT.CMCSR1.BIT.CKS=1;//11:Pφ/512 CMT.CMCSR1.BIT.CMIE=1; CMT.CMSTR.BIT.STR1=1; cpu_ms1 ++;}/////////////////////////////////////////////////////////////////////////タイマ関数 end///////////////////////////////////////////////////////////////////////
→ソースここまで、これを使用するには
void test(void)
{
}
に飛ばしたい場合に
WaitTimer(100, &test );
等とすると、100ミリ秒後にtest()が実行されるという仕組みですが
どうやらたまに実行されない場合があるということで、なにが原因なのか思案しています
アドバイスお願いできませんでしょうか?
cmi1_() の中の
CMT.CMCSR1.BIT.CMF &= 0;
は単純に & は不要でしょう。
cpu_ms1_start //タイマを開始させるマクロ
の内容が不明ですが、これが原因である可能性も考えられますね。
Higetakaさん ご丁寧に説明してくださり、一時的に「割り込み禁止」ということだったんですね、 「タイマを停止しても、直前に割り込み要因が成立していれば、 割り込みは発生します。cmi1_関数が実行されるとタイマは再び 動作し始めます。そしてこの後の処理でも割り込みががんがん 発生する可能性があります。タイマ登録した関数の処理時間が 合計で1msを超えれば、数回の割り込みがこの後で発生する かもしれません。」 なるほど、そうですね、この現象が発生するのは、複数登録している場合に限らず発生します、例えば極端にTIME_PROC tproc[]を廃止してシングルにしても不都合が発生するのを確認しています。