新聞中心

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)的呢?一步一步來揭開它神秘的面紗吧,當(dāng)然需要從Linux內(nèi)核源碼入手!

本文引用地址:http://2s4d.com/article/201611/318129.htm

在Linux中start_kernel()時會進(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)于一個變量函數(shù)(函數(shù)就像變量一樣,被賦值),默認(rèn)值為NULL,那么在其他地方應(yīng)該被再次賦值。其實在setup_arch()中init_arch_irq()已經(jīng)有所指向了,在arch/arm/kernel/setup.c中setup_arch進(jìn)行體系平臺相關(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,//這里是目標(biāo)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)閉