FreeRTOS 中斷配置和臨界段

2022-03-19 01:07:30 字數 1614 閱讀 2486

中斷遮蔽暫存器

primask、faultmask和basepri

1.primask:這是個只有1個位的暫存器。當它置1時, 就關掉所有可遮蔽的異常,只剩下 nmi和硬fault可以響應。它的預設值是0,表示沒有關中斷

2.faultmask:這是個只有1個位的暫存器。當它置1時,只有nmi才能響應,所有其它的異常,包括中斷和fault,通通閉嘴。它的預設值也是0,表示沒有關異常

3.basepri:這個暫存器最多有9位(由表達優先順序的位數決定)。它定義了被遮蔽優先順序的閾值。當它被設成某個值後,所有優先順序號大於等於此值的中斷都被關閉(優先順序號越大,優先順序越低)。但若被設成0,則不關閉任何中斷,0也是預設值

法一:cm3 還專門設定了一條cps指令

cpsid i ;primask=1 ;關中斷

cpsie i ;primask=0 ;開中斷

cpsid f ;faultmask=1 ;關異常

cpsie f ;faultmask=0 ;開異常

法二:使用mrs/msr指令

mrs r0, basepri   ;讀取 basepri 到 r0 中

mrs r0, faultmask ;似上

mrs r0, primask ;似上

movs r0, #1

msr basepri, r0

;寫入 r0 到 basepri 中

msr faultmask, r0

;似上msr primask, r0

;似上

臨界段**

臨界段**也叫做臨界區,是指那些必須完整執行,不能被打斷的**段,比如有的外設的初始化需要嚴格的時序,初始化過程中不能被打斷

//進入臨界段

#define

taskenter_critical()

portenter_critical()

//任務級臨界段**保護

#define

taskenter_critical_from_isr()

portset_interrupt_mask_from_isr()

//退出臨界段

#define

taskexit_critical()

portexit_critical()

//中斷級臨界段**保護

#define

taskexit_critical_from_isr( x )

portclear_interrupt_mask_from_isr( x )

#define portenter_critical()        vportentercritical();

#define portexit_critical() vportexitcritical();

}void vportexitcritical( void )

}

四 FreeRTOS 中斷配置和臨界段

freertos 的中斷配置是乙個很重要的內容,我們需要根據所使用的 mcu 來具體配置。因此要先了解 mcu 架構中有關中斷的知識。中斷由硬體產生,當中斷產生以後 cpu 就會中斷當前的流程轉而去處理中斷服務,待中斷服務函式執行完後再回來執行之前被中斷的任務。cortex m 核心的 mcu 提供...

FreeRTOS臨界段函式 開關中斷函式呼叫關係

1 freertos開關中斷函式分別為portenable interrupts 和portdisable interrupts 2 freertos臨界段保護相關函式 taskenter critical taskexit critical taskenter critical from isr ...

001 FreeRTOS中斷配置

一 優先順序看 022 stm32中斷優先順序分組解析 二 freertos的中斷配置中沒有處理亞優先順序 響應優先順序 的情況,所以只能配置成組4,16個都為搶占優先順序 三 此巨集用來設定 mcu 使用幾位優先順序,stm32 使用的是 4 位,因此此巨集為 4!2 4 16,那麼就有16個優先...