STM32F103+UCOS-II 实现临界区不关闭重要中断
使用stm32時,在ucos進入臨界區代碼時,我們需要關閉掉中斷,出臨界區后再開啟中斷。使用如下代碼:
#define OS_CRITICAL_METHOD 3#if OS_CRITICAL_METHOD == 3 #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} #endif那如果我們用到某些中斷需要快速響應,那么這時候這個關中斷很顯然會使我們的快速響應中斷受到影響,那么有什么辦法在使用ucos關中斷時,放過我們需要快速響應的中斷呢?接下來我們給大家介紹一個我們今天的主角寄存器:basepri;可能很多人對這個寄存器不熟悉,那我們先來認識一下,看下圖:
那我們怎么實現呢?我們先來看看ucos具體是怎么實現我們的關中斷的,從上面程序我們知道OS_ENTER_CRITICAL()是進入中斷,那我們來看看OS_CPU_SR_Save具體做了什么:
os_cpu_a.asm文件下OS_CPU_SR_SaveMRS R0, PRIMASK ; Set prio int mask to mask all (except faults)CPSID IBX LROS_CPU_SR_RestoreMSR PRIMASK, R0BX LR我們看到他使用了PRIMASK,那么我們從上面寄存器表可以看到這個寄存器置1后,將關閉我們所有的可以關閉的中斷。那么如果我們要關閉某些呢?那就要換成用basepri寄存器。basepri寄存器最多有9位(由表達優先級的位數決定,STM32F103中,高4位有效),它定義了被屏蔽優先級的閾值。當它設定成某個值后,所有優先級大于等于此值的中斷都被關(優先級號越大,優先級越低)。小于此值的中斷不會被關閉。若設成0,則不關閉任何中斷,0是缺省值。我們將上面這段匯編代碼改一下:
os_cpu_a.asm文件下MASK_INTERRUPT_PRIORITY EQU 0X01 OS_CPU_SR_SaveMRS R0,BASEPRI MOVS R1,#(MASK_INTERRUPT_PRIORITY<< 4) MSR BASEPRI,R1 BX LR OS_CPU_SR_RestoreMSR BASEPRI,R0 BX LR然后系統簡化中斷設置,只設置搶占式優先級,不要子優先級。搶占式優先級(0-15),子優先級都為0。
? ? ? UCOS的SYSTICK中斷及PENDSV中斷設定在最低優先級
? ? ?? #define ConfigKERNEL_INTERRUPT_PRIORITY_PENSV (15)
? ? ?? #define ConfigKERNEL_INTERRUPT_PRIORITY_SYSTICK (14)
? ? ? ? Pendsvde 的優先級在OS_CPU_A.S的OSStartHighRdy中設置,優先級最低為15.
我們要放一馬的中斷設置為最高0,那么這時候該中斷將不會被關閉。
?
?
?
總結
以上是生活随笔為你收集整理的STM32F103+UCOS-II 实现临界区不关闭重要中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于KEIL的stm32远程在线调试
- 下一篇: 一、烧写最小linux系统