0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UEFI中的中斷處理流程

冬至子 ? 來(lái)源:UEFI社區(qū) ? 作者:Wolf ? 2023-06-30 11:48 ? 次閱讀

1

中斷向量表

你有沒(méi)有好奇過(guò),0內(nèi)存地址開(kāi)始放了些什么東西呢?畢竟是最開(kāi)始就要用的東西,一定非常重要!沒(méi)錯(cuò),那里就是中斷向量表的家。在8086開(kāi)始,中斷向量表就占據(jù)這里,甚至在我們最新時(shí)髦的酷睿x代,它們還在這里。想不想看看這個(gè)頑固的家伙的樣子?寫(xiě)個(gè)簡(jiǎn)單的 程序:

long *p = (long *) 0;

printf(“%x”, *p);

運(yùn)行下看看。不出所料你的程序?qū)a(chǎn)生一個(gè)異常,導(dǎo)致被強(qiáng)制關(guān)閉。還記得我們前面講過(guò)地址轉(zhuǎn)換,這個(gè)0地址是虛擬地址而不是物理地址,在保護(hù)模式下0的虛擬地址訪問(wèn)會(huì)產(chǎn)生一個(gè)異常,你是訪問(wèn)不到物理0地址的。我們?cè)趦?nèi)核模式使用一些技巧或者我們進(jìn)入實(shí)模式,我們才能看到它們。每個(gè)中斷向量(vector)占據(jù)4個(gè)字節(jié),Intel定義了256個(gè)向量,共用去1KB的內(nèi)存空間。每個(gè)向量樸實(shí)無(wú)華,就是一個(gè)地址,指向該中斷(INT)處理函數(shù)的入口,這也是它起名vector的原因。整個(gè)中斷向量表就是一個(gè)大函數(shù)指針表,一個(gè)中斷發(fā)生,CPU硬件就來(lái)這里查表,跳到相應(yīng)地址就行了,好方便!實(shí)際情況稍微復(fù)雜點(diǎn),CPU還要保護(hù)現(xiàn)場(chǎng),將當(dāng)前環(huán)境保存起來(lái)(一些寄存器和返回地址等壓棧),以便處理完后返回現(xiàn)場(chǎng)繼續(xù)執(zhí)行。不過(guò)相對(duì)于我們接下來(lái)的保護(hù)模式的中斷處理簡(jiǎn)單很多。沒(méi)錯(cuò),這個(gè)史前遺跡只在實(shí)模式發(fā)揮作用,我們只草草看看它的樣子就行了:

圖片

這里主要是異常處理

圖片

硬件中斷向量一區(qū)。和我們上文的8259連接兩相對(duì)照一下:

圖片

沒(méi)錯(cuò),這里就是主8259的IRQ的中斷向量區(qū)。接下來(lái)就是BIOS保留區(qū),作為介紹BIOS的專區(qū),這里必須看一下:

圖片

PC傳統(tǒng)Legacy BIOS的服務(wù)例程都在這里??吹剿鼈儾粍龠駠u,曾經(jīng)INT 10H打字和INT 13H讀寫(xiě)磁盤(pán)的美(YUAN)好(SHI)日子又浮現(xiàn)在眼前。。。不好,這是個(gè)暴露年齡的話題,后面我們就不講了,下課。

開(kāi)個(gè)玩笑,不過(guò)中斷向量表今天也只在UEFI BIOS為了兼容傳統(tǒng)OS啟動(dòng)的CSM模塊中起作用,我們大致了解一下其中的原理即可。

2

中斷描述符

在PC進(jìn)入保護(hù)模式,一個(gè)復(fù)雜但有很多妙處的機(jī)制代替了中斷向量表,它就是中斷描述符表(IDT,interrupt Descriptor Table)。IDT將每個(gè)中斷或者異常與它的服務(wù)例程連接起來(lái)。IDT不再固定放在某個(gè)位置,而是可以放在IDTR寄存器指向的任意內(nèi)存(說(shuō)是任意,也不能太隨性,有些小要求,如8字節(jié)對(duì)齊等),IDT的表項(xiàng)也從4個(gè)字節(jié)擴(kuò)展到8個(gè)字節(jié),大小也可以不滿256,IDTR也指出了它的最大限制。如圖:

