日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

簡介:linux在初始化的時候已經(jīng)把每個中斷向量的地址準(zhǔn)備好了!就是說添加中斷服務(wù)程序的框架已經(jīng)給出,當(dāng)某個中斷發(fā)生時,將會到確定的地址處去找指令,所以我們做驅(qū)動程序時,只需要經(jīng)過request_irq來掛接自己編寫的中斷服務(wù)程序即可。


ARM體系結(jié)構(gòu)中,把復(fù)位、中斷、快速中斷等都看作‘異?!?dāng)這些‘異?!l(fā)生時,CPU會到固定地址處去找指令,他們對應(yīng)的地址如下:


地址 異常類型 進(jìn)入時的工作模式 0x00000000 Reset Supervisor 0x00000004 Und Undefined 0x00000008 Soft interupt Supervisor 0x0000000c Abort(prefetch) Abort 0x00000010 Abort(data) Abort 0x00000014 Reserved Reserved 0x00000018 IRQ IRQ 0x0000001c FIQ FIQ


首先要明確的一點(diǎn)就是,無論內(nèi)存地址空間是如何映射的,以上這些地址都不會變,比如當(dāng)有快速中斷發(fā)生時,ARM將鐵定到0X0000001C這個地址處取指令。這也是BOOTLOADER把操作系統(tǒng)引導(dǎo)以后,內(nèi)存必須重映射的原因!否則操作系統(tǒng)不能真正接管整套系統(tǒng)!


LINUX啟動以后要初始化這些區(qū)域,初始化代碼在main.c中的start_kernel()中,具體是調(diào)用函數(shù)trap_ini()來實現(xiàn)的。如下面所示(具體可參照entry-armv.S):


.LCvectors: swi SYS_ERROR0

b __real_stubs_start + (vector_undefinstr - __stubs_start)

ldr pc, __real_stubs_start + (.LCvswi - __stubs_start)

b __real_stubs_start + (vector_prefetch - __stubs_start)

b __real_stubs_start + (vector_data - __stubs_start)

b __real_stubs_start + (vector_addrexcptn - __stubs_start)

b __real_stubs_start + (vector_IRQ - __stubs_start)

b __real_stubs_start + (vector_FIQ - __stubs_start)


ENTRY(__trap_init)

stmfd sp!, {r4 - r6, lr}

adr r1, .LCvectors @ set up the vectors

ldmia r1, {r1, r2, r3, r4, r5, r6, ip, lr}

stmia r0, {r1, r2, r3, r4, r5, r6, ip, lr}

add r2, r0, #0x200

adr r0, __stubs_start @ copy stubs to 0x200

adr r1, __stubs_end

1: ldr r3, [r0], #4

str r3, [r2], #4

cmp r0, r1

blt 1b

LOADREGS(fd, sp!, {r4 - r6, pc})


以上可以看出這個函數(shù)初始化了中斷向量,實際上把相應(yīng)的跳轉(zhuǎn)指令拷貝到了對應(yīng)的地址。


當(dāng)發(fā)生中斷時,不管是從用戶模式還是管理模式調(diào)用的,最終都要調(diào)用do_IRQ():


__irq_usr: sub sp, sp, #S_FRAME_SIZE

stmia sp, {r0 - r12} @ save r0 - r12

ldr r4, .LCirq

add r8, sp, #S_PC

ldmia r4, {r5 - r7} @ get saved PC, SPSR

stmia r8, {r5 - r7} @ save pc, psr, old_r0

stmdb r8, {sp, lr}^

alignment_trap r4, r7, __temp_irq

zero_fp

1: get_irqnr_and_base r0, r6, r5, lr

movne r1, sp

adrsvc ne, lr, 1b

@

@ routine called with r0 = irq number, r1 = struct pt_regs *

@

bne do_IRQ @ 調(diào)用do_IRQ來實現(xiàn)具體的中斷處理

mov why, #0

get_current_task tsk

b ret_to_user


對于以上代碼,在很多文章中都有過分析,這里不再贅述。


