?????ж??????????????????????ж????????????ж?????????ж?????????????????????????ж?????????????У??????????????????????????????ж????????λ???????Щ???????????????ж??????????????ɡ???????????????????????????°????

?????ж????????????????request_irq??????????ú???????з?????????????????????????ж????????????????????????????е??á?Linux?е??ж??????????????????????????????????ж????????????????????????????ж??????????????ж??????????????????????????ж????????????????????????????ж???ж????????ù????ж??????????????????????????????????

??????????????????????????????????????????????????ж???????????????????????????ж????????????????????ж???????????????????????ж????????ж????????????????ж???????local_irq_save??local_irq_restore?????????????ж?????????disable_irq??????

???????????ж???????cat /proc/interrupts??????ж??????????????????????????irqs_disabled???????????ж????????????in_interrupt????????????ж????????in_irq?????????????????ж???????

?????????????°????????ж???????????????Щ???????????ж??????????У????п?????????????????????????????????ж????????????е??Щ???????????????????ж?????????????У?????????????????ж???????????ж?????????????????????????????ж?????????????ж???????????????????????????????????????ж?????????????????????????????????????????????????

?????°???????????????ж????????????ж????????????е???????ж???????????????????????????ж????????????????????????????????????????????????У???????????????????????ж????????????ж???????????У??????????????°???С??°???е???????????????е??????????????е??ж??

??????2.6???汾?У??°??????????????ж??tasklet????????С?

???????ж?????????????°???????32?????????????????????????У????ж??????????????о?????????????ж???????????????????ж?????ж?????????????У?????????????ж??????????????????ksoftirqd???????У????????????????鴇?????????ж??tasklet??????????????????ж??????????????????????????????Щ????????????????ksoftirqd????????????????Щ?????????д??????????ж??????У?????????????????????SCSI?????????????ж???????????????????????Ч?????????????????????ж???????????

????tasklet???????????ж?????HI_SOFTIRQ??TASKLET_SOFTIRQ??????????????????е?tasklet????????????HI_SOFTIRQ??TASKLET_SOFTIRQ?????????ж??????????tasklet????????????????????????ж??е?????????????ж????????????????????????????tasklet?????????????????????????????????tasklet????С?Tasklet????????????ζ????????tasklet????????????????????????????????????tasklet?????????????ж???????????????????????????ж???????????????????????????tasklet_disable???????????????tasklet????????????tasklet_kill????????????????tasklet??


DECLARE_TASKLET(test_tasklet??test_tasklet_func??0); //????
void test_tasklet_func(void)           //???????
{
 printk("tasklet is executing! ");
}
tasklet_schedule(&test_tasklet);      //????


???????????п??????????????????????????У?????°???????????????????????У????????????????μ???????????????????????????????????е??°????????????????????????????????????????????????????????????????????????????????????????????????????????з?????????????????????????????????С?

????????????????????????????????????????????????????е???????????????????????????????????events/n??????????????????????????????????????????????????????д???????????????????????????????????????????CPU????????????????????????????????????struct cpu_workqueue_struct??????????struct workqueue_struct??????????????????????????й?????????


INIT_WORK(&button_dev->work?? gpio_keys_report_event);  //????
static void gpio_keys_report_event(struct work_struct *work)  //???????
{   
       key_values[0] = '0' ;     //??????????
       input_report_key(channel?? BTN_0?? !!ev_press);  //??input???????水?????
       input_sync(channel);                                //???????
      ev_press = 0;                           //????????
}
schedule_work(&button_dev->work);   //??????????д??????
cancel_work_sync(&button_dev->work);       //???????????


????tasklet????????ж??????????????????????????????????????????????????ù??????У?????????tasklet???????????????????????????????????????local_bh_disable????????°?????local_bh_disable???????????????????е???У???????????в??漰????У????????????ж??tasklet???????????????????????????