圖片

IDT除了和中斷向量一樣指向一個(gè)例程地址之外,還包括其他一些信息

圖片

其中的DPL(描述符特權(quán)級(jí))與CS寄存器的CPL完成特權(quán)級(jí)的檢查,可以避免低特權(quán)級(jí)的代碼通過(guò)軟件中斷形式提權(quán)。它的運(yùn)作形式和中斷向量表類似,更多的是安全檢查和可能的執(zhí)行環(huán)境切換(例如ring 3 -> ring 0)。

3

中斷和異常

ARM體系中斷和異常是單獨(dú)處理的,IRQ中斷只是異常列表里的一項(xiàng)而已。X86中斷和異常處理卻混雜在一起,使用同一套機(jī)制,看似比較混亂。其實(shí)異常往往是處理器內(nèi)部發(fā)生的,是同步的;而中斷卻是外部事件,是異步的。而它們的分布也是不同的,0到31號(hào)向量保留給異常,而更高的則往往是硬件中斷和軟件中斷。異常分為三種:錯(cuò)誤,陷阱和中止。這三種類型CPU對(duì)它們有不同的處理原則:錯(cuò)誤往往是可以恢復(fù)的,錯(cuò)誤修正后再執(zhí)行剛才的錯(cuò)誤就不會(huì)出問(wèn)題了,改了就是好同志嘛!例如常用于內(nèi)存管理的缺頁(yè)異常,OS常常把內(nèi)存換出到硬盤(pán),它會(huì)在頁(yè)表上動(dòng)些手腳,CPU再次訪問(wèn)這塊內(nèi)存會(huì)發(fā)生異常,OS頁(yè)面錯(cuò)誤異常例程捕獲到后趕緊把內(nèi)存換回來(lái),然后返回原處執(zhí)行,就像沒(méi)事發(fā)生一樣。陷阱是留給軟件挖坑的,CPU希望軟件自己挖的坑自己能填上,它可以裝作沒(méi)看見(jiàn),從下條繼續(xù)。典型的例子是INT 3,我們的幾乎所有調(diào)試工具(VS,windbg,甚至UEFI的source level debugger)都用它添加軟件斷點(diǎn)。中止就嚴(yán)重了,意味著發(fā)生硬件錯(cuò)誤了,它往往能造成Windows藍(lán)屏,linux panic等。異常一覽表如下:

圖片

20到31被預(yù)留將來(lái)使用。硬件中斷往往就從32開(kāi)始。

4

中斷優(yōu)先級(jí)

PIC模式IRQ數(shù)目越低就意味著優(yōu)先級(jí)越高。而在APIC模式下,IOAPIC連接的24個(gè)IRQ是平權(quán)的,先后并不關(guān)乎優(yōu)先級(jí)高低。決定中斷優(yōu)先級(jí)的是它對(duì)應(yīng)的中斷向量的大小,X86體系有256個(gè)vector, 中斷優(yōu)先級(jí)的計(jì)算公式是:

優(yōu)先級(jí) = vector num / 16

即每16個(gè)中斷一組,共享一個(gè)優(yōu)先級(jí),共16個(gè)。因?yàn)?2以下vector被異常和保留占據(jù),2到15是中斷的優(yōu)先級(jí)。數(shù)字越大越高優(yōu)先級(jí)。中斷優(yōu)先級(jí)的控制是靠LAPIC的TPR(Task Priority Register,任務(wù)優(yōu)先級(jí)寄存器)來(lái)控制的,它的結(jié)構(gòu)如下:

圖片

