linux内核定时器可以中断其他程序吗

linux内核定时器可以中断其他程序吗,第1张

中断定时器:

中断的概念:指CPU在执行过程中,出现某些突发事件急待处理,CPU暂停执行当前程序,转去处理突发事件,处理完后CPU又返回原程序被中断的位置继续执行

中断的分类:内部中断和外部中断

内部中断:中断源来自CPU内部(软件中断指令、溢出、触发错误等)

外部中断:中断源来自CPU外部,由外设提出请求

屏蔽中断和不可屏蔽中断:

可屏蔽中断:可以通过屏蔽字被屏蔽,屏蔽后,该中断不再得到响应

不可屏蔽中断:不能被屏蔽

向量中断和非向量中断:

向量中断 : CPU通常为不同的中断分配不同的中断号,当检测到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行

非向量中断:多个中断共享一个入口地址。进入该入口地址后再通过软件判断中断标志来识别具体哪个是中断

也就是说向量中断由软件提供中断服务程序入口地址,非向量中断由软件提供中断入口地址

/*典型的非向量中断首先会判断中断源,然后调用不同中断源的中断处理程序*/

irq_handler()

{

...

int int_src = read_int_status()/*读硬件的中断相关寄存器*/

switch(int_src){//判断中断标志

case DEV_A:

dev_a_handler()

break

case DEV_B:

dev_b_handler()

break

...

default:

break

}

...

}

定时器中断原理:

定时器在硬件上也以来中断,PIT(可编程间隔定时器)接收一个时钟输入,

当时钟脉冲到来时,将目前计数值增1并与已经设置的计数值比较,若相等,证明计数周期满,产生定时器中断,并复位计数值。

附上出处链接:http://blog.163.com/baosongliang@126/blog/static/1949357020132585316912/

时事件,void(*handle)(union sigval v)参数就是处理事件的函数指针。

int omsSetTimer(timer_t *tId,int value,int interval)就是设置定时器。

按你说的,如果要同时起多个定时器,需要定义一个数组timer_t tm[n]int it[n]tm就是定时器结构,it用来记录对应的定时器是否已经使用,使用中的就是1,没用的就是0;

主进程消息来了就从it找一个没用的来omsSetTimer,如果收到终止消息,那omsSetTimer 定时时间为0

int omsTimer(timer_t *tId,int iValue,int iSeconds ,void(*handle)(union sigval v),void * param)

{

struct sigevent se

struct itimerspec ts

memset (&se, 0, sizeof (se))

se.sigev_notify = SIGEV_THREAD

se.sigev_notify_function = handle

se.sigev_value.sival_ptr = param

if (timer_create (CLOCK_REALTIME, &se, tId) <0)

{

return -1

}

ts.it_value.tv_sec = iValue

// ts.it_value.tv_sec =3

//ts.it_value.tv_nsec = (long)(iValue % 1000) * (1000000L)

ts.it_value.tv_nsec = 0

ts.it_interval.tv_sec = iSeconds

//ts.it_interval.tv_nsec = (long)(iSeconds % 1000) * (1000000L)

ts.it_interval.tv_nsec = 0

if (timer_settime(*tId, TIMER_ABSTIME, &ts, NULL) <0)

{

return -1

}

return 0

}

int omsSetTimer(timer_t *tId,int value,int interval)

{

struct itimerspec ts

ts.it_value.tv_sec =value

//ts.it_value.tv_nsec = (long)(value % 1000) * (1000000L)

ts.it_value.tv_nsec = 0

ts.it_interval.tv_sec = interval

//ts.it_interval.tv_nsec = (long)(interval % 1000) * (1000000L)

ts.it_interval.tv_nsec = 0

if (timer_settime(*tId, TIMER_ABSTIME, &ts, NULL) <0)

{

return -1

}

return 0

}

另外,团IDC网上有许多产品团购,便宜有口碑


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8927712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存