Linux每個中斷通過一個結(jié)構(gòu)irqdesc來描述,各中斷的信息都在這個結(jié)構(gòu)中得以體現(xiàn):


struct irqdesc {

unsigned int nomask : 1; /* IRQ does not mask in IRQ */

unsigned int enabled : 1; /* IRQ is currently enabled */

unsigned int triggered: 1; /* IRQ has occurred */

unsigned int probing : 1; /* IRQ in use for a probe */

unsigned int probe_ok : 1; /* IRQ can be used for probe */

unsigned int valid : 1; /* IRQ claimable */

unsigned int noautoenable : 1; /* don't automatically enable IRQ */

unsigned int unused :25;

void (*mask_ack)(unsigned int irq); /* Mask and acknowledge IRQ */

void (*mask)(unsigned int irq); /* Mask IRQ */

void (*unmask)(unsigned int irq); /* Unmask IRQ */

struct irqaction *action;

/*

* IRQ lock detection

*/

unsigned int lck_cnt;

unsigned int lck_pc;

unsigned int lck_jif;

};


在具體的ARM芯片中會有很多的中斷類型,每一種類型的中斷用以上結(jié)構(gòu)來表示:


struct irqdesc irq_desc[NR_IRQS]; /* NR_IRQS根據(jù)不同的MCU會有所區(qū)別*/


在通過request_irq()函數(shù)注冊中斷服務(wù)程序的時候,將會把中斷向量和中斷服務(wù)程序?qū)?yīng)起來。


我們來看一下request_irq的源碼:


int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),

unsigned long irq_flags, const char * devname, void *dev_id)

{

unsigned long retval;

struct irqaction *action;

if (irq >= NR_IRQS || !irq_desc[irq].valid || !handler ||

(irq_flags & SA_SHIRQ && !dev_id))

return -EINVAL;

action = (struct irqaction *)kmalloc(sizeof(struct irqaction), GFP_KERNEL);

if (!action) /* 生成action結(jié)構(gòu)*/

return -ENOMEM;

action->handler = handler;

action->flags = irq_flags;

action->mask = 0;

action->name = devname;

action->next = NULL;

action->dev_id = dev_id;

retval = setup_arm_irq(irq, action); /*把中斷號irq和action 對應(yīng)起來*/

if (retval)

kfree(action);

return retval;

}


其中第一個參數(shù)irq就是中斷向量,第二個參數(shù)即是要注冊的中斷服務(wù)程序。很多同仁可能疑惑的是,我們要注冊的中斷向量號是怎么確定的呢?這要根據(jù)具體芯片的中斷控制器,比如三星的S3C2410,需要通過讀取其中的中斷狀態(tài)寄存器,來獲得是哪個設(shè)備發(fā)生了中斷:


if defined(CONFIG_ARCH_S3C2410)

#include

.macro disable_fiq

.endm

.macro get_irqnr_and_base, irqnr, irqstat, base, tmp

mov r4, #INTBASE @ virtual address of IRQ registers

