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