6.分析request_irq和free_irq函数如何注册注销中断(详解)

hd.jpg

及平等节讲了怎贯彻运行中断,这些都是网受做好的,当我们怀念协调写个中断处理程序,去实践好的代码,就用写irq_desc->action->handler,然后经过request_irq()来为基础申请注册中断

英文原稿:The best Apple Watch apps: 24 essential
downloads

本节目标:

自家原创翻译,转载请注明出处。本文同时编制发表至CocoaChina。

    
分析request_irq()如何申请登记中断,free_irq()如何注销中断

咱们挑选了几百缓缓使用,供您品鉴。

 

图片 1

1.request_irq()位于kernel/irq/
manage .c,函数原型如下:

1435914809723479.jpg

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id)

关于Apple
Watch,最好的作业之一即是公发恢宏只是供应选择的利用——App
Store有3000多缓慢应用得下载,市面上凭人会同。

参数说明:

苹果生产了多种多样的制品,希望开发者能够缔造独一无二的用户体验,从而让Apple
Watch成为一个必需的零配件。

unsigned int
 irq:
否要登记中断服务函数的中断号,比如外表中断0就是16,定义在mach/irqs.h

顶点意见:Apple Watch
review

irq_handler_t
 handler:
呢而注册之中止服务函数,就是(irq_desc+ irq
)->action->handler

众多的施用已起矣Apple
Watch扩展——但这3000款款不用每个都值得你花费工夫。你该先下充斥哪个吧?我以为下面这些会是一个不错的上马……

unsigned long  irqflags:
触发中断的参数,比如边沿触发, 定义在linux/interrupt.h。         

天与远足

const char
 *devname:
停顿程序的讳,使用cat /proc/interrupt
可以翻刹车程序名字

当您出门在外时,Apple
Watch是提供信息的超级工具。我们尝试了平等多元之行使,而这些是咱们最为欢喜的。

void
 *dev_id:
传扬中断处理程序的参数,注册共享中断时莫能够吧NULL,因为卸载时欲这做参数,避免卸载其它中断服务函数

Citymapper

1.1request_irq代码如下:

图片 2

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id)
{
       struct irqaction *action;
       ... ...
       action = kmalloc(sizeof(struct irqaction), GFP_ATOMIC);  //注册irqaction结构体类型的action
       if (!action)
                   return -ENOMEM;

/* 将带进来的参数赋给action   */
         action->handler = handler;     
         action->flags = irqflags;
         cpus_clear(action->mask);
         action->name = devname;
         action->next = NULL;
         action->dev_id = dev_id;

         select_smp_affinity(irq);
     ... ...
         retval = setup_irq(irq, action);   // 进入setup_irq(irq, action),设置irq_ desc[irq]->action

         if (retval)
                   kfree(action);

         return retval;
}

1435914876179250.png

打者分析,request_irq()函数主要注册了一个irqaction型action,然后拿参数还给予给这个action,最后进入setup_irq(irq,
action)设置irq_ desc[irq]->action 

要你当采用支撑的城市遭到(包括巴黎,纽约同伦敦),那你没理由并非Citymapper。它小心于公共交通,提供精准、清晰的交通建议。它会报您生同样辆巴士、火车或电车的到时,并且你可一览旅行中所计划的站点。

1.2咱来看望setup_irq(irq,
action)如何设置irq_ desc[irq]->action的:

免费下载Citymapper