TR只有4位標(biāo)識(shí)可以接受的中斷優(yōu)先級(jí),即16個(gè)。CPU內(nèi)核只處理優(yōu)先級(jí)比TR大的中斷,也意味著TR每提高一個(gè)數(shù)字,就有16個(gè)中斷被遮蔽!看來(lái)我們的中斷要想被趕快處理,必須占個(gè)好位置。那么是不是IRQ數(shù)目越大,vector就越大呢?這是誰(shuí)來(lái)決定的呢?這事可不由BIOS做主,OS是設(shè)置vector的主人。而不同的OS的處理也不近相同,我們具體看一下。

中斷處理實(shí)踐

Windows、Linux和BIOS在處理中斷上有很多區(qū)別。我們從幾個(gè)方面浮光掠影了解一二。

1

中斷向量設(shè)置

PIC如何設(shè)置中斷向量已經(jīng)過(guò)時(shí),我們就不提了。這里只介紹APIC模式,如果你還記得上節(jié)關(guān)于IOAPIC的內(nèi)容,其中最重要的PRT表,它由24個(gè)RTE( RedirectionTableEntry)項(xiàng)組成,每一項(xiàng)對(duì)應(yīng)一個(gè)IRQ引腳。它的內(nèi)容除了上節(jié)介紹過(guò)的Destination Field之外,最低8位是該IRQ對(duì)應(yīng)的vector,可以表示256個(gè)vector。OS根據(jù)自己的策略,為IRQ分配不同的vector。

1. Windows:

Windows的HAL在設(shè)置vector時(shí)是根據(jù)系統(tǒng)枚舉硬件時(shí)挨個(gè)設(shè)置的,因?yàn)橄让杜e的設(shè)備其IRQ的大小不確定,所以優(yōu)先級(jí)并無(wú)一定之規(guī)。從vector不能推導(dǎo)IRQ,IRQ也不能推導(dǎo)vector,可以說(shuō)全憑運(yùn)氣。為硬件IRQ分配的vector往往從0x31開(kāi)始分配,應(yīng)該是為了配合Windows的IRQL概念。大家可以在windbg里輸入命令

!idt -a

查看一下自己機(jī)器的vector分配情況。這個(gè)IRQL比較讓人混淆,實(shí)際上它并不是個(gè)硬件概念,和中斷優(yōu)先級(jí)并不同,它是微軟定義的一套軟件優(yōu)先級(jí)方案。Windows用0到31來(lái)表示優(yōu)先級(jí),數(shù)值越大,優(yōu)先級(jí)越高。如下圖:

圖片

其中DPC/Dispatch是個(gè)分水嶺,運(yùn)行在這個(gè)優(yōu)先級(jí)的線程不會(huì)被其他線程搶占。其上3到26是為了外圍硬件保留的。最高的31顯得很高大上,誰(shuí)的地位這么高?你一定見(jiàn)過(guò)它,它就是在Windows藍(lán)屏?xí)r的IRQL。HAL會(huì)把IRQL翻譯到不同的硬件平臺(tái)上,它和X86的中斷優(yōu)先級(jí)不是一個(gè)概念。

2. Linux:

Linux沒(méi)有IRQL的概念,他的vector就從0x20(32)開(kāi)始分配,但是因?yàn)?x80(128)因?yàn)闅v史原因,被保留做系統(tǒng)調(diào)用(后改用sysenter指令,但為了兼容,還是保留),整個(gè)空間被一份為二。后面到0xee(238)為止。因?yàn)関ector的大小關(guān)系到優(yōu)先級(jí),分配的時(shí)候?yàn)榱吮WC對(duì)各個(gè)IOAPIC公平,分配的時(shí)候在各個(gè)IOAPIC間輪流分配。大家可以在shell里輸入以下命令查看一下中斷向量的分配情況:

cat /proc/interrupts

2

IRQ在多處理器的分發(fā)

