Timer使用的需要注意的地方及解决方法
1.Timer超时函数,在处理的时候是通过软中断实现,即处理函数是在中断上下文去实现的,而中断上下文:第一:不充许sleep; 第二不允许schedule. 如果有类似的操作,都将可能发生错误及crash问题。
2.有时候一些功能需要在超时函数中做一个sleep或者等待一些信号号或者一些资源,那么就需要一种解决方法,去处理这些情况。
3.处理这个情况的方法:第一:设置一个flag,然后用一个线程去poll,这样来做,显然是比较耗费资源的;第二: 满足其资源,进而不在处理函数中等待资源,显然这样很难实现及代价很大。第三种:用schedule_work去实现,这种情况比较好,可以节省poll资源和持有信号量,又可以去sleep或schedule.
Schedule_work:
1、定义structwork_struct wq_queue;
2、初始化INIT_WORK(&wq_queue,do_handle_queuework);
3、调用方法:schedule_work(&wq_queue);
Note:调用完毕后系统会释放此函数,所以如果想再次执行的话,就再次调用schedule_work()即可。可以在do_handle_queuework中做任何事件,只要逻辑没问题,什么都可以。
4.还有一个schedule_delayed_work(&wq_queue,delay_jiffies),就是延迟jiffies*N去处理。在linux中的底半部处理,这就是其中的一种处理方法。把工作推后,交给一个线程,而这个线程总是工作在进种上下文,因此,这可以很方便的持有信号量,也可以睡眠。