?ж?????????????????????????????????????????????????? ?????????????????????????????????????????Linux?У???????????????????????????ж????

????????ж?
????1.????
??????ν?ж????cpu????г????????У????????Щ???????????????cpu?????????е????е???????????????????????????cpu??????????λ?ò???????У??????ж???????ж???????ж?????ж?????ж?????????????ж???ж???????????????ж????????????ж??Linux ???ж???????????????????????????????????????????????????????“????ж?”?????????????????????????豸?????????????????ж??????????????

????2???ж???
????2.1 ?????????ж?
??????1?? ????irq
????int request_irq (unsigned int irq?? irq_handler_t handler?? unsigned long irqflags?? const char *devname?? void *dev_id)
????irq ?????????ж???handler???????????ж?????????irq_flags???ж??????????????????ж????????????????????????????棬IRQF_DISABLED???????ж??????????????????????????????????????????ж??IRQF_SHARED?????????豸?????ж???ж?????????dev_id ???ж????????????????????????豸????????NULL.
??????2?? ???irq
????void free_irq (unsigned int irq?? void *dev_id); ??????????request_irq()???
????2.2??????????ж?
????(1)??????(3??)
????void disable_irq (int irq);
????void disable_irq_nosync (ing irq);//????????
????void enable_irq (int irq);
????void disable_irq_nosync(int irq)??void disable_irq(int irg)?????????????????????????????ж??????
????(2) ?????????ж?
????#define local_irq_save (flags)//???α?cpu????
????void local_irq_disable (void) //???α?cpu?????ж?
???????????ж?????????flags?У?flags?unsigned long???????
????(3?? ????ж?
????#define local_irq_restore (flags)
????void local_irq_enable (void);
??????local???????????÷?Χ???cpu???
????2.3 ???????–???????????tasklet?? ???????к????ж?
??????1?? tasklet
????void my_tasklet_func (unsigned long);
????DECLARE_TASKLET (my_tasklet?? my_tasklet_func?? data);
????/*???????tasklet??my_tasklet?? ??my_tasklet_func(data)?????????*/
????tasklet_schedule (&my_tasklet);
????/*????????????????tasklet???????*/
??????2??????????
????struct work_struct my_wq;
????void my_wq_func (unsigned long);
????INIT_WORK (&my_wq?? (void?????????????????????????????????????Σ??????
????????????????????в??????????????????
????schedule_work (&my_wq);
????/*??????????????*/
????(3) ???ж?????????????ж???????????????ж????????arm??swi?????????????
??????linux????У???softirq_action?????????????ж???????????????ж?????????????????????????????open_softirq()??????????????ж???????????????raise_softirq()?????????????????ж?????ж??tasklet ?????????ж???????????????????????????????????????????????????????????????ж??tasklet????????в????????????????д????????????????local_bh_disable() ?? local_bh_enable()?????????????????????ж??tasklet?????????????
????2.4 ?ж????
????????豸????????ж???????????????й???????????ж?????豸???????ж????????????IRQF_SHARED?????????????豸??IRQF_SHARED????????ж????????????ж?δ?????????ж?????????????????????????ж???豸????IRQF_SHARED????????ж????????????????????????????????request_irq(…??void *dev_id)????????????????????屻?????????????????.
???????ж??????????????????ж???????ж??????????ж??????????У????????????????е????????????dev_id?????ж????????豸???ж?
?????????ж????
????irqreturn_t xxx_interrupt(int irq??void *dev_id??struct pt_regs *regs)
????{
????...
????int status = read_int_status();
????//????ж??
????if(!is_myint(dev_id??status))
????//?ж????????豸
????return IRQ_NONE;
????//??????豸?ж?????????
????//????豸?ж???д???
????...
????return IRQ_HANDLED;
????//????IRQ_HANDLED????ж????????
????}
????...
?????????????/???
????1??????
???????????????????????????????????????????????ж??????????????????????????????????????????????ж?????С?????????У???????????麯???????????????????????????????Щ??????????
??????1) ???timer_list ????????????????????????????£?
????struct timer_list {
????struct list_head entry??
????/*??????б?*/
????unsigned long expires??
????/*????????????*/
????void (*function) (unsigned long)??
????/*????????????*/
????unsigned long data??
????/*???????????????????????*/
????struct timer_base_s *base??
????...
????};
?????綨????????my_timer ????????
????struct timer_list my_timer;
????(2) ??????????
????void init_timer (struct timer_list *timer);
????TIMER_INITIALIZER (_function?? _expires?? _data)
????DEFINE_TIMER (_name?? _function?? _expires?? _data)
????setup_timer ();
????(3) ????????
????void add_timer (struct timer_list *timer);
????(4) ????????
????int del_timer (struct timer_list *timer);
????(5) ?????????expire
????int mod_timer (struct timer_list *timer?? unsigned long expires);
????(6) ???????????????linux???????????delayed_work?????????????????ù??????к?????????
????6.1????????
????linux?????????????3??????????????????????????
????void ndelay(unsigned long nsecs);
????void udelay(unsigned long usecs);
????void mdelay(unsigned long msecs);
?????????????????????????????????????????cpu????????????????????????????????o???
????void msleep(unsigned int millisecs);
????unsigned long msleep_interruptible(unsigned int millisecs);
????void ssleep(unsigned int seconds);
??????????????????????????????????????????unsigned long msleep_interruptible?????????????????????????
????6.2????????
?????????????????????????????????????schedule_timeout()????????????????????jiffies??????±??????msleep??????msleep_interruptible()??????schedule_timeout()?????schedule_timeout()?????????????????????????????????????????л??????????????????н????sleep_on()??__set_current_state(TASK_INTERRUPTIBLE)???????