還有個(gè)問(wèn)題十分重要。某個(gè)vector由哪個(gè)CPU內(nèi)核負(fù)責(zé)處理呢?Linux為了公平起見(jiàn),并不會(huì)對(duì)BSP(bootstrap processor)另眼看待,所有內(nèi)核一視同仁。Linux通過(guò)填寫(xiě)IOAPIC的RTE中的Delivery mode選擇最低優(yōu)先級(jí)策略,讓TRP都被初始化做固定值,因此IRQ信號(hào)就可以公平的在CPU之間分發(fā)。感覺(jué)很民主有沒(méi)有?(分分鐘被Linus的獨(dú)裁作風(fēng)打臉)。有時(shí)為了優(yōu)化性能,我們可以通過(guò)Linux的IRQ親緣性來(lái)讓特定內(nèi)核為我們服務(wù)。我們可以通過(guò)命令

cat /proc/irq/xx/smp_affinity

查看xx IRQ由誰(shuí)處理,如果是f的話代表是缺省策略,即大家都可以處理。我們可以通過(guò)下面命令分配個(gè)專有內(nèi)核處理

echo 2 >/proc/irq/xx/smp_affinity

讓APIC ID為2的內(nèi)核處理。或者通過(guò)一些Irqbalance類似的工具來(lái)幫我們配置。

3

UEFI固件中的中斷

UEFI固件內(nèi)核中對(duì)異常和中斷都有處理,還包含很多使用IPI調(diào)度內(nèi)核的源程序,程序短小精干,包括大量注釋。感興趣的同學(xué)可以通過(guò)它學(xué)習(xí)中斷處理和CPU內(nèi)核調(diào)度。

1. 異常

UEFI內(nèi)核對(duì)IDT的初始化程序在UefiCpuPkg的Library/CpuExceptionHandlerLib下。內(nèi)核為所有的的中斷和異常都分配了統(tǒng)一的入口CommonExceptionHandler。它對(duì)任何中斷和異常沒(méi)有任何特殊處理,如果沒(méi)有人對(duì)該中斷或異常做處理就會(huì)dump一些現(xiàn)在的CPU狀態(tài)如APIC ID, 異常類型等,然后調(diào)用CpuDeadLoop陷入死循環(huán),這也是UEFI工程師常見(jiàn)的畫(huà)面。UEFI驅(qū)動(dòng)可以在自己關(guān)心的異常中添加自己的處理函數(shù),如支持通過(guò)串口和USB源程序級(jí)調(diào)試UEFI程序的Source Level Debugger就是個(gè)典型的例子,它Hook住了很多異常,用于調(diào)試和捕捉錯(cuò)誤,

2. 中斷

UEFI的CSM模塊還兼容以前BIOS使用的INT x軟中斷方式調(diào)用BIOS服務(wù)。隨著UEFI的廣泛推廣和傳統(tǒng)OS的漸漸淘汰,CSM也日薄西山,有些僅僅面向最新OS的項(xiàng)目都不含CSM的支持,所以關(guān)于它的內(nèi)容這里略過(guò)。在保護(hù)模式下,UEFI內(nèi)核僅僅對(duì)時(shí)鐘中斷進(jìn)行了處理,并通過(guò)Timer Architectural Protocol開(kāi)放出來(lái)供所有UEFI程序調(diào)用。也許你會(huì)好奇,那么多種USB設(shè)備和網(wǎng)卡等等的UEFI驅(qū)動(dòng)難道不需要中斷處理?是的,他們的中斷在UEFI階段都沒(méi)有開(kāi)啟,他們的驅(qū)動(dòng)通過(guò)Timer加Polling的方式來(lái)處理。舉個(gè)例子,我們?cè)赨EFI Shell 下插入鍵盤(pán),它能立刻起作用不是如在OS中USB控制器產(chǎn)生了中斷。而是USB驅(qū)動(dòng)注冊(cè)了個(gè)Timer,過(guò)一會(huì)就Poll一下看看有沒(méi)有新設(shè)備插入。就是這個(gè)Timer發(fā)現(xiàn)了新插入的鍵盤(pán)的。

