在C中模拟硬件定时器中断

时间:2017-10-27 20:14:38

标签: scheduler interrupt rtos simulate isr

我想更好地理解RTOS,因此开始实现调度程序。我想测试我的代码,但不幸的是我现在没有硬件。在C中假装执行与定时器相对应的ISR的简单方法是什么?

编辑:由于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;
}

1 个答案:

答案 0 :(得分:0)

POSIX术语中最接近的可能是信号处理程序; SIGALRM在进程中以异步方式异步触发,与ISR非常相似。尽管如此,在安全方面存在显着差异,所以我不会对这个类比做太多。