資源描述:
《linux內核中ARM中斷實現(xiàn)詳解》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、linux內核中ARM中斷實現(xiàn)詳解看了一些網(wǎng)絡上關于linux中斷實現(xiàn)的文章,感覺有一些寫的非常好,在這里首先感謝他們的無私付出,然后也想再補充自己對一些問題的理解。先從函數(shù)注冊引出問題吧。一、中斷注冊方法在linux內核中用于申請中斷的函數(shù)是request_irq(),函數(shù)原型在Kernel/irq/manage.c中定義:intrequest_irq(unsignedintirq,irq_handler_thandler,????????????????????????unsignedlongirqflags,constchar*devname,void*dev_
2、id)irq是要申請的硬件中斷號。handler是向系統(tǒng)注冊的中斷處理函數(shù),是一個回調函數(shù),中斷發(fā)生時,系統(tǒng)調用這個函數(shù),dev_id參數(shù)將被傳遞給它。irqflags是中斷處理的屬性,若設置了IRQF_DISABLED(老版本中的SA_INTERRUPT,本版zhon已經(jīng)不支持了),則表示中斷處理程序是快速處理程序,快速處理程序被調用時屏蔽所有中斷,慢速處理程序不屏蔽;若設置了IRQF_SHARED(老版本中的SA_SHIRQ),則表示多個設備共享中斷,若設置了IRQF_SAMPLE_RANDOM(老版本中的SA_SAMPLE_RANDOM),表示對系統(tǒng)熵有貢獻,對
3、系統(tǒng)獲取隨機數(shù)有好處。(這幾個flag是可以通過或的方式同時使用的)dev_id在中斷共享時會用到,一般設置為這個設備的設備結構體或者NULL。devname設置中斷名稱,在cat/proc/interrupts中可以看到此名稱。request_irq()返回0表示成功,返回-INVAL表示中斷號無效或處理函數(shù)指針為NULL,返回-EBUSY表示中斷已經(jīng)被占用且不能共享。關于中斷注冊的例子,大家可在內核中搜索下request_irq。在編寫驅動的過程中,比較容易產(chǎn)生疑惑的地方是:1、中斷向量表在什么位置?是如何建立的??2、從中斷開始,系統(tǒng)是怎樣執(zhí)行到我自己注冊的函數(shù)
4、的??3、中斷號是如何確定的?對于硬件上有子中斷的中斷號如何確定??4、中斷共享是怎么回事,dev_id的作用是?本文以2.6.26內核和S3C2410處理器為例,為大家講解這幾個問題。二、異常向量表的建立在ARMV4及V4T以后的大部分處理器中,中斷向量表的位置可以有兩個位置:一個是0,另一個是0xffff0000??梢酝ㄟ^CP15協(xié)處理器c1寄存器中V位(bit[13])控制。V和中斷向量表的對應關系如下:V=0???????~???????0x00000000~0x0000001C???????V=1???????~???????0xffff0000~0xfff
5、f001Carch/arm/mm/proc-arm920.S中.section".text.init",#alloc,#execinstr???????__arm920_setup:???????……orr??????r0,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)???????{
6、????????????????unsignedlongvectors=CONFIG_VECTORS_BASE;????????????????……????????????????memcpy((void*)vectors,__vectors_start,__vectors_end-__vectors_start);???????????????memcpy((void*)vectors+0x200,__stubs_start,__stubs_end-__stubs_start);????????????????....???????}在2.6.26內核中CONFIG
7、_VECTORS_BASE最初是在各個平臺的配置文件中設定的,如:arch/arm/configs/s3c2410_defconfig中CONFIG_VECTORS_BASE=0xffff0000__vectors_end至__vectors_start之間為異常向量表。位于arch/arm/kernel/entry-armv.S.globl__vectors_start__vectors_start:???????swiSYS_ERROR0:???????bvector_und+stubs_offset//復位異常:???????ldrpc,.LC