2017-10-27 19 views
0

私はRTOSをよりよく理解したいので、スケジューラの実装を開始しました。私は自分のコードをテストしたいが、残念ながら私は今のところHWがありません。 Cでタイマーに対応するISRを実行するふりをする簡単な方法は何ですか?Cでハードウェアタイマ割り込みをシミュレート

EDIT: Sneftelのおかげで、私はタイマー割り込みをシミュレートできました。以下のコードは、http://www.makelinux.net/alp/069からインスピレーションを受けています。私が紛失しているのは、ネストされた方法でそれを行うことだけです。したがって、ISRが別のタイマー割り込みを実行している場合、ISRの新しいインスタンスが最初の割り込みを先取りします。

#include<stdlib.h> 
#include<stdio.h> 
#include<assert.h> 
#include<signal.h> 
#include<sys/time.h> 
#include<string.h> 

#ifdef X86_TEST_ENVIRONMENT 
void simulatedTimer(int signum) 
{ 
    static int i=0; 
    printf("System time is %d.\n", i); 
} 
#endif 

int main(void) 
{ 
    #ifdef X86_TEST_ENVIRONMENT 
    struct sigaction sa; 
    struct itimerval timer; 
    /* Install timer_handler as the signal handler for SIGVTALRM. */ 
    memset (&sa, 0, sizeof (sa)); 
    sa.sa_handler = &simulatedTimer; 
    sigaction (SIGVTALRM, &sa, NULL); 
    /* Configure the timer to expire after 250 msec... */ 
    timer.it_value.tv_sec = 0; 
    timer.it_value.tv_usec = CLOCK_TICK_RATE_MS * 1000; 
    /* ... and every 250 msec after that. */ 
    timer.it_interval.tv_sec = 0; 
    timer.it_interval.tv_usec = CLOCK_TICK_RATE_MS * 1000; 
    /* Start a virtual timer. It counts down whenever this process is executing. */ 
    setitimer (ITIMER_VIRTUAL, &timer, NULL); 
    #endif 

    #ifdef X86_TEST_ENVIRONMENT 
    /* Do busy work. */ 
    while (1); 
    #endif 
    return 0; 
} 

答えて

0

POSIX用語で最も近いのはおそらくシグナルハンドラです。 SIGALRMは、ISRとほぼ同じ方法でプロセス内で非同期的に起動されます。しかし、安全なことには大きな違いがあります。だから私はあまりにも類推しすぎることはありません。