資源描述:
《arm_linux中斷處理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、arm_linux中斷處理一、中斷注冊(cè)方法在linux內(nèi)核中用于申請(qǐng)中斷的函數(shù)是request_irq(),函數(shù)原型在Kernel/irq/manage.c中定義:intrequest_irq(unsignedintirq,irq_handler_thandler,unsignedlongirqflags,constchar*devname,void*dev_id)irq是要申請(qǐng)的硬件中斷號(hào)。handler是向系統(tǒng)注冊(cè)的中斷處理函數(shù),是一個(gè)回調(diào)函數(shù),中斷發(fā)生時(shí),系統(tǒng)調(diào)用這個(gè)函數(shù),dev_id參數(shù)將被傳遞給它
2、。irqflags是中斷處理的屬性,若設(shè)置了IRQF_DISABLED(老版本中的SA_INTERRUPT,本版zhon已經(jīng)不支持了),則表示中斷處理程序是快速處理程序,快速處理程序被調(diào)用時(shí)屏蔽所有中斷,慢速處理程序不屏蔽;若設(shè)置了IRQF_SHARED(老版本中的SA_SHIRQ),則表示多個(gè)設(shè)備共享中斷,若設(shè)置了IRQF_SAMPLE_RANDOM(老版本中的SA_SAMPLE_RANDOM),表示對(duì)系統(tǒng)熵有貢獻(xiàn),對(duì)系統(tǒng)獲取隨機(jī)數(shù)有好處。(這幾個(gè)flag是可以通過(guò)或的方式同時(shí)使用的)dev_id在中斷共
3、享時(shí)會(huì)用到,一般設(shè)置為這個(gè)設(shè)備的設(shè)備結(jié)構(gòu)體或者NULL。devname設(shè)置中斷名稱(chēng),在cat/proc/interrupts中可以看到此名稱(chēng)。request_irq()返回0表示成功,返回-INVAL表示中斷號(hào)無(wú)效或處理函數(shù)指針為NULL,返回-EBUSY表示中斷已經(jīng)被占用且不能共享。關(guān)于中斷注冊(cè)的例子,大家可在內(nèi)核中搜索下request_irq。在編寫(xiě)驅(qū)動(dòng)的過(guò)程中,比較容易產(chǎn)生疑惑的地方是:1、中斷向量表在什么位置?是如何建立的?2、從中斷開(kāi)始,系統(tǒng)是怎樣執(zhí)行到我自己注冊(cè)的函數(shù)的?3、中斷號(hào)是如何確定的?
4、對(duì)于硬件上有子中斷的中斷號(hào)如何確定?4、中斷共享是怎么回事,dev_id的作用是?本文以2.6.26內(nèi)核和S3C2410處理器為例,為大家講解這幾個(gè)問(wèn)題。二、異常向量表的建立在ARMV4及V4T以后的大部分處理器中,中斷向量表的位置可以有兩個(gè)位置:一個(gè)是0,另一個(gè)是0xffff0000??梢酝ㄟ^(guò)CP15協(xié)處理器c1寄存器中V位(bit[13])控制。V和中斷向量表的對(duì)應(yīng)關(guān)系如下:V=0~0x00000000~0x0000001CV=1~0xffff0000~0xffff001Carch/arm/mm/pro
5、c-arm920.S中.section".text.init",#alloc,#execinstr__arm920_setup:……orrr0,r0,#0x2100@..1....1..11...1//bit13=1中斷向量表基址為0xFFFF0000。R0的值將被付給CP15的C1.在linux中,向量表建立的函數(shù)為:init/main.c->start_kernel()->trap_init()void__inittrap_init(void){unsignedlongvectors=CONFIG_VE
6、CTORS_BASE;……memcpy((void*)vectors,__vectors_start,__vectors_end-__vectors_start);memcpy((void*)vectors+0x200,__stubs_start,__stubs_end-__stubs_start);....}在2.6.26內(nèi)核中CONFIG_VECTORS_BASE最初是在各個(gè)平臺(tái)的配置文件中設(shè)定的,如:arch/arm/configs/s3c2410_defconfig中CONFIG_VECTORS_B
7、ASE=0xffff0000__vectors_end至__vectors_start之間為異常向量表。位于arch/arm/kernel/entry-armv.S.globl__vectors_start__vectors_start:swiSYS_ERROR0:bvector_und+stubs_offset//復(fù)位異常:ldrpc,.LCvswi+stubs_offset//未定義指令異常:bvector_pabt+stubs_offset//軟件中斷異常:bvector_dabt+stubs_off
8、set//數(shù)據(jù)異常:bvector_addrexcptn+stubs_offset//保留:bvector_irq+stubs_offset//普通中斷異常:bvector_fiq+stubs_offset//快速中斷異常:.globl__vectors_end:__vectors_end:__stubs_end至__stubs_start之間是異常處理的位置。也位于文件arch/arm/kernel/entry