<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM-Linux s3c2440 之中斷分析(二)

          ARM-Linux s3c2440 之中斷分析(二)

          作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
          軟件篇:

          上一篇文章回顧了s3c2440的中斷控制器原理的相關(guān)硬件知識,有了這個基礎(chǔ)再來分析Linux中的軟件分析方式,心里就有底了。面對浩瀚如海的Linux源代碼,s3c2440的中斷到底是怎樣呢,如何處理,如何實現(xiàn)的呢?一步一步來揭開它神秘的面紗吧,當然需要從Linux內(nèi)核源碼入手!

          本文引用地址:http://www.ex-cimer.com/article/201611/318129.htm

          在Linux中start_kernel()時會進行體系結(jié)構(gòu)的初始化:init_IRQ(), 故名思議,其源代碼如下:

          [cpp]view plaincopy
          1. void__initinit_IRQ(void)
          2. {
          3. intirq;
          4. for(irq=0;irq
          5. irq_desc[irq].status|=IRQ_NOREQUEST|IRQ_NOPROBE;
          6. #ifdefCONFIG_SMP
          7. cpumask_setall(bad_irq_desc.affinity);
          8. bad_irq_desc.cpu=smp_processor_id();
          9. #endif
          10. init_arch_irq();//這里是系統(tǒng)初始化irq的入口
          11. }

          init_arch_irq()初始值為:void (*init_arch_irq)(void)__initdata = NULL; 相當于一個變量函數(shù)(函數(shù)就像變量一樣,被賦值),默認值為NULL,那么在其他地方應(yīng)該被再次賦值。其實在setup_arch()中init_arch_irq()已經(jīng)有所指向了,在arch/arm/kernel/setup.c中setup_arch進行體系平臺相關(guān)初始化:

          1. void__initsetup_arch(char**cmdline_p)
          2. {
          3. structtag*tags=(structtag*)&init_tags;
          4. structmachine_desc*mdesc;
          5. char*from=default_command_line;
          6. unwind_init();
          7. setup_processor();
          8. mdesc=setup_machine(machine_arch_type);
          9. machine_name=mdesc->name;
          10. cpu_init();
          11. init_arch_irq=mdesc->init_irq;//這里是init_arch_irq()指向的函數(shù)
          12. system_timer=mdesc->timer;
          13. init_machine=mdesc->init_machine;
          14. early_trap_init()//初始化中斷向量表
          15. }

          mdesc是一個struct machine_desc的數(shù)據(jù)結(jié)構(gòu),msdesc 通過 setup_machine(machine_arch_type) 獲取平臺體系的MACHINE_START相關(guān)參數(shù)。

          1. #defineMACHINE_START(_type,_name)
          2. staticconststructmachine_desc__mach_desc_##_type
          3. __used
          4. __attribute__((__section__(".arch.info.init")))={
          5. .nr=MACH_TYPE_##_type,
          6. .name=_name,
          7. #defineMACHINE_END
          8. };

          這個參數(shù)如下:

          1. MACHINE_START(S3C2440,"SMDK2440")
          2. /*Maintainer:BenDooks*/
          3. .phys_io=S3C2410_PA_UART,
          4. .io_pg_offst=(((u32)S3C24XX_VA_UART)>>18)&0xfffc,
          5. .boot_params=S3C2410_SDRAM_PA+0x100,
          6. .init_irq=s3c24xx_init_irq,//這里是目標CPU的irq初始化函數(shù)
          7. .map_io=smdk2440_map_io,
          8. .init_machine=smdk2440_machine_init,
          9. .timer=&s3c24xx_timer,
          10. MACHINE_END

          可見s3c24xx_init_irq()才是所要找得中斷初始化入口程序,所以執(zhí)行init_arch_irq()實際是執(zhí)行s3c24xx_init_irq()程序。中斷的初始化工作:首先,清空各interrupt pending的值,然后再向系統(tǒng)注冊主要的中斷,從上篇中我們知道s3c2440有60個中斷,但系統(tǒng)中主要用了58個中斷,

          注冊中斷主要用下面三個函數(shù):

          1. intset_irq_chip(unsignedintirq,structirq_chip*chip)
          2. staticinlinevoidset_irq_handler(unsignedintirq,irq_flow_handler_thandle)
          3. staticinlinevoidset_irq_chained_handler(unsignedintirq,irq_flow_handler_thandle)

          至此,中斷的初始化過程完成了,那么它是怎樣工作的,具體的流程由如何,各中斷函數(shù)的回調(diào)函數(shù)怎么理解,下文將繼續(xù)深入探討。。



          關(guān)鍵詞: ARMLinuxs3c2440中斷分

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();