ÔÚLinux²Ù×÷ϵͳÖУ¬ÖжϹÜÀíÓÈÎªÖØÒª£¬ÌرðÊÇÔÚ´¦Àí¶àÈÎÎñ¡¢¶àÉ豸µÄ»·¾³ÖÐ
±¾ÎĽ«ÉîÈë̽ÌÖLinuxÖеÄIRQ£¨Interrupt Request£©ÖжϻúÖÆ£¬°üÀ¨Æä»ù±¾ÔÀí¡¢ÊµÏÖ·½Ê½ÒÔ¼°¸ßЧ¹ÜÀí²ßÂÔ
Ò»¡¢ÖжϵĻù±¾¸ÅÄîÓëÖØÒªÐÔ ÖжÏÊÇÓ²¼þ»òÈí¼þÏòCPU·¢Ë͵ÄÒ»ÖÖÐźţ¬ÓÃÓÚÇëÇóCPUÁ¢¼´´¦Àíij¸öʼþ
ÔÚÈÎÒâʱ¿Ì£¬CPUÖ»ÄÜ´¦ÀíÒ»¸öÈÎÎñ£¬µ«ÏµÍ³ÖпÉÄÜÓжà¸öÓ²¼þºÍÈí¼þÈÎÎñµÈ´ýCPUµÄÏìÓ¦
µ±ÖжϷ¢Éúʱ£¬CPU»áÔÝÍ£µ±Ç°ÈÎÎñ£¬×ª¶ø´¦ÀíÖжÏʼþ
ÕâÖÖ»úÖÆÈ·±£ÁËϵͳÄܹ»¼°Ê±ÏìÓ¦Íⲿʼþ£¬Èç¼üÅÌÊäÈë¡¢´ÅÅ̶Áд»òÍøÂçÊý¾Ý°ü½ÓÊÕµÈ
ÔÚLinuxϵͳÖУ¬ÖжÏÇëÇó£¨IRQ£©ÊÇÖжϻúÖÆµÄºËÐÄ
ÿ¸öÉ豸¶¼ÓÐÒ»¸ö»ò¶à¸öIRQºÅ£¬ÓÃÓÚ±êʶÉ豸²úÉúµÄÖжÏ
µ±É豸ÐèÒªCPU´¦Àíʱ£¬Ëü»á´¥·¢ÏàÓ¦µÄIRQ£¬CPUÔò¸ù¾ÝIRQºÅÕÒµ½¶ÔÓ¦µÄÖжϴ¦Àíº¯Êý½øÐд¦Àí
¶þ¡¢LinuxÖжϵÄÓ²¼þ»ù´¡ Ò»¸öÍêÕûµÄÉ豸ÖУ¬ÓëÖжÏÏà¹ØµÄÓ²¼þ¿ÉÒÔ»®·ÖΪÈýÀࣺÉ豸¡¢ÖжϿØÖÆÆ÷ºÍCPU±¾Éí
- É豸£ºÊÇ·¢ÆðÖжϵÄÔ´
µ±É豸ÐèÒªÇëÇóijÖÖ·þÎñʱ£¬Ëü»á·¢ÆðÒ»¸öÓ²¼þÖжÏÐźÅ
Õâ¸öÐźÅͨ³£»áÁ¬½ÓÖÁÖжϿØÖÆÆ÷
- ÖжϿØÖÆÆ÷£º¸ºÔðÊÕ¼¯ËùÓÐÖжÏÔ´·¢ÆðµÄÖжÏ
ÏÖÓеÄÖжϿØÖÆÆ÷¼¸ºõ¶¼Êǿɱà³ÌµÄ£¬Í¨¹ý±à³Ì¿ÉÒÔ¿ØÖÆÃ¿¸öÖжÏÔ´µÄÓÅÏȼ¶¡¢ÖÐ¶ÏµÄµçÆøÀàÐÍ£¬»¹¿ÉÒÔ´ò¿ªºÍ¹Ø±Õijһ¸öÖжÏÔ´
ÔÚARM¼Ü¹¹µÄϵͳÖУ¬³£ÓõÄÖжϿØÖÆÆ÷ÓÐVIC£¨Vector Interrupt Controller£©ºÍGIC£¨General Interrupt Controller£©
- CPU£ºÊÇ×îÖÕÏìÓ¦ÖжϵIJ¿¼þ
µ±ÖжϿØÖÆÆ÷Åж¨Ò»¸öÖжϿÉÒÔ±»´¦Àíʱ£¬Ëü»á¸ù¾ÝÊÂÏȵÄÉ趨£¬Í¨ÖªÆäÖÐÒ»¸ö»ò¶à¸öCPU¶Ô¸ÃÖжϽøÐд¦Àí
ËäÈ»ÖжϿØÖÆÆ÷¿ÉÒÔͬʱ֪ͨ¶à¸öCPU¶Ôijһ¸öÖжϽøÐд¦Àí£¬µ«Êµ¼ÊÉÏ£¬×îºóÖ»»áÓÐÒ»¸öCPUÏìÓ¦Õâ¸öÖжÏÇëÇó
Èý¡¢LinuxÖжϵĴ¦ÀíÁ÷³Ì LinuxÖжϴ¦ÀíÁ÷³Ì°üÀ¨ÖжÏ×¢²á¡¢ÖжϽÓÊÕºÍÖжϴ¦ÀíÈý¸öÖ÷Òª²½Öè
1.ÖжÏ×¢²á£º É豸Çý¶¯³ÌÐòÔÚ³õʼ»¯Ê±£¬»áÏòϵͳÉêÇëÒ»¸öIRQºÅ£¬²¢×¢²áÒ»¸öÖжϴ¦Àíº¯Êý
Õâ¸ö´¦Àíº¯ÊýÊǵ±É豸²úÉúÖжÏʱ£¬CPUÐèÒªµ÷Óõĺ¯Êý
ÔÚLinuxÖУ¬ÉêÇëÖжϵÄAPIÊÇ`request_irq()`
c intrequest_irq(unsigned int irq,void (handler)(int, void, struct pt_regs), unsigned long flags, constchar devname, void dev_id); ÆäÖУ¬`irq`ÊÇÒªÉêÇëµÄÓ²¼þÖжϺţ¬`handler`ÊÇÖжϴ¦Àíº¯Êý£¬`flags`ÊÇÓëÖжϹÜÀíÓйصĸ÷ÖÖÑ¡Ï`devname`ÊÇÖжϵÄÃû³Æ£¬`dev_id`ÓÃÓÚ¹²ÏíÖжÏʱµÄ±êʶ
2.ÖжϽÓÊÕ£º µ±ÖжϷ¢Éúʱ£¬CPU»áÔÝÍ£µ±Ç°ÈÎÎñ£¬²¢¸ù¾ÝIRQºÅÕÒµ½¶ÔÓ¦µÄÖжϴ¦Àíº¯Êý
Õâ¸ö¹ý³ÌÓÉÖжϿØÖÆÆ÷ºÍCPU¹²Í¬Íê³É
ÖжϿØÖÆÆ÷¸ºÔð½«ÖжÏÐźŴ«µÝ¸øCPU£¬CPUÔò¸ù¾ÝÖжÏÏòÁ¿±íÕÒµ½¶ÔÓ¦µÄÖжϴ¦Àíº¯Êý
3.Öжϴ¦Àí£º LinuxÖжϴ¦Àí·ÖΪÉϰ벿ºÍϰ벿
Éϰ벿¸ºÔð¿ìËٵǼÇÖжϣ¬²¢½«Öжϴ¦ÀíµÄϰ벿¹Òµ½¸ÃÉ豸µÄϰ벿ִÐжÓÁÐÖÐ
Éϰ벿ִÐеÄËٶȺܿ죬¿ÉÒÔ·þÎñ¸ü¶àµÄÖжÏÇëÇó
¶øÏ°벿ÔòÏà¶Ô²»ÄÇô½ô¼±£¬Í¨³£±È½ÏºÄʱ£¬Òò´ËÓÉϵͳ×ÔÐа²ÅÅÔËÐÐʱ»ú£¬²»ÔÚÖжϷþÎñÉÏÏÂÎÄÖÐÖ´ÐÐ
Öжϴ¦Àíº¯Êýͨ³£ÊÇÒ»¸öÆÕͨµÄCº¯Êý£¬µ«ËüÔËÐÐÔÚÖжÏÉÏÏÂÎÄÖУ¬Òò´ËÆäÐÐΪÊܵ½Ä³Ð©ÏÞÖÆ£¬Èç²»ÄÜÏòÓû§¿Õ¼ä·¢ËÍ»ò½ÓÊÕÊý¾Ý£¬²»ÄÜʹÓÿÉÄÜÒýÆð×èÈû»òµ÷¶ÈµÄº¯ÊýµÈ
ËÄ¡¢LinuxÖжϵĸßЧ¹ÜÀí²ßÂÔ ÎªÁ˸ßЧ¹ÜÀíÖжϣ¬LinuxÒýÈëÁËһϵÁвßÂԺͻúÖÆ
1.ÖжϹ²Ïí£º ¶à¸öÉ豸¿ÉÒÔ¹²Ïíͬһ¸öIRQºÅ
ÕâÔÚPCIÉ豸ÖÐÓÈΪ³£¼û
ͨ¹ý¹²ÏíÖжϣ¬¿ÉÒÔ¼õÉÙIRQºÅµÄÏûºÄ£¬Ìá¸ßϵͳµÄ¿ÉÀ©Õ¹ÐÔ
µ«ÐèҪעÒâµÄÊÇ£¬¹²ÏíÖжϵĴ¦Àí³ÌÐòÖв»ÄÜʹÓÃ`disable_irq()`º¯Êý£¬ÒòΪÕâ»á½ûÓÃÕû¸öÖжÏÏߣ¬µ¼ÖÂÆäËûÉ豸ҲÎÞ·¨Ê¹ÓÃÖжÏ
2.ÖжÏÓÅÏȼ¶ÓëÆÁ±Î£º ÔÚLinuxÖУ¬¿ÉÒÔͨ¹ý±à³ÌÉèÖÃÖжϵÄÓÅÏȼ¶ºÍÆÁ±Î״̬
¸ßÓÅÏȼ¶µÄÖжϿÉÒÔ¸ü¿ìµØµÃµ½´¦Àí£¬¶øµÍÓÅÏȼ¶µÄÖжÏÔò¿ÉÒÔ±»ÑÓ³Ù´¦Àí
´ËÍ⣬»¹¿ÉÒÔͨ¹ýÆÁ±ÎÖжÏÀ´·ÀֹеÄÖжÏʼþ´¥·¢£¬ÕâÔÚ´¦Àí¸´ÔÓ»òºÄʱµÄÖжÏʱÓÈΪÓÐÓÃ
3.ÈíÖжÏÓëTasklet£º ΪÁ˽â¾öÖжϴ¦ÀíÖеÄÄÚÔÚì¶Ü£¨¼´Ö´ÐÐÒª·Ç³£¿ì£¬µ«ÐèÒª×öµÄÊÂÇé¿ÉÄܷdz£¶à£©£¬LinuxÒýÈëÁËÈíÖжϣ¨softirq£©ºÍTasklet»úÖÆ
ÈíÖжÏÊÇÒ»ÖÖÄÚºË×Óϵͳ£¬ÓÃÓÚ´¦Àí±»ÍÆ³ÙµÄÖжϴ¦ÀíÂß¼
ÿ¸öCPU¶¼»á³õʼ»¯Ò»¸öksoftirqdÄÚºËỊ̈߳¬