【问题标题】:Timer interrupt in CC中的定时器中断
【发布时间】:2013-04-16 12:31:49
【问题描述】:

我必须编写一个关于定时器中断的 c 文件。程序将在 DosBox 上运行。 程序的特点很简单:

程序为每个定时器中断调用一个函数(由我输入)。这些中断将使用 setvect 和 getvect 函数进行编程。

例如,如果我有一个 c 代码在没有任何睡眠或延迟功能的情况下每秒打印一次“Hello world\n”到屏幕上,那就太好了。我的意思是打印“hello world”的代码必须在函数并且对于每个中断程序都必须调用这个函数。

很难找到这个案例的例子,你能转发任何例子链接吗?谢谢大家的帮助。。

【问题讨论】:

  • 除非您制作保护模式程序,否则您必须使用BIOS
  • 已经有一段时间了,所以我只记得这种工作造成的痛苦,但是this free bookchapter 27 谈到了TSR,并且应该包含您需要的大部分信息。祝你好运:-)

标签: c interrupt dos dosbox


【解决方案1】:
#include<signal.h>
#include<sys/time.h>
#include <unistd.h>
#include <assert.h>
#include <stdio.h>

#define PERIOD 999999
static sigset_t block ;
void timer_handler ();

static void init( ) __attribute__((constructor));
void init(){
    sigemptyset(&block);
    sigaddset(&block,SIGVTALRM);

struct sigaction act={0};
struct timeval interval;
struct itimerval period;

act.sa_handler=timer_handler;
assert(sigaction(SIGVTALRM,&act,NULL)==0);

interval.tv_sec=0;
interval.tv_usec=PERIOD;
period.it_interval=interval;
period.it_value=interval;
setitimer(ITIMER_VIRTUAL,&period,NULL);

    
}

void timer_handler(int sig){
write(1,"Hi\n",3); 


}
int main(){
  while(1);
  return 0;
}

【讨论】:

  • 你好,谢谢你的回答!请您在回答任何其他问题之前查看how to answer,并相应地修改此当前答案。享受您在 SO 的住宿!
  • 效果很好! ...如何(以编程方式)停止它?
  • /replies to self : 同样的,只是将句点设置为 0
【解决方案2】:

只是一个建议。

一般来说,最好不要在中断中使用像打印这样的功能。在您的情况下,因为您的代码很简单,所以这并不是一个真正的问题,但是如果您在中断上花费大量时间,您可能会在更复杂的程序上遇到一些优先级问题......

【讨论】:

  • 上面的例子对我来说不是必需的。我只是想看看示例代码的过程。我的工作当然更复杂,但首先我必须分析一个调用我键入的函数的代码每次中断。因为我没有做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多