2016-10-31 19 views
0

私は自分のデザインを追跡するのに多くの時間がありますが、何も超重大ではありません。 10ms +/-数ミリ秒は大したことではありません。しかし、同時に異なる時間にカウントされる10種類のタイマーがあるかもしれません。明らかに、私はMSP-430の独自のタイマーでそれぞれのタイマーをサポートするのに十分なタイマーを持っていません。マイクロコントローラの時間のためのグローバルタイマー割り込み

私の解決策は、1 KHzで発生するMSP-430マイクロタイマーのための単一のISRを作成することです。各ISRエントリの符号なしロングをインクリメントします(各ティックは1ミリ秒です)。私のコードのどこかで、以下のSET_TIMERとEXPIRED定義呼び出しを使用して、一定の時間が経過したかどうかを確認することができます。私の質問は、これは「グローバル」な時間を保つ良い方法ですか?

タイマーの定義:

typedef unsigned long TIMER; 
extern volatile TIMER Tick; 
#define SET_TIMER(t,i) ((t)=Tick+(i)) 
#define EXPIRED(t) ((long)((t)-Tick)<0) 

タイマー割り込みサービスルーチン:

void TIMER_B0_ISR(void) 
{ 
    Tick++; 
} 

使用例1つのファイルに:

case DO_SOMETHING: 
    if (EXPIRED(MyTimer1)) 
    { 
     StateMachine = DO_SOMETHING_ELSE; 
     SET_TIMER(MyTimer1, 100); 
    } 
    break; 

case DO_SOMETHING_ELSE: 
    if (EXPIRED(MyTimer1)) 
    ... 

答えて

1

あなたのスキームは、タイマーのラップアラウンドを確認するのに比較的高価です - あなたがしていないように、現時点では(あなたはそれが "時間切れ"をチェックするすべての場所でチェックする必要があります - 唯一のそのような場所)。

私は通常、最も早く期限切れになるタイマーとして、リストの先頭にタイマー満了エントリのソート済みリンクリストを使用します。 ISRはこの単一のエントリをチェックするだけで、その単一のサブスクライバに直接通知することができます。

+0

これは素晴らしいアイデアのようですね!あなたはその事例を持っていますか? – Russell

+0

@Russellこれは商用コードです。申し訳ありませんが、チャンスはありません。 – tofro

関連する問題