這種僅僅依靠Timer的做法在OS階段是行不通的,會(huì)帶來(lái)嚴(yán)重的效能和功耗問(wèn)題。但是在Boot階段卻問(wèn)題不大,而且這樣做保證了UEFI內(nèi)核的簡(jiǎn)潔性。事實(shí)上,UEFI并不禁止驅(qū)動(dòng)自己開(kāi)啟中斷,但開(kāi)啟中斷需要處理的中斷共享、IOAPIC設(shè)置等等問(wèn)題需要驅(qū)動(dòng)自己解決,UEFI并不提供支持。

3. IPI

內(nèi)核可以通過(guò)寫(xiě)自己LAPIC的ICR(Interrupt Command Register)發(fā)出IPI((Inter-Processor Interrupt)調(diào)度別的內(nèi)核完成任務(wù),這也是任務(wù)調(diào)度的基本方法。事實(shí)上,因?yàn)锳PIC ID的不連續(xù)性,我們正是通過(guò)發(fā)送IPI的方法來(lái)統(tǒng)計(jì)內(nèi)核的數(shù)量。BSP在啟動(dòng)時(shí)需要統(tǒng)計(jì)系統(tǒng)中可用的內(nèi)核時(shí),發(fā)送廣播IPI,讓大家都來(lái)報(bào)道,BSP開(kāi)始點(diǎn)數(shù),1,2,3。。。并一一記錄在案。在啟動(dòng)OS前,通過(guò)ACPI table告訴OS有多少個(gè)內(nèi)核。OS不應(yīng)該自己統(tǒng)計(jì)內(nèi)核數(shù)目,事實(shí)上固件可以通過(guò)瞞報(bào)內(nèi)核的方式將部分內(nèi)核挪作他用,但誰(shuí)會(huì)這么做呢?

如何發(fā)起IPI在CPU package里有大量實(shí)例和庫(kù),大家可以參考。

其他

一些容易混淆的名詞這里要特別說(shuō)明一下

IRQ x:起源于PIC,指中斷引腳,后在APIC時(shí)代沿用,泛指中斷號(hào)。

Vector x/INT x: X是中斷向量,如前文所說(shuō) IRQ不等于INT和vector.

PIRQ : PCI IRQ。它是描述南橋內(nèi)部PCI設(shè)備的IRQ配置關(guān)系的。我們下一篇文章介紹。

GSI :Global System Interrupt,是ACPI spec規(guī)定的全局中斷表。它為多IOAPIC情況下確定了系統(tǒng)唯一的一個(gè)中斷號(hào)。例如IOAPIC1有24個(gè)IRQ,IOAPIC2也有24個(gè)IRQ,則IOAPIC2 的GSI是從24開(kāi)始,GSI = 24 + IRQ(IOAPIC2)。

SCI :System Control Interrupt,系統(tǒng)控制中斷,是ACPI定義的,專用于ACPI電源管理的一個(gè)IRQ。它在Intel平臺(tái)上常常與南橋的電源管理模塊一起,當(dāng)外部EC等發(fā)生Event后會(huì)引發(fā)SCI。Windows的SCI ISR程序就是著名的acpi.sys。acpi.sys在收到SCI后會(huì)檢查GPE狀態(tài)寄存器以確定是誰(shuí)引發(fā)的event,然后按照ACPI spec要求調(diào)用相應(yīng)Method。詳情請(qǐng)參照ACPI spec??梢哉J(rèn)為SCI是ACPI定義的所有電源管理事件的總?cè)肟?,它?duì)應(yīng)的IRQ在一般情況下是不能修改的。SCI是如何報(bào)告和簡(jiǎn)單的GPE method我們?cè)谙乱黄袝?huì)詳細(xì)介紹。

結(jié)語(yǔ)