int setup_irq(unsigned int irq, struct irqaction *new)
{
        struct irq_desc *desc = irq_desc + irq;   //根据中断号找到irq_ desc[irq]
        ... ...
        p = &desc->action;                 //指向desc->action
        old = *p;
         if (old) {                 //判断action是否为空
                    /*判断这个中断是否支持共享 (IRQF_SHARED)*/
                   if (!((old->flags & new->flags) & IRQF_SHARED) ||
                       ((old->flags ^ new->flags) & IRQF_TRIGGER_MASK)) {
                            old_name = old->name;
                            goto mismatch;                  //不支持,则跳转
                   }

#if defined(CONFIG_IRQ_PER_CPU)
                   /* All handlers must agree on per-cpuness */
                   if ((old->flags & IRQF_PERCPU) !=
                       (new->flags & IRQF_PERCPU))
                            goto mismatch;
#endif

                   /*找到action链表尾处,后面用于添加 新的中断服务函数(*new) */
                   do {
                            p = &old->next;
                            old = *p;
                   } while (old);
                   shared = 1;        //表示该中断支持共享,添加新的action,否则直接赋值新的action
         }

         *p = new;             //指向新的action

 ... ...

         if (!shared) {                  //若该中断不支持共享
                   irq_chip_set_defaults(desc->chip);    //更新desc->chip,将为空的成员设置默认值       

#if defined(CONFIG_IRQ_PER_CPU)
                     if (new->flags & IRQF_PERCPU)
                              desc->status |= IRQ_PER_CPU;
#endif

                   /* Setup the type (level, edge polarity) if configured: */
                   if (new->flags & IRQF_TRIGGER_MASK) {
                     if (desc->chip && desc->chip->set_type)        // desc->chip->set_type设置为中断引脚
                          desc->chip->set_type(irq,new->flags & IRQF_TRIGGER_MASK);
                            else
                                     printk(KERN_WARNING "No IRQF_TRIGGER set_type "

                                            "function for IRQ %d (%s)\n", irq,

                                            desc->chip ? desc->chip->name :

                                            "unknown");
                   } else
                            compat_irq_chip_set_default_handler(desc);

                   desc->status &= ~(IRQ_AUTODETECT | IRQ_WAITING |
                                       IRQ_INPROGRESS);


                   if (!(desc->status & IRQ_NOAUTOEN)) {
                            desc->depth = 0;
                            desc->status &= ~IRQ_DISABLED;
                            if (desc->chip->startup)
                                     desc->chip->startup(irq);     //开启中断
                            else
                                     desc->chip->enable(irq);     //使能中断

                   } else

                           /* Undo nested disables: */
                            desc->depth = 1;
         }

Weather Nerd

打点可以看到setup_irq(irq,
action)主要是以action中断服务函数放在irq_
desc[irq]->action中,

图片 3

接下来设置中断引脚:   

1435914894186533.png

desc->chip->set_type(irq,new->flags & IRQF_TRIGGER_MASK);

Weather Nerd由Dark Sky支持。在我们看来,它是Apple
Watch上之免次之选择。你可在三单窗格内滑动切换:今日,逐时和本周。“今日”显示温度、雨量估计跟简单的本日汇总天气预报;“逐时”详细展示了即将来到的雨水;“本周”则提供了前途六天的天气概况预报。(“nerd”一词则是继续自iPhone版应用,那方面存来大气数目。)

最后[开启/使能]中断:

£2.99/$3.99,下载 Weather
Nerd

 desc->chip->[startup(irq) /enable(irq)];     //[开启/使能]中断

怪虎天气(Yahoo Weather)

咱们以表中断0的desc[16]->chip->set_type为条例,来瞧她是安初始化中断引脚的:

图片 4

s3c_irqext_type(unsigned int irq, unsigned int type)
{
         void __iomem *extint_reg;
         void __iomem *gpcon_reg;
         unsigned long gpcon_offset, extint_offset;
         unsigned long newvalue = 0, value;
       if ((irq >= IRQ_EINT0) && (irq <= IRQ_EINT3))    //找到寄存器
         {
                   gpcon_reg = S3C2410_GPFCON;      
                   extint_reg = S3C24XX_EXTINT0;      // EXTINT0对应中断0~中断7
                   gpcon_offset = (irq - IRQ_EINT0) * 2;    //找到gpcon寄存器的相应位偏移量
                   extint_offset = (irq - IRQ_EINT0) * 4;    //找到extint寄存器的相应位偏移量
         }
    else if(... ...)                    //找到其它的EINT4~23的寄存器

/*将GPIO引脚设为中断引脚*/
value = __raw_readl(gpcon_reg);  
value = (value & ~(3 << gpcon_offset)) | (0x02 << gpcon_offset);  //相应位设置0x02
switch (type)          //设置EXTINT0中断模式
{
case IRQT_NOEDGE:            //未指定的中断模式
                    printk(KERN_WARNING "No edge setting!\n");
                    break; 

           case IRQT_RISING:           //上升沿触发,设置EXTINT0相应位为0x04
                    newvalue = S3C2410_EXTINT_RISEEDGE;
                    break;

           case IRQT_FALLING:     //下降沿触发,设置EXTINT0相应位为0x02
                    newvalue = S3C2410_EXTINT_FALLEDGE;
                    break;

           case IRQT_BOTHEDGE:  //双边沿触发,设置EXTINT0相应位为0x06
                    newvalue = S3C2410_EXTINT_BOTHEDGE;
                    break;

           case IRQT_LOW:                   //低电平触发,设置EXTINT0相应位为0x00
                    newvalue = S3C2410_EXTINT_LOWLEV;
                    break;

           case IRQT_HIGH:                 //高电平触发,设置EXTINT0相应位为0x01
                    newvalue = S3C2410_EXTINT_HILEV;
                    break;
           default:          
}

/*更新EXTINT0相应位*/
value = __raw_readl(extint_reg);
value = (value & ~(7 << extint_offset)) | (newvalue << extint_offset);  //相应位设置
__raw_writel(value, extint_reg);    //向extint_reg写入value值
return 0;
}

1435914918381943.png

经过者分析,就是将action->flags带入到desc[16]->chip->set_type里面,根据不同之间歇来安寄存器模式

假定您嗜重复简单的取天气信息之以,那非常虎之就款采用得符合你。它有着时尚时尚最时尚的图标、发光的霓虹文字效果,并支持多个职务。滚动时,你晤面见到完美之太阳动画;点击即状态则产出一个图,显示了通下几只小时的温、降水与风速预报。

 

免费下载好虎天气

2.request_irq()是挂号中断,同样的卸载中断的函数是free_irq()

TripAdvisor

free_irq()也放在kernel/irq/ manage
.c,函数原型如下:

图片 5

free_irq(unsigned int irq, void *dev_id);

1435915016210295.png

参数说明:

TripAdvisor旨在告诉你附近发生啊“吃喝玩乐”的地方。想出来的早晚,有她你见面便利多。所选地方的页面有图像、地图、地址和评论,可保存下来供日晚每当任意设备上读。

unsigned int  irq:要卸载的间歇号

免费下载TripAdvisor

void
 *dev_id:这个是若卸载的中断action下的谁服务函数,

Find Near Me

2.1
free_irq()代码如下:

图片 6

void free_irq(unsigned int irq, void *dev_id)
{
   struct irq_desc *desc;
   struct irqaction **p;
   unsigned long flags;
   irqreturn_t (*handler)(int, void *) = NULL;

   WARN_ON(in_interrupt());
   if (irq >= NR_IRQS)
          return;

   desc = irq_desc + irq;                //根据中断号,找到数组
   spin_lock_irqsave(&desc->lock, flags);
   p = &desc->action;          //p指向中断里的action链表

   for (;;) {
        struct irqaction *action = *p;

          if (action) {        //在action链表中找到与参数dev_id相等的中断服务函数
                struct irqaction **pp = p;
                p = &action->next;       
                if (action->dev_id != dev_id)    //直到找dev_id才执行下面,进行卸载
                  continue;          
                *pp = action->next;      //指向下个action成员,将当前的action释放掉
                #ifdef CONFIG_IRQ_RELEASE_METHOD
                   if (desc->chip->release)   //执行chip->release释放中断服务函数相关的东西
                         desc->chip->release(irq, dev_id);
                #endif
          if (!desc->action) {   //判断当前action成员是否为空,表示没有中断服务函数
                       desc->status |= IRQ_DISABLED;
                       if (desc->chip->shutdown)       //执行chip->shutdown关闭中断
              desc->chip->shutdown(irq);
                 else                          //执行chip-> disable禁止中断
               desc->chip->disable(irq);
                                    }

                  spin_unlock_irqrestore(&desc->lock, flags);
                  unregister_handler_proc(irq, action);
            synchronize_irq(irq);
            if (action->flags & IRQF_SHARED)
              handler = action->handler;
                kfree(action);
                 return;

               }

   printk(KERN_ERR "Trying to free already-free IRQ %d\n", irq);//没有找到要卸载的action成员

   spin_unlock_irqrestore(&desc->lock, flags);

   return;

       }

#ifdef CONFIG_DEBUG_SHIRQ
         if (handler) {

                   /*

                    * It's a shared IRQ -- the driver ought to be prepared for it

                    * to happen even now it's being freed, so let's make sure....

                    * We do this after actually deregistering it, to make sure that

                    * a 'real' IRQ doesn't run in parallel with our fake

                    */
                   handler(irq, dev_id);

         }
#endif
}

1435915037399320.png

自从点分析,free_irq()函数主要通过irq和dev_id来寻觅要放的中断action

这个利用得帮你快速分类找到附近的事情,只需要轻轻一点:ATM、银行、酒吧、SPA、动物园……如您所展现,选项是发接触奇怪,但此应用足够快,甚至同意而通过Siri使用好之搜寻语言(这眼前当Apple
Watch上还是那个稀缺的)。选择个人项目时,通常她见面供更多细节(地址、地图)和评价。

如释放的中断action不是共享的中断(为空),则履行:

免费下载Find Near
Me

 

娱乐

*pp = action->next;      //指向下个action成员,将当前的action释放掉
desc->chip->release(irq, dev_id);    //执行chip->release释放中断服务函数相关的东西

desc->status |= IRQ_DISABLED;            //设置desc[irq]->status标志位
desc->chip->[shutdown(irq)/ desible(irq)];    //关闭/禁止中断

对许多人口而言Apple
Watch是独器如非玩具,但时特性使得其为可为此来娱乐。看看这些推荐吧。

 

Rules

设若释放的中断action是共享的暂停(还发生其他中断服务函数)的话语虽只实行:

图片 7

*pp = action->next;      //指向下个action成员,将当前的action释放掉
desc->chip->release(irq, dev_id);    //执行chip->release释放中断服务函数相关的东西

1435915068262800.png

 

Rules!每天给您一个挑战性的小游戏,让你难以忘怀有平整并点击相关卡片。看上去小菜一碟啊!可是实际并无是这样,因为几乎轮子过后,你脑子里各种条条框框就是会如浆糊一样纷纷扬扬(“向上划”、“看见绿色点红色”、“别碰动物”),它们吃您得以反的办法处理,一旦出错,游戏结束。

request_irq()和free_irq()分析了后,接下去开始编中断方式的按键驱动

£2.29 /
2.99美元,下载Rules!

 

Shazam

图片 8

1435915157816769.png

Shazam仍然深具未来感。当后台在播放歌曲时,摇晃手机,它见面报告你歌名。现在,你还是毫无掏出手机——只需要晃几下胳膊,你虽能知晓歌名。如果您想跳到案上号一嗓子吓吓人之说话……好吧,它吧足以让您提供歌词。

免费下载Shazam

Sky Guide

图片 9

1435915233222471.png

于iPhone上,Sky Guide是极度唯美和精准的星图和星象指导。在Apple
Watch上,这个用会让您一个有关未来事项的日历,并根据你所在位置将发生的事情推送通知。这样,你便会遇见国际空间站从友好头顶飘了了。

£1.99 / 2.99美元,下载Sky
Guide

TuneIn Radio Pro

图片 10

1435915251467477.png

TuneIn Radio提供了世界各地超过10万独广播电台。使用Apple
Watch,你可转移iPhone当前播放的电台、访问以来播以及血脉相通的无线电台、关注节目、暂停/播放/跳了。如果您无希罕付费,Apple
Watch上为出免费版。

£7.99 / 9.99美元,下载TuneIn Radio
Pro

Yelp

图片 11

1435915271173181.png

于iPhone上,Yelp可以提供给您世界范围外7千万下商户的评头品足。而当Apple
Watch上,它只是想拉您填饱肚子……你见面相一个细的按钮,点一下,你就可以看到邻县的酒馆、旅馆和咖啡馆的列表。每一样种情景下,你还可找到结果列表或个别地方,看到离开、地图、评论和价格指标。

免费下载Yelp

Instapaper

图片 12

1435915291462587.png

作头的“以后再也看”服务,Instapaper似乎是Apple
Watch一个飞的同伴。但它好叫您管理自己之文档,还会拿文章并转移为语音。虽说结果小大——好像是机器人在瞎bb——但她可于您于匪便宜用出iPhone的下了解文章内容。

免费下载Instapaper

运动

Apple Watch最充分特色有就是是时效性,因此活动应用超级适合。

Onefootball

图片 13

1435915321112726.png

Onefootball的Apple
Watch应用能够于您这获得信息。你得当iPhone上安关注的球队,然后用Apple
Watch查看当天的比。如果你的球队进球还是于进球了,你的手腕上会见叮铃一名响起,这时候……你便揪心吧。

免费下载Onefootball

Hole19

图片 14

1435915431477060.png

Hole19凡高尔夫选手的综合工具,提供球洞路线以及统计,并生得记载分数的简单界面。在iPhone上起同轮子训练后,Apple
Watch会根据你的求记录数据。

免费下载
Hole19

Slopes

图片 15

1435915453134416.png

登山时,我们还盼能够查看自己之快慢、海拔和去。然而,iPhone并非这种情景下的特级设备。Slopes让您可以通过Apple
Watch记录数据并当表面上显得。

£5.99 /
7.99美元,下载Slopes

生产力工具

唯独通过戴设备会辅助您成功再多工作。我们品尝了千千万万的动,发现有Apple
Watch在当前,很多时分能事半功倍。

Clear

图片 16

1435915476494735.png

非常奇怪,苹果将Reminders带顶了Apple
Watch上。Clear算是目前极其好之替代产品。如iPhone版一样,它界面可以、运行流畅,能够给你快速访问事项列表。你可以破或创造任务,Glance界面则排有了产一个提拔的底细信息。

£3.99 /
4.99美元,下载Clear

Dart

图片 17

1435915494594622.png

Dart希望简化和淘汰冗长的电子邮件。对一个简练之题目(限200配),你可点击多选择答案。当然,它于Apple
Watch上有重新完美的经验,只要点一下便可以过来。

79p /
0.99美元,下载Dart

PCalc

图片 18

1435915514473183.png

苹果还是忽略了Apple
Watch上之计算器(库克可能未欣赏卡西欧),但还好我们还有PCalc。
免费的PCalc套件包含了Apple Watch版本,真是业界良心。

£7.99 /
9.99美元,下载PCalc

Cruncher

图片 19

1435915532878831.png

咱俩拿Cruncher作为“替补”计算器,因为……如果你手指足够细致之言语它才好用。它可能没有好之子菜单,但按键比另外产品重新易于扎一点。

免费下载Cruncher

Deliveries

图片 20

1435915552960435.png

任由在哪个平台达成,Deliveries都是死巨大的。它能追踪你的货品,确保您不见面磨了快递。在Apple
Watch上,你同样好望商品时处处位置,并接纳紧急货物之通。

£3.99 /
4.99美元,下载Deliveries

Twitterrific

图片 21

1435915570780660.png

Twitterrific是iPhone上极引人喜爱的推特客户端,这种欢乐吗延长到Apple
Watch。它兼具华丽的界面和吸引人口的通报。它没有追求效益的特别而俱,而是专注让每日数及互相上。不过,你要好实现重点的文件动作,还可以据此Siri回复消息。

免费+£1.49 /
1.99美元IAP,下载Twitterrific

Slack

图片 22

1435915586375363.png

用作团队交流工具,Slack是马到成功的,但是若应有无思当表面上滑动查看所有音讯。因此,它明智地就展示直接信息及提及,你得用预设回答、表情或Siri进行还原。

免费下载Cruncher

创意

若果您需要创意,那这些用能够给你重新好地发现与应用这个世界。

ProCamera

图片 23

1435915634984311.png

倘若你早就是ProCamera的用户,你应当会以为这款Apple
Watch应用会较苹果的自带远程相机好有的。它装有长途触发、外部取景预览、预览照片和定时器功能。你还可以安装延时的尺寸和照片张数。

£3.99 /
4.99美元,下载ProCamera

Drafts 4

图片 24

1435915650753462.png

在iPhone上,Drafts宣称自己是是“文字开始的地方”。这吗不是自夸,它确实是平缓缓可乘要高速的笔记应用,还装有完美的共享功能。现在,通过Siri命令,“文字开始之地方”也可是我们的表盘了。它以捕获的公文发送至收件箱,你可把自由档次增长到其它一个蒙受,并开展归档或删除。

£7.99 / 9.99美元,下载Drafts
4

Day One

图片 25

1435915671285741.png

以前,写日记是一个重的行事,但Day One让其换得有趣起来。在Apple
Watch上,整个经过被顶地简化了,你可由此Siri记录自己之部分设法。该以还有报到功能,可以将照附着某个位置上。

£3.99 / 4.99美元,下载Day
One