日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F103+UCOS-II 实现临界区不关闭重要中断

發布時間:2025/4/5 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 实现临界区不关闭重要中断的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。