FreeRTOS的中斷配置是一個(gè)很重要的內(nèi)容,這里需要根據(jù)dsPIC33C的中斷知識(shí)來(lái)配置。我們首先了解下dsPIC33C的中斷向量表(IVT),IVT位于程序存儲(chǔ)器中,如下圖所示。起始單元地址是0x000004,IVT包含6個(gè)不可屏蔽陷阱向量和最多246個(gè)中斷源。一般來(lái)說(shuō)每個(gè)中斷源都有自己的中斷向量。每個(gè)中斷向量都包含一個(gè)24位寬的地址。每個(gè)中斷向量單元中編程的值是其相關(guān)的中斷服務(wù)程序(ISR)的起始地址。對(duì)于0x000014~0x001FE的中斷向量在指定的用戶優(yōu)先級(jí)內(nèi)具有固定的優(yōu)先級(jí),同一用戶優(yōu)先級(jí)的中斷向量根據(jù)其自然優(yōu)先級(jí)區(qū)分優(yōu)先順序。自然優(yōu)先級(jí)與中斷向量在向量表中的位置有關(guān)。一般來(lái)說(shuō),較低地址的中斷向量具有較高的自然優(yōu)先級(jí)。例如,與向量0(地址0x000014)相關(guān)的中斷比任何其他向量地址的中斷具有更高的自然優(yōu)先級(jí)。
每個(gè)中斷可以指定的用戶優(yōu)先級(jí)有7個(gè)1~7。1是用戶可選的最低優(yōu)先級(jí),7是最高優(yōu)先級(jí)。滴答定時(shí)器Timer1初始化函數(shù)vApplicationSetupTickTimerInterrupt()中將中斷優(yōu)先級(jí)設(shè)為configKERNEL_INTERRUPT_PRIORITY,這里是最低優(yōu)先級(jí)1。每個(gè)用戶中斷優(yōu)先級(jí)最簡(jiǎn)單的設(shè)置方法為借助MAPLAB x IDE的插件MCC進(jìn)行圖形化的配置,如下圖。
介紹完了每個(gè)用戶中斷的優(yōu)先級(jí)情況,我們繼續(xù)了解dsPIC33CK CPU的優(yōu)先級(jí)設(shè)定,CPU優(yōu)先級(jí)的設(shè)定由SR寄存器中的IPL[2:0]和CORCON寄存器中的IP[3]共同組合形成的IPL[3:0]制定。但從寄存器可以看出IPL[3]不可寫(xiě)'1',因此實(shí)際CPU的優(yōu)先級(jí)并不能大于7,所以用戶軟件不能屏蔽陷阱事件(不可屏蔽中斷的中斷優(yōu)先級(jí)大于7)。同時(shí)由SR寄存器可知,默認(rèn)CPU的優(yōu)先級(jí)IPL[2:0]為0,低于用戶中斷的最低優(yōu)先級(jí)1,因此所有的用戶中斷都可以打斷CPU。
根據(jù)上一節(jié)FreeRTOS裁剪中關(guān)于中斷優(yōu)先級(jí)的宏定義配置情況,我們可以畫(huà)出下圖,也就是RTOS希望優(yōu)先級(jí)5~7的中斷永遠(yuǎn)不被禁止,不會(huì)因?yàn)閳?zhí)行FreeRTOS內(nèi)核而延遲,并且這些中斷不可調(diào)用FreeRTOS的API函數(shù);而優(yōu)先級(jí)1~4是可以被RTOS管理的,也就是RTOS可以根據(jù)需要禁止這些中斷,這些中斷可以調(diào)用FreeRTOS的API函數(shù)。
FreeRTOS開(kāi)關(guān)中斷函數(shù)為portENABLE_INTERRUPTS()和portDISABLE_INTERRUPTS(),這兩個(gè)函數(shù)其實(shí)是宏定義,在portmacro.h中有定義,如下:
可以看出,關(guān)中斷時(shí)將CPU的優(yōu)先級(jí)IPL[2:0]設(shè)置為configMAX_SYSCALL_INTERRUPT_PRIORITY,因此優(yōu)先級(jí)小于等于configMAX_SYSCALL_INTERRUPT_PRIORITY的中斷會(huì)被FreeRTOS內(nèi)核屏蔽;類似的開(kāi)中斷的實(shí)現(xiàn)通過(guò)將CPU的優(yōu)先級(jí)IPL[2:0]設(shè)置為0。