中断的概念:指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网上有许多产品团购,便宜有口碑
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)