2017-10-27 11 views
0

Ich möchte RTOS besser verstehen und begann daher mit der Implementierung eines Schedulers. Ich möchte meinen Code testen, leider habe ich momentan keine HW herumliegen. Was ist ein einfacher Weg, so zu tun, als führe man eine ISR aus, die dem Timer in C entspricht?Simulieren Sie einen Hardware-Timer-Interrupt in C

EDIT: Dank der Antwort von Sneftel konnte ich einen Timer-Interrupt simulieren. Der folgende Code wurde von http://www.makelinux.net/alp/069 inspiriert. Das einzige, was mir fehlt, ist es, es in einer verschachtelten Weise zu tun. Wenn also der ISR läuft, würde ein weiterer Timer-Interrupt eine neue Instanz des ISR verursachen, die den ersten vorwegnimmt.

#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; 
} 

Antwort

0

Die nächste Sache in POSIX Begriffe ist wahrscheinlich Signalhandler; SIGALRM wird asynchron innerhalb des Prozesses ähnlich wie eine ISR ausgelöst. Es gibt jedoch erhebliche Unterschiede in der Sicherheit, weshalb ich mit der Analogie nicht zu weit gehen würde.