自作タイマ関数で時々起動しない時がある

他のスレッドで「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()が実行されるという仕組みですが

どうやらたまに実行されない場合があるということで、なにが原因なのか思案しています

アドバイスお願いできませんでしょうか?

  • In reply to IKUZO:

    > ライブラリとハードウェアをあてがわれ作成するような場合....

    状況は悲惨...なんとか工夫して乗り越えたいところですね。
    タイマを使用しての工夫、シンプルに実現できることを期待します。

    > ちょっと一発予約を入れて、割り込み終了、後で目的の関数が実行....

    後で目的の関数を実行できるくらいなら、無理に割り込み内で実行しなくともメインループ側で実行できるのでは。
    割り込みがトリガならそこで旗立てて、メインで旗チェック、旗下ろして(例の遅い処理を速く改造した)関数を実行。とかね。
    ほんの思いつきなので、適切かどうかわかりません。

    > マルチタスクOS...

    ここ十数年間、OSは使ってないですし、ほぼ忘れました。メインループを速く回す疑似マルチタスク手法がメインです。
    各種割り込みが稼働し、CPUが暇な状態のメインループのループ時間は数μs~数十μs、忙しい処理状態でも数十μs~数百μs(100側に近い)程度です。
    CPUクロック、ソフト規模にもよりますが、メインループが1ms(近く)超えは、私の作成物の中ではアウトのつもりです。

    > 割り込み中で処理するのは、きっと他の割り込みを阻害するので良くありませんよね。

    割り込み処理は極力短く。が原則です。
    処理が長かったり、他の割り込みを阻害....ぐちゃぐちゃになるのは嫌いですよね。

    近くの龍潭寺に竜宮小僧はいるかな
  • In reply to LEON:

    LEONさん
    貴重な経験ありがとうございます、「メインループのループ時間は数μs~数十μs、忙しい処理状態でも数十μs~数百μs(100側に近い)程度です。」や素晴らしい、私もそれに近ずくように努力いたします。