新文件描述符總是使用未用描述符的最小值,這個(gè)特征在某些情況下非常有用焕梅。例如,如果一個(gè)程序關(guān)閉了它的標(biāo)準(zhǔn)輸出卦洽,然后再次調(diào)用open的話贞言,那么文件描述符1將會(huì)被重新使用,并且標(biāo)準(zhǔn)輸出將會(huì)被有效的重定向到另一個(gè)文件或者設(shè)備阀蒂。
EXTI(external interrupt)外部中斷通過(guò)GPIO檢測(cè)輸入脈沖该窗,引起中斷事件,它會(huì)打斷原來(lái)代碼的執(zhí)行流程脂新,接著進(jìn)入中斷服務(wù)函數(shù)中進(jìn)行處理挪捕,處理完后在返回到中斷之前的代碼之中執(zhí)行。并且對(duì)于STM32争便,所有的GPIO都能夠用作外部中斷源的輸入端级零。
cortex內(nèi)核把能夠打斷當(dāng)前代碼執(zhí)行流程的事件分為異常和中斷。其中0-15稱為內(nèi)核異常滞乙,1奏纪、大于等于16的則稱為外部中斷,基于這些設(shè)定斩启,cortex內(nèi)核建立了一個(gè)中斷向量表序调。
盡管STM32是基于cortex-m3內(nèi)核,但是他還是重定義了繼承而來(lái)的中斷向量表兔簇,對(duì)于stm32來(lái)說(shuō)它的中斷向量表是這樣的:[-3,6]被稱為內(nèi)核異常发绢,7以上的則被稱為外部中斷。其中-3垄琐,-2边酒,-1這幾個(gè)內(nèi)核異常的優(yōu)先級(jí)是固定不可被修改的,分別表示Reset復(fù)位狸窘,NMI不可屏蔽中斷墩朦,hardfault硬件異常。這里再重點(diǎn)提一下6翻擒,它是SYSTICK氓涣,系統(tǒng)嘀嗒定時(shí)器牛哺。而大于等于0以上的中斷向量的優(yōu)先級(jí)就都可以被設(shè)置。
NVIC
NVIC(Nested Vectored Interrupt Controller)中斷控制器劳吠,中斷控制器NVIC是屬于cortex內(nèi)核里面的器件引润,既然NVIC是中斷控制器,那么它控制哪些中斷呢赴背?答案就是所有的外部中斷以及-2NMI不可屏蔽中斷都是被他處理的椰拒,其它的中斷向量他就無(wú)能為力了。因此6SYSTICK內(nèi)核異常并不由NVIC中斷控制器處理凰荚。
使用NVIC中斷控制器去處理[7以上的外部中斷以及-2NMI的第一步操作就是:首先定義一個(gè)并填充一個(gè)NVIC_InitTypeDef類型的結(jié)構(gòu)體對(duì)象。下面看看NVIC_InitTypeDef這個(gè)結(jié)構(gòu)體的定義:
typedef struct{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd
}NVIC_InitTypeDef
下面介紹一下NVIC_InitTypeDef這個(gè)結(jié)構(gòu)體的各個(gè)成員:
- NVIC_IRQChannel:將要配置的中斷向量
- NVIC_IRQChannelPreemptionPriority:用來(lái)設(shè)置中斷向量的搶占優(yōu)先級(jí)
- NVIC_IRQChannelSubPriority:用來(lái)配置中斷向量的響應(yīng)優(yōu)先級(jí)
- NVIC_IRQChannelCmd:用來(lái)DISABLE或者ENABLE該中斷
為什么需要兩個(gè)優(yōu)先級(jí)褒脯?首先無(wú)論是搶占式優(yōu)先級(jí)還是響應(yīng)式優(yōu)先級(jí)便瑟,它們都是值越小則優(yōu)先級(jí)別越高。至于搶占優(yōu)先級(jí)它是應(yīng)用于中斷嵌套的情況之中番川,值被設(shè)置的相對(duì)高的情況則能夠打斷其它中斷使自己優(yōu)先被處理到涂;關(guān)于響應(yīng)優(yōu)先級(jí)他則是應(yīng)用于這樣的情況:當(dāng)兩個(gè)搶占優(yōu)先級(jí)相同的中斷向量同時(shí)到達(dá)的話,那么先處理響應(yīng)優(yōu)先級(jí)高的那個(gè)中斷颁督。下面看一個(gè)例子:
中斷向量 | 搶占優(yōu)先級(jí) | 響應(yīng)優(yōu)先級(jí) |
---|---|---|
A | 0 | 0 |
B | 1 | 0 |
C | 1 | 1 |
根據(jù)上面的這個(gè)例子践啄,假設(shè)T時(shí)刻正在執(zhí)行C的中斷服務(wù)函數(shù),則它能夠被搶占優(yōu)先級(jí)更加高的A中斷給打斷沉御,但是不能夠被中斷B打斷屿讽。如果中斷B和中斷C同時(shí)到達(dá)的話,那么內(nèi)核先處理響應(yīng)優(yōu)先級(jí)更大的B中斷吠裆。
再STM32中伐谈,NVIC能夠配置16階優(yōu)先級(jí)別,因此需要4BIT试疙。將這4BIT應(yīng)用于搶占優(yōu)先級(jí)以及響應(yīng)優(yōu)先級(jí)诵棵,規(guī)定了下面這些方法(重點(diǎn)是比數(shù)字大小而不是位置):
- 0 全部4位用來(lái)表示響應(yīng)優(yōu)先級(jí)
- 1 1位表示搶占優(yōu)先級(jí),3位表示響應(yīng)優(yōu)先級(jí)
- 2 2位表示搶占優(yōu)先級(jí)祝旷,2位表示優(yōu)先級(jí)
- 3 1位表示響應(yīng)優(yōu)先級(jí)履澳,3位表示搶占優(yōu)先級(jí)
- 4 全部4位表示搶占優(yōu)先級(jí)
至于具體采用哪種分法,可以利用NVIC_PriorityGroupConfig()怀跛,方法接受的參數(shù)有:NVIC_PriorityGroup_0~NVIC_PriorityGroup4
stm32的所有GPIO都引入到EXTI外部中斷線上距贷,使得所有的GPIO都能夠作為外部中斷的輸入源。GPIOA0-GPIOG0連接到了EXTI0敌完,GPIOA1-GPIOG1連接到了EXTI1储耐,......,GPIOA15-GPIOG15連接到了EXTI15滨溉。需要注意的是盡管EXTIX連上了GPIOAX-GPIOGX的引腳什湘,而且這些引腳都能夠產(chǎn)生中斷长赞,但是再同一時(shí)刻EXTIX只能夠響應(yīng)一個(gè)端口的事件觸發(fā),不能夠同一時(shí)間響應(yīng)所有GPIO端口的事件闽撤,但能夠分時(shí)復(fù)用得哆。
我們的中斷向量的服務(wù)函數(shù)寫在stm32f10x_it.c文件中。