2017-02-16 15 views
1

より一般的なスクリプトでdelay_ms()またはsleep()のような関数と同様に動作させるMicroblazeでタイマーを作成する最も良い方法は何ですか?Microblazeでタイマーを設定していますか?

簡単に、私はこのような愚かな機能を作成することができます実際に私はそれが機能は私がすることができている必要がありながら、

void delay_ms(int i) { 
    //mind that I am doing this on the top of my head 
    for(delays=0; delay<(i*((1/frequency of the device)/2)); delays++) { 
    } 
} 

を...しかし、それが終了するまで、それが唯一のプロセッサのプロセスは何もないでしょう一定の期間、あるプロセスを停止し、別のプロセスは引き続き停止します。

このようなことは可能ですが、疑いはありませんが、この問題の最も単純な解決策は何でしょうか?

(Iは、Spartan-3Aを使用していますが、私は解決策は同様に、異なるキットのためのFPGAを働くだろうと信じています。)

+0

これは中断やシグナルによって行うことができますが、プロセッサをどのようにプログラムするかによって異なります。どのオペレーティングシステムを使用していますか? – purplepsycho

+0

、まったくありません。私はすべてを可能な限り軽くしようとしています。 –

+0

どのように複数のプロセスを実行しますか? – purplepsycho

答えて

2

TL; DR

FreeRTOSのように、マイクロOSを使用してください。

悪い答え

さて、あなたは何のOS、ないタスク整流を持っていないが、外部タイマーを持っている場合、あなたは 次のアプローチを使用することができます。

お使いのハードウェアタイマの割り込みを有効にし、管理しますこのinterrutionによって駆動カウンタ:

あなたは

/**timer.c**/ 

/* The internal counters 
* each task have its counter 
*/ 
static int s_timers[NUMBER_OF_TASKS] = {0,0}; 

/* on each time tick, decrease timers */ 
void timer_interrupt() 
{ 
    int i; 
    for (i = 0; i < NUMBER_OF_TASKS; ++i) 
    { 
     if (s_timer[i] > 0) 
     { 
      s_timer[i]--; 
     } 
    } 
} 

/* set wait counter: 
* each task says how tick it want to wait 
*/ 
void timer_set_wait(int task_num, int tick_to_wait) 
{ 
    s_timer[task_num] = tick_to_wait; 
} 

/** 
* each task can ask if its time went out 
*/ 
int timer_timeout(int task_num) 
{ 
    return (0 == s_timer[task_num]); 
} 
のようなものを持っている必要があります

/**task-1.c**/ 

/*TASK ID must be valid and unique in s_timer */ 
#define TASK_1_ID 0 

void task_1() 
{ 
    if (timer_timeout(TASK_1_ID)) 
    { 
     /* task has wait long enough, it can run again */ 

     /* DO TASK 1 STUFF */ 
     printf("hello from task 1\n"); 

     /* Ask to wait for 150 ticks */ 
     timer_set_wait(TASK_1_ID, 150); 
    } 
} 

/**task-2.c**/ 

/*TASK ID must be valid and unique in s_timer */ 
#define TASK_2_ID 1 

void task_2() 
{ 
    if (timer_timeout(TASK_2_ID)) 
    { 
     /* task has wait long enough, it can run again */ 

     /* DO TASK 2 STUFF */ 
     printf("hello from task 2\n"); 

     /* Ask to wait for 250 ticks */ 
     timer_set_wait(TASK_2_ID, 250); 
    } 
} 

とスケジュール(ここでは大きな単語)タスク::私が思う

/** main.c **/ 

int main() 
{ 
    /* init the program, like set up the timer interruption */ 
    init() 

    /* do tasks, for ever*/ 
    while(1) 
    { 
     task_1(); 
     task_2(); 
    } 
    return 0; 
} 

あなたはタイマーのようなものを持っていたら

プログラムのタスク、(上記のコードは簡単にperfectibleです)私が記述したことは、真剣に使われるべきではない不自由な解決策です。

私が与えたコードは、タスクが実行するために減速するとなった場合に何が起こるかのように、問題がいっぱいです...

代わりに、あなた--could--は非常にあるFreeRTOSのように、いくつかのRT Oを使用する必要がありますこの種の問題に役立ちます。

+0

ソリューションは実際には本当にスマートです。問題は私がそれで無限の量の仕事をしているかもしれないということだけであり、私はそれで多くの手直しが必要です。 –

+0

OS(OSi?)は実際に私がやっていることにとってかなり重いので、無視する方がずっと簡単ですが、無視する方がいいです。 –

+0

"ソリューションは実際には本当にスマートです。"ありがとうございました – purplepsycho

関連する問題