熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

新聞中心

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.bjwjmy.cn/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)閉