說(shuō)了這么多,如果我們從硬件和軟件方面,梳理整個(gè)中斷設(shè)置和處理的鏈條,會(huì)發(fā)現(xiàn)還有個(gè)環(huán)節(jié)沒(méi)有解決。那就設(shè)備的IRQ是誰(shuí)來(lái)決定的?是硬件hard wired?還是軟件可以配置?OS是如何知道這些信息的呢?OS又是怎么知道IOAPIC的數(shù)目和位置的呢?這些都是UEFI固件需要解決的問(wèn)題,我們?cè)谙乱黄恼轮袝?huì)詳細(xì)說(shuō)明。在此之前,如以往一樣,有幾個(gè)思考問(wèn)題可以讓大家加深對(duì)中斷和UEFI的理解:

1.中斷的引入,必然帶來(lái)了代碼重入的問(wèn)題。我們知道,這可以通過(guò)設(shè)定優(yōu)先級(jí)、信號(hào)量/臨界區(qū)等等辦法來(lái)解決。UEFI是通過(guò)什么方法呢?TPL和IRQL的相似和區(qū)別又是什么呢?

2.UEFI內(nèi)核還不支持多線程,我們?nèi)绻枰黾佣嗑€程調(diào)度,僅僅依靠時(shí)鐘中斷,夠不夠用呢?