ldr irqnr, [r4, #0x8] @ read INTMSK 中斷掩碼寄存器

ldr irqstat, [r4, #0x10] @ read INTPND 中斷寄存器

bics irqstat, irqstat, irqnr

bics irqstat, irqstat, irqnr

beq 1002f

mov irqnr, #0

1001: tst irqstat, #1

bne 1002f @ found IRQ

add irqnr, irqnr, #1

mov irqstat, irqstat, lsr #1

cmp irqnr, #32

bcc 1001b

1002:

.endm

.macro irq_prio_table

.endm


以上代碼也告訴了我們,中斷號的確定,其實是和S3C2410手冊中SRCPND寄存器是一致的,即:


/* Interrupt Controller */

#define IRQ_EINT0 0 /* External interrupt 0 */

#define IRQ_EINT1 1 /* External interrupt 1 */

#define IRQ_EINT2 2 /* External interrupt 2 */

#define IRQ_EINT3 3 /* External interrupt 3 */

#define IRQ_EINT4_7 4 /* External interrupt 4 ~ 7 */

#define IRQ_EINT8_23 5 /* External interrupt 8 ~ 23 */

#define IRQ_RESERVED6 6 /* Reserved for future use */

#define IRQ_BAT_FLT 7

#define IRQ_TICK 8 /* RTC time tick interrupt */

#define IRQ_WDT 9 /* Watch-Dog timer interrupt */

#define IRQ_TIMER0 10 /* Timer 0 interrupt */

#define IRQ_TIMER1 11 /* Timer 1 interrupt */

#define IRQ_TIMER2 12 /* Timer 2 interrupt */

#define IRQ_TIMER3 13 /* Timer 3 interrupt */

#define IRQ_TIMER4 14 /* Timer 4 interrupt */

#define IRQ_UART2 15 /* UART 2 interrupt */

#define IRQ_LCD 16 /* reserved for future use */

#define IRQ_DMA0 17 /* DMA channel 0 interrupt */

#define IRQ_DMA1 18 /* DMA channel 1 interrupt */

#define IRQ_DMA2 19 /* DMA channel 2 interrupt */

#define IRQ_DMA3 20 /* DMA channel 3 interrupt */

#define IRQ_SDI 21 /* SD Interface interrupt */

#define IRQ_SPI0 22 /* SPI interrupt */

#define IRQ_UART1 23 /* UART1 receive interrupt */

#define IRQ_RESERVED24 24

#define IRQ_USBD 25 /* USB device interrupt */

#define IRQ_USBH 26 /* USB host interrupt */

#define IRQ_IIC 27 /* IIC interrupt */

#define IRQ_UART0 28 /* UART0 transmit interrupt */

#define IRQ_SPI1 29 /* UART1 transmit interrupt */

#define IRQ_RTC 30 /* RTC alarm interrupt */

#define IRQ_ADCTC 31 /* ADC EOC interrupt */

#define NORMAL_IRQ_OFFSET 32


這些宏定義在文件irqs.h中,大家可以看到它的定義取自S3C2410的文檔。


總結(jié)


linux在初始化的時候已經(jīng)把每個中斷向量的地址準(zhǔn)備好了!就是說添加中斷服務(wù)程序的框架已經(jīng)給出,當(dāng)某個中斷發(fā)生時,將會到確定的地址處去找指令,所以我們做驅(qū)動程序時,只需要經(jīng)過request_irq來掛接自己編寫的中斷服務(wù)程序即可。


對于快速中斷,linux在初始化時是空的,所以要對它掛接中斷處理程序,就需要單獨(dú)的函數(shù)set_fiq_handler來實現(xiàn),此函數(shù)在源文件fiq.c中,有興趣的讀者可進(jìn)一步研究。

關(guān)鍵字:ARM  Linux  中斷分析 引用地址:ARM Linux中斷分析

上一篇:關(guān)于在AMR 運(yùn)用無線模塊
下一篇:基于ARM7的GPRS無線VPN路由器設(shè)計

推薦閱讀

????新浪科技訊 北京時間1月23日早間消息,據(jù)路透社報道,中國通信設(shè)備制造商華為與中興在美國因為政治原因遇到了困難。兩家公司第四季度開支顯示,他們在去年大幅減少了游說開支?! ”M管減少了游說開支,但是華為還是繼續(xù)贊助多個通信大會,并且將資金花在了其它一些他們無需披露的地方?! ?017年,華為的游說開支為5萬美元,低于2016年的34.85...
近期,一則上海復(fù)星醫(yī)藥(集團(tuán))股份有限公司的第七屆董事會第七十八次會議的決議公告被公布,內(nèi)容上寫道達(dá)芬奇手術(shù)機(jī)器人的中國代理權(quán)轉(zhuǎn)給了直觀復(fù)星上海和直觀復(fù)星香港兩家公司,但只持有40%股份,而控股權(quán)由美國直觀醫(yī)療器械公司間接掌握。這消息一出,就有業(yè)內(nèi)人士擔(dān)憂,擁有間接控制權(quán)的ISGR將會對中國市場造成很大的影響。1999年,由美國研發(fā)的一個外...
片機(jī)位數(shù)概念:單片機(jī)是多少位是取決于數(shù)據(jù)總線的位數(shù),如常用的8位,取數(shù)據(jù)寬度為8位,每次傳送一個字節(jié)。 PIC的哈佛總線結(jié)構(gòu)而言,程序存儲器使用獨(dú)立的指令總線,所以不受數(shù)據(jù)總線的限制。PIC單片機(jī)的系統(tǒng)配置字:用于設(shè)定單片機(jī)的程序保護(hù),在線調(diào)試,低壓編程,掉電鎖存復(fù)位使能位,上電定時,看門狗,振蕩器模式等 基本的工作環(huán)境。只能由軟件在燒...
1月22日晚間 景嘉微電發(fā)布公告表示,公司全資子公司長沙景美集成電路設(shè)計有限公司(以下簡稱“景美”)于2021年1月22日與某公司(以下簡稱“某公司”)簽訂了《采購合同》,合同金額為2.57億元。截至公告披露日,公司及景美連續(xù)十二個月內(nèi)與某公司簽訂多份日常經(jīng)營性合同,合同金額累計達(dá)45,838.06萬元,合同累計金額超過公司2019年度經(jīng)審計主營業(yè)務(wù)收入的...

史海拾趣

問答坊 | AI 解惑

Freescale 的 VPU 視頻解碼后怎么顯示到指定的窗口控件上

我用Freescale Mx27 中的VPU進(jìn)行 視頻的編解碼 ,解碼后如何將視頻幀顯示到指定的窗口控件中呢,          …

查看全部問答∨

s3c2410的nand flash在燒寫后,啟動出錯,求救

s3c2410上燒wince的bootloader,燒寫過程沒錯,但重啟后出錯 超級終端啟動后,屏幕出現(xiàn)如下信息: WinCE NAND Boot v1.00 Mar 22 2007 00:02:34 Picture Boot WinCE NAND Boot v1.00 Mar 22 2007 12:25:45 dwEntry is 0x00000001 ECC ERROR ...…

查看全部問答∨

keil全局變量初始化值改變的問題

正在用keil for arm學(xué)習(xí)LPC2312,用proteus聯(lián)調(diào) 我在main.c中定義了一個全局變量led_flag和led_taber[16]的數(shù)組, 我主要是要完成用LPC2312的p0.0-p0.6這7個口作為輸出來控制7段數(shù)碼管顯示0 1 2 …E F十六個數(shù)字 用p0.7,p0.9作為外部中斷輸入, ...…

查看全部問答∨

我設(shè)計的測試的電路圖,,哪個可以幫我分析下有沒有問題??

我已經(jīng)給了一定的解釋,,哪個朋友可以幫我分析下電路可以應(yīng)用不??這個電路肯定要改進(jìn)的…

查看全部問答∨

新人來學(xué)習(xí)

我是菜鳥,我進(jìn)來和大家一起學(xué)習(xí)…

查看全部問答∨

實在搞不懂TI的ARM怎么和ST競爭?

價格貴,bug多,真是后悔選了LM3S。…

查看全部問答∨

Launchpad和俄羅斯方塊的故事~

視頻: $(\'swf_X6o\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XNDE5Nzc2M ...…

查看全部問答∨

有沒有貼片的2SK30場管

請教諸位:像2SK30,2SK241這樣的小功率場管有沒有貼片封裝的?…

查看全部問答∨

c2000 launchpad連接到電腦后提示一個未知的USB設(shè)備

我的c2000 launchpad連接到電腦后提示一個未知的USB設(shè)備,這是什么情況?…

查看全部問答∨

stm32工程文件 UTF-8編碼

對于UTF-8編碼和GBK編碼,MDK的處理不一樣,GBK編碼的文件在編輯的時候會將漢字看成兩個字符,特別不方便,還容易亂碼,所以我就將所有的文件打開重新用UTF-8保存了一遍。 …

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved