中斷遮蔽暫存器
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個優先...