3.OS利用缺頁(yè)異??梢哉{(diào)度內(nèi)存到硬盤(pán)上和實(shí)現(xiàn)Lazy loading等等實(shí)用的功能。UEFI的SMM內(nèi)核也開(kāi)啟了缺頁(yè)異常,但是卻為了另外一個(gè)目的,你能看出是為了什么嗎?

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5301

    瀏覽量

    119865
  • ARM處理器
    +關(guān)注

    關(guān)注

    6

    文章

    360

    瀏覽量

    41636
  • 中斷處理
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    10949
  • Linux驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    9942
  • DPL芯片
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    5742
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ARM系統(tǒng)預(yù)引導(dǎo)固件的新機(jī)遇-UEFI

    固件之間的接口。此外,UEFI的平臺(tái)初始化(PI)負(fù)責(zé)定義固件到芯片之間和固件內(nèi)部的接口。 UEFI處理器架構(gòu)無(wú)關(guān)?! RM公司,蘋(píng)果,惠普和微軟的專家們一起確定了UEFI的ARM
    發(fā)表于 08-23 09:06

    UEFI有什么定義?

     EFI的出現(xiàn)第一次被正式提出,是在2000年的Intel春季IDF上,經(jīng)過(guò)幾次修訂,現(xiàn)在已經(jīng)到了EFI 1.10版,而2.0版正由UEFI這個(gè)組織制定(故EFI也現(xiàn)稱為UEFI)。
    發(fā)表于 10-30 09:12

    如何切換BIOS啟動(dòng)與UEFI啟動(dòng) bios與uefi切換方法

    1.首先進(jìn)入BIOS,電腦開(kāi)機(jī)時(shí)按你電腦對(duì)應(yīng)的鍵進(jìn)入BIOS,不知道按鍵可以看下表查詢?;蛘咴陔娔X開(kāi)機(jī)時(shí)有屏幕有短暫的提示按鍵,看下自己的電腦按鍵是哪個(gè)就行。2.開(kāi)啟UEFI方法以下的設(shè)置項(xiàng)有的
    發(fā)表于 06-05 11:54

    結(jié)合生活例子,講講中斷處理流程。

    的事件打斷了。仔細(xì)研究一下生活中斷,對(duì)于我們學(xué)習(xí)單片機(jī)的中斷也很有好處。中斷處理流程可以分
    發(fā)表于 08-28 07:41

    HAL庫(kù)外部中斷處理流程

    文章目錄一、中斷1、中斷全過(guò)程2、中斷優(yōu)先級(jí)3、HAL庫(kù)外部中斷處理流程4、
    發(fā)表于 01-12 07:33

    中斷處理函數(shù)(IRQHandler)的標(biāo)準(zhǔn)流程

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是以i.MXRT的GPIO模塊為例談?wù)?b class='flag-5'>中斷處理函數(shù)(IRQHandler)的標(biāo)準(zhǔn)流程。  在痞子衡舊文 《串口(UART)自動(dòng)波
    發(fā)表于 02-09 07:10

    8253中斷服務(wù)程序流程

    8253中斷服務(wù)程序流程圖 希望發(fā)電機(jī)P =
    發(fā)表于 05-03 00:12 ?4885次閱讀
    8253<b class='flag-5'>中斷</b>服務(wù)程序<b class='flag-5'>流程</b>圖

    linux中斷處理之IRQ中斷

    在前一個(gè)專題里曾分析過(guò)所有IRQ中斷處理流程,經(jīng)過(guò)SAVE_ALL保存硬件環(huán)境后,都會(huì)進(jìn)入do_IRQ()進(jìn)行處理,今天接著分析do_IRQ()處理
    發(fā)表于 05-10 10:57 ?2573次閱讀

    處理異常和中斷解決

    異常是能夠引起程序流偏離正常流程的事件,當(dāng)異常發(fā)生時(shí),正在執(zhí)行的程序就會(huì)被掛起,處理器轉(zhuǎn)而執(zhí)行一塊與該事件相關(guān)的代碼(異常處理)。事件可以是外部輸入,也可以是內(nèi)部產(chǎn)生的,外部產(chǎn)生的事件通常被稱作
    的頭像 發(fā)表于 10-12 17:14 ?4960次閱讀

    STM32中斷系統(tǒng)(NVIC和EXTI)

    EXTIEXTI (External interrupt) 就是指外部中斷,通過(guò) GPIO 檢測(cè)輸入脈沖,引起中斷事件,打斷原來(lái)的代碼執(zhí)行流程,進(jìn)入到中斷服務(wù)函數(shù)中進(jìn)行
    發(fā)表于 01-14 15:51 ?5次下載
    STM32<b class='flag-5'>中斷</b>系統(tǒng)(NVIC和EXTI)

    STM32中斷系統(tǒng)的工作流程

    一、前言 在之前的STM32的中斷系統(tǒng)理論基礎(chǔ)知識(shí)之基本原理及NVIC,分別中斷的基本原理,中斷的管理機(jī)制和中斷
    的頭像 發(fā)表于 06-22 09:17 ?2421次閱讀
    STM32<b class='flag-5'>中斷</b>系統(tǒng)的工作<b class='flag-5'>流程</b>

    中斷的完整流程是什么樣子

    Service Routine, ISR)。這個(gè)函數(shù)是用于處理特定中斷的程序,當(dāng)發(fā)生中斷時(shí),處理器會(huì)跳轉(zhuǎn)到這個(gè)函數(shù)執(zhí)行相應(yīng)的操作。 ?將中斷
    的頭像 發(fā)表于 10-30 17:12 ?1087次閱讀

    中斷及ARM體系對(duì)中斷處理

    今天來(lái)看一下中斷及ARM體系對(duì)中斷處理,直接進(jìn)入正題。 中斷是指計(jì)算機(jī)運(yùn)行過(guò)程,出現(xiàn)某些意
    的頭像 發(fā)表于 11-07 17:11 ?662次閱讀
    <b class='flag-5'>中斷</b>及ARM體系<b class='flag-5'>中</b>對(duì)<b class='flag-5'>中斷</b>的<b class='flag-5'>處理</b>

    FIQ為例說(shuō)明其中斷處理流程

    可能是其它的,但是肯定關(guān)于此時(shí)CPU狀態(tài)的。)然后跳轉(zhuǎn)到異常向量 表入口處執(zhí)行中斷處理流程 。 2-執(zhí)行中斷處理
    的頭像 發(fā)表于 11-07 17:48 ?1210次閱讀

    stm32中斷怎么處理

    中斷是指在程序執(zhí)行過(guò)程,由硬件或軟件的觸發(fā)而打斷正常的程序執(zhí)行流程,暫時(shí)轉(zhuǎn)去執(zhí)行特定的處理程序,并在完成后返回原來(lái)的程序流程。
    的頭像 發(fā)表于 01-02 17:35 ?2416次閱讀