arm_linux中斷處理

arm_linux中斷處理

ID:14099687

大小:53.00 KB

頁數(shù):16頁

時間:2018-07-26

arm_linux中斷處理_第1頁
arm_linux中斷處理_第2頁
arm_linux中斷處理_第3頁
arm_linux中斷處理_第4頁
arm_linux中斷處理_第5頁
資源描述:

《arm_linux中斷處理》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫

1、arm_linux中斷處理一、中斷注冊方法在linux內(nèi)核中用于申請中斷的函數(shù)是request_irq(),函數(shù)原型在Kernel/irq/manage.c中定義:intrequest_irq(unsignedintirq,irq_handler_thandler,unsignedlongirqflags,constchar*devname,void*dev_id)irq是要申請的硬件中斷號。handler是向系統(tǒng)注冊的中斷處理函數(shù),是一個回調(diào)函數(shù),中斷發(fā)生時,系統(tǒng)調(diào)用這個函數(shù),dev_id參數(shù)將被傳遞給它

2、。irqflags是中斷處理的屬性,若設(shè)置了IRQF_DISABLED(老版本中的SA_INTERRUPT,本版zhon已經(jīng)不支持了),則表示中斷處理程序是快速處理程序,快速處理程序被調(diào)用時屏蔽所有中斷,慢速處理程序不屏蔽;若設(shè)置了IRQF_SHARED(老版本中的SA_SHIRQ),則表示多個設(shè)備共享中斷,若設(shè)置了IRQF_SAMPLE_RANDOM(老版本中的SA_SAMPLE_RANDOM),表示對系統(tǒng)熵有貢獻(xiàn),對系統(tǒng)獲取隨機(jī)數(shù)有好處。(這幾個flag是可以通過或的方式同時使用的)dev_id在中斷共

3、享時會用到,一般設(shè)置為這個設(shè)備的設(shè)備結(jié)構(gòu)體或者NULL。devname設(shè)置中斷名稱,在cat/proc/interrupts中可以看到此名稱。request_irq()返回0表示成功,返回-INVAL表示中斷號無效或處理函數(shù)指針為NULL,返回-EBUSY表示中斷已經(jīng)被占用且不能共享。關(guān)于中斷注冊的例子,大家可在內(nèi)核中搜索下request_irq。在編寫驅(qū)動的過程中,比較容易產(chǎn)生疑惑的地方是:1、中斷向量表在什么位置?是如何建立的?2、從中斷開始,系統(tǒng)是怎樣執(zhí)行到我自己注冊的函數(shù)的?3、中斷號是如何確定的?

4、對于硬件上有子中斷的中斷號如何確定?4、中斷共享是怎么回事,dev_id的作用是?本文以2.6.26內(nèi)核和S3C2410處理器為例,為大家講解這幾個問題。二、異常向量表的建立在ARMV4及V4T以后的大部分處理器中,中斷向量表的位置可以有兩個位置:一個是0,另一個是0xffff0000??梢酝ㄟ^CP15協(xié)處理器c1寄存器中V位(bit[13])控制。V和中斷向量表的對應(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最初是在各個平臺的配置文件中設(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

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。