新聞中心

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

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

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

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

        本文引用地址:http://www.104case.com/article/201611/318129.htm

        在Linux中start_kernel()時(shí)會(huì)進(jìn)行體系結(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; 相當(dāng)于一個(gè)變量函數(shù)(函數(shù)就像變量一樣,被賦值),默認(rèn)值為NULL,那么在其他地方應(yīng)該被再次賦值。其實(shí)在setup_arch()中init_arch_irq()已經(jīng)有所指向了,在arch/arm/kernel/setup.c中setup_arch進(jìn)行體系平臺(tái)相關(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是一個(gè)struct machine_desc的數(shù)據(jù)結(jié)構(gòu),msdesc 通過(guò) setup_machine(machine_arch_type) 獲取平臺(tái)體系的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. };

        這個(gè)參數(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,//這里是目標(biāo)CPU的irq初始化函數(shù)
        7. .map_io=smdk2440_map_io,
        8. .init_machine=smdk2440_machine_init,
        9. .timer=&s3c24xx_timer,
        10. MACHINE_END

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

        注冊(cè)中斷主要用下面三個(gè)函數(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)

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



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

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 隆昌县| 兴义市| 民勤县| 昌乐县| 卓尼县| 陆良县| 武陟县| 嘉义市| 镇沅| 光泽县| 礼泉县| 扬中市| 合山市| 新安县| 新营市| 河津市| 和硕县| 教育| 乌恰县| 观塘区| 探索| 清原| 佛学| 老河口市| 松江区| 尼木县| 溧水县| 永济市| 江陵县| 抚远县| 象州县| 磴口县| 临桂县| 轮台县| 永福县| 威远县| 子洲县| 木兰县| 左权县| 丰县| 建德市|