作为一个小新手,用低版本内核时间比较久了,如果想把什么东西从2.6.22那种内核里移植过来一般都要重新看看内核怎么写的。我也讲不好理论的东西,知道怎么用就好了。
POLL机制在我看来啊,有点像刚学单片机时候的定时器(可能内部差不多),设置定时的时长,然后让这个应用程序或者硬件休眠,毕竟没有休眠的话,即使一个很简单的程序也能让cpu占用率飙到很高。我今天主要还是讲POLL机制在低版本内核中的实现。下一个帖子会以IO中断的方式把POLL机制加到驱动和应用程序中去。好了,来看看程序和内核把。
首先我们在驱动程序中调用POLL,其实就是在file_operations结构体中,加一个成员.poll
static struct file_operations sencod_drv_fops = {
.owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */
.open = third_drv_open,
.read = third_drv_read,
.release = third_drv_close,
.poll = third_drv_poll,
};
一般这样加到这个结构体中,系统就认为你这个驱动是支持POLL机制的了。
static unsigned int third_drv_poll(struct file *file, struct poll_table_struct *wait)
{
return 0;
}
然后呢,我们要写一个这样东西,让系统能找到poll对应的操作函数,这里先返回0,之后再具体往里面写休眠的程序。
我们来看看应用层和系统里是怎么找到驱动中的POLL的。
在应用程序中我们可以写一个很简单的测试。
ret = poll(fds, 1, 5000);
if (ret == 0)
{
printf("time outn");
}
大概就是让他调用驱动中的POLL,时钟到了5000的时候这个函数的返回值就会等于0,时间到了之后我们就打印一句time out。然后我们来从上层慢慢向下看哈。
内核中我们先找到sys_poll,然后他会执行do_sys_poll(......,timeout_jiffies),前面的参数咱们先不看,后面是poll的延时时间,在往里面看,有个poll_initwait(&table),函数里面主要是构造一个结构体table,然后init_poll_funcptr(&pwq->pt,__pollwait);就相当于让table->qproc =__pollwait
构造好了这个结构体之后,要把他加到内核里面去就是执行do_poll(nfds,head,&table,timeout),里面就是各种累加
if(do_pollfd(pfd,pt))
{
//mask = file->f_op->poll(file ,pwait); 返回值mask
//return mask; 这些是do_pollfd的具体实现
//__pollwait(...,&button_waitq,...); 把进程挂到队列中
count++;
pt = NULL;
}
if(count || !*timeout || signal_pending(current))
break;
这个大概意思就是break的条件,count非0,超时,或者有信号在等待处理的时候。否则呢,就正常休眠。
__timeout = schedule_timeout(__timeout);
如果休眠时间到了_timeout的时间,就从do_poll函数重新执行,重新执行之后会把timeout清零然后再把我们驱动里的当前进程挂到队列里面去,当有中断发生的时候,我们的中断程序再把这个进程从队列中唤醒。
内核中的实现过程基本就是这样,我们来看看驱动中怎么写我们的static unsigned int third_drv_poll(struct file *file, struct poll_table_struct *wait)
我们在里面用poll_wait(file,&button_waitq,wait);把当前的进程挂到队列里面去,像我们刚刚看内核里面写的一样,它不会立即休眠,而是等判断完count是否等于0之后进入休眠。
我们的poll函数里初始化unsigned int mask = 0;
if (ev_press) //ev_press由中断程序置一,由read函数清零
mask |= POLLIN | POLLRDNORM;
return mask;
如果发生中断,mask不等于0,则唤醒休眠进程。
大概说了一下POLL机制,其实我对这个也不是很明白,也是半瓶醋就给别人瞎讲了,如果哪里说得不对,还请各位指正批评。下一个帖子,我本来准备用高电平中断IO的方式写一个GPIO中断加入POLL机制。刚刚问了群里的管理员,应该先结项,写了这么多,和我当初申请开发板写的项目似乎不是很搭边,我准备先把一些心率传感器什么的移植过来,现在有点本末倒置了,我还是希望大家多多支持,POLL机制中断这个话题,我后续会给大家补上,我这几天要看看我那些医疗用的传感器了(哭一会),我感觉结项会很不顺利(预感真的不怎么好),有点压力了,这次就给大家说这些,后续的更新可能会慢一点,我要捡起来之前的传感器了,这里谢谢大家的支持!!
|