[FreeRTOS- 野火] - - - 臨界段

一、介紹

臨界段最常出現在對一些全局變量進行操作的場景。

1.1 臨界段的定義

臨界段是指在多任務系統中,一段需要獨占訪問共享資源的代碼。在這段代碼執行期間,必須確保沒有任何其他任務或中斷可以訪問或修改相同的共享資源。

臨界段的主要目的是防止多個任務或中斷同時訪問共享資源,從而避免數據不一致或競態條件。

1.2 臨界段的特點

  • 1、互斥訪問:

    • 臨界段內的代碼必須確保在任何時刻只有一個任務或中斷可以訪問共享資源。

    • 其他任務或中斷必須等待,直到當前任務或中斷完成對共享資源的訪問。

  • 2、短小精悍:

    • 臨界段的代碼應該盡可能短小,以減少對系統性能的影響。

    • 長時間的臨界段可能會導致系統響應延遲,影響實時性。

  • 3、明確的入口和出口:

    • 臨界段必須有明確的入口和出口。

    • 入口處通常會禁用中斷,出口處會恢復中斷。

1.3 臨界段的實現方式

在RTOS中,臨界段可以通過以下幾種方式實現:

  • 1、禁用中斷:

    • 直接禁用所有中斷:通過設置硬件寄存器(如Cortex-M的 PRIMASK)來禁用所有中斷。

    • 設置中斷優先級閾值:通過設置硬件寄存器(如Cortex-M的 BASEPRI)來屏蔽優先級高于某個值的中斷。

  • 2、使用互斥量(Mutex):

    • 互斥量是一種同步原語,用于確保對共享資源的互斥訪問。

    • 任務在訪問共享資源前必須先獲取互斥量,訪問完成后釋放互斥量。

// 創建互斥量
SemaphoreHandle_t xMutex = xSemaphoreCreateMutex();// 獲取互斥量
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE)
{// 臨界段代碼
}// 釋放互斥量
xSemaphoreGive(xMutex);
  • 3、使用信號量(Semaphore):

    • 信號量是一種計數器,用于控制對共享資源的訪問。

    • 任務在訪問共享資源前必須先獲取信號量,訪問完成后釋放信號量。

// 創建信號量
SemaphoreHandle_t xSemaphore = xSemaphoreCreateBinary();// 獲取信號量
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE)
{// 臨界段代碼
}// 釋放信號量
xSemaphoreGive(xSemaphore);
  • 4、使用自旋鎖(Spinlock):

    • 自旋鎖是一種簡單的同步機制,任務在獲取鎖時會不斷嘗試,直到獲取成功。

    • 自旋鎖通常用于短時間的臨界段,以減少上下文切換的開銷。

二、Cortex-M內核快速關中斷指令

為了快速地開關中斷, Cortex-M 內核專門設置了一條 CPS 指令,有 4 種用法,具體如下:

CPSID I ;PRIMASK=1 ;	//關中斷
CPSIE I ;PRIMASK=0 ;	//開中斷
CPSID F ;FAULTMASK=1 ;	//關異常
CPSIE F ;FAULTMASK=0 ;	//開異常

在ARM Cortex-M系列處理器中,PRIMASK、FAULTMASK 和 BASEPRI 是三個用于控制中斷和異常處理的系統級寄存器。

2.1 PRIMASK

  • 功能:禁用除NMI(不可屏蔽中斷)和Hard Fault(硬件故障)之外的所有異常和中斷。

  • 作用機制:設置 PRIMASK (通過 MSR PRIMASK, #1 或 CPSID I;)把當前中斷優先級提為0,來屏蔽除NMI和Hard Fault之外的所有異常和中斷。

  • 典型用途:用于快速進入臨界區,保護關鍵代碼段不被中斷打斷,例如在RTOS任務切換或共享資源訪問等應用中。

  • 特點:簡單易用,但對系統實時性影響較大,長時間開啟可能導致高優先級中斷無法響應。

是一個單一比特的寄存器。缺省值是0,表示沒有關中斷。

2.2 FAULTMASK

  • 功能:禁用除NMI之外的所有異常和中斷,包括Hard Fault。

  • 作用機制:設置 FAULTMASK(通過MSR FAULTMASK, #1或CPSID F ;)會把當前中斷優先級提升到-1,僅允許NMI。

  • 典型用途:在異常處理程序中臨時屏蔽可能引發嵌套故障的操作(如內存訪問)。

  • 特點:比PRIMASK更嚴格,可能影響系統穩定性,僅在特權模式(Privileged Mode)下可修改。

是一個只有1位的寄存器。缺省值是0,表示沒有關異常。

2.3 BASEPRI

  • 功能:基于優先級的動態中斷屏蔽,僅屏蔽優先級低于閾值的中斷。

  • 作用機制:設置 BASEPRI (通過 MSR BASEPRI, #priority)允許優先級低于閾值的中斷繼續執行,高于閾值的中斷被屏蔽。

  • 典型用途:靈活控制中斷優先級,允許高優先級任務/中斷優先執行,同時屏蔽低優先級中斷。

  • 特點:更精細的控制,避免完全禁用所有中斷,但需要合理設置優先級閾值,否則可能導致意外屏蔽。

三、關中斷

關中斷函數分為帶返回值不帶返回值兩種。

3.1 不帶返回值的關中斷函數

static portFORCE_INLINE void vPortRaiseBASEPRI( void )		// 不帶返回值的函數是不能嵌套的
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;__asm{/* Set BASEPRI to the max syscall priority to effect a criticalsection. */msr basepri, ulNewBASEPRI			// 11 大于11的中斷不能被響應 小于11則可以 根據 configMAX_SYSCALL_INTERRUPT_PRIORITY 的值來配置dsbisb}
}
  • dsb(Data Synchronization Barrier):數據同步屏障,確保所有之前的內存訪問操作(如讀寫操作)都完成后再繼續執行后續代碼。
  • isb(Instruction Synchronization Barrier):指令同步屏障,確保所有之前的指令都執行完成后再繼續執行后續代碼。

3.2 帶返回值的關中斷函數

static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void )		// 可嵌套
{
uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;__asm{/* Set BASEPRI to the max syscall priority to effect a criticalsection. */mrs ulReturn, basepri					// 先將 basepri 的值保存在 返回值中msr basepri, ulNewBASEPRI			// 再設置 basepri 的值dsbisb}return ulReturn;
}

四、開中斷

static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{__asm{/* Barrier instructions are not used as this function is only used tolower the BASEPRI value. */msr basepri, ulBASEPRI}
}

五、進入/退出臨界段的宏

5.1 進入臨界段的宏

5.1.1 不帶中斷保護

#define taskENTER_CRITICAL() portENTER_CRITICAL()	// task.h中定義#define portENTER_CRITICAL() vPortEnterCritical()	// portmacro.h中定義#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()	// portmacro.h中定義

5.1.2 帶中斷保護

#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()	// task.h 中定義#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI()	// portmacro.h 中定義

5.2 退出臨界段的宏

5.2.1 不帶中斷保護

#define taskEXIT_CRITICAL() portEXIT_CRITICAL()		// task.h 中定義#define portEXIT_CRITICAL() vPortExitCritical()		// portmacro.h 中定義#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 )	//portmacro.h 中定義

5.2.2 帶中斷保護

#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )	// task.h 中定義#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x)	//  portmacro.h 中定義

六、臨界段代碼的應用

在 FreeRTOS 中,對臨界段的保護出現在兩種場合,一種是在中斷場合,一種是在非中斷場合

6.1 中斷場合

// 在中斷場合,臨界段可以嵌套
{uint32_t ulReturn;// 進入臨界段,臨界段可以嵌套ulReturn = taskENTER_CRITICAL_FROM_ISR();// 臨界段代碼// 退出臨界段taskEXIT_CRITICAL_FROM_ISR( ulReturn );
}

6.2 非中斷場合

// 非中斷場合,臨界段不能嵌套
{// 進入臨界段taskENTER_CRITICAL();// 臨界段代碼// 退出臨界段taskEXIT_CRITICAL();
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907528.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vad-R1:通過從感知到認知的思維鏈進行視頻異常推理

文章目錄 速覽摘要1 引言2 相關工作視頻異常檢測與數據集視頻多模態大語言模型具備推理能力的多模態大語言模型 3 方法:Vad-R13.1 從感知到認知的思維鏈(Perception-to-Cognition Chain-of-Thought)3.2 數據集:Vad-Reasoning3.3 A…

CSS Day07

1.搭建項目目錄 2.網頁頭部SEO三大標簽 3.Favicon圖標與版心 (1)Favicon圖標 (2)版心 4.快捷導航 5.頭部-布局 6.頭部-logo 7.頭部-導航 8.頭部-搜索 9頭部-購物車 10.底部-布局 11.底部-服務區域 12.底部-幫助中心 13.底部-版權…

Flutter圖片Image、本地圖片、程程圖片、圓片剪切、圓形圖片

目錄 圖片組件的介紹 1.Image.network加載圖片 1.1 Image scale圖片縮小一倍 1.2 Image alignment使用 1.3 Image fit 屬性的取值及說明 1.3.1 Contain 默認效果 1.3.2 Fill 圖片會縮放至完全填滿目標區域(寬高) 1.3.3 Fill 圖片會縮放至完全填滿目…

Prometheus學習之pushgateway和altermanager組件

[rootnode-exporter41 /usr/local/alertmanager-0.28.1.linux-amd64]# pwd /usr/local/alertmanager-0.28.1.linux-amd64[rootnode-exporter41 /usr/local/alertmanager-0.28.1.linux-amd64]# cat alertmanager.yml # 通用配置 global:resolve_timeout: 5msmtp_from: 914XXXXX…

NHANES指標推薦:CQI

文章題目:The impact of carbohydrate quality index on menopausal symptoms and quality of life in postmenopausal women 中文標題:碳水化合物質量指數對絕經后婦女更年期癥狀和生活質量的影響 發表雜志:BMC Womens Health 影響因子&…

【cpp-httplib】 安裝與使用

cpp-httplib 1. 介紹2. 安裝3. 類與接口3.1 httplib請求3.2 httplib響應3.3 httplib服務端3.4 httplib客戶端 4. 使用4.1 服務端4.2 客戶端 1. 介紹 C HTTP 庫(cpp-httplib)是一個輕量級的 C HTTP 客戶端/服務器庫,它提供了簡單的 API 來創建…

Electron-vite【實戰】MD 編輯器 -- 系統菜單(含菜單封裝,新建文件,打開文件,打開文件夾,保存文件,退出系統)

最終效果 整體架構 src/main/index.ts import { createMenu } from ./menu在 const mainWindow 后 // 加載菜單createMenu(mainWindow)src/main/menu.ts import { BrowserWindow, Menu, MenuItem, MenuItemConstructorOptions, dialog, shell } from electron import fs from…

【第4章 圖像與視頻】4.5 操作圖像的像素

文章目錄 前言示例-獲取和修改圖像數據圖像數據的遍歷方式圖像濾鏡負片濾鏡黑白濾鏡浮雕濾鏡filter濾鏡屬性 前言 getImageData() 與 putImageData() 這兩個方法分別用來獲取圖像的像素信息,以及向圖像中插入像素。與此同時,如果有需要,也可…

【Docker 從入門到實戰全攻略(一):核心概念 + 命令詳解 + 部署案例】

1. 是什么 Docker 是一個用于開發、部署和運行應用程序的開源平臺,它使用 容器化技術 將應用及其依賴打包成獨立的容器,確保應用在不同環境中一致運行。 2. Docker與虛擬機 2.1 Docker(容器化) 容器化是一種輕量級的虛擬化技術…

Vue:axios(POST請求)

發送 POST 請求 基本用法 axios.post(/api/login, {username: lcyyyy,password: 123456 }) .then(response > {console.log(請求成功:, response.data); }) .catch(error > {console.error(請求失敗:, error); });在 Vue 組件中使用 export default {methods: {async …

一周學會Pandas2之Python數據處理與分析-數據重塑與透視-unstack() - 解堆 (行 -> 列)

鋒哥原創的Pandas2 Python數據處理與分析 視頻教程: 2025版 Pandas2 Python數據處理與分析 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili unstack() 是 pandas 中用于數據重塑的重要方法,它與 stack() 互為逆操作。unstack() 的主要功能是將行索…

基于大模型預測的FicatIII-IV期股骨頭壞死綜合治療研究報告

目錄 一、引言 1.1 研究背景與目的 1.2 國內外研究現狀 1.3 研究意義和創新點 二、FicatIII-IV 期股骨頭壞死概述 2.1 疾病定義與分期 2.2 病因與病理機制 2.3 臨床癥狀與診斷方法 三、大模型預測原理與方法 3.1 大模型簡介 3.2 數據收集與預處理 3.3 模型訓練與優…

C++?多態!!!

一、引言 眾所周知,C有三大特性,它們分別是封裝、繼承和多態,在之前的文章中已經詳細介紹過封裝和繼承了,今天我們將一起學習多態相關的知識,如果還想了解封裝、繼承相關的知識,可以跳轉到以下鏈接&#xf…

electron安裝報錯處理

electron安裝報錯 解決方法: 修改 C:\Users\用戶名.npmrc下配置文件 添加代碼 electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ electron_builder_binaries_mirrorhttps://npmmirror.com/mirrors/electron-builder-binaries/最后代碼 registryhtt…

Windows10下使用QEMU安裝Ubuntu20.04虛擬機,并啟用硬件加速

Windows10下使用QEMU安裝Ubuntu20.04虛擬機,并啟用硬件加速 作者將狼才鯨創建日期2025-05-30 CSDN閱讀地址:Windows10下使用QEMU安裝Ubuntu20.04虛擬機,并啟用硬件加速 本文檔源碼地址:Windows10下使用QEMU安裝Ubuntu20.04虛擬機…

頂刊SCS | 基于視覺語言大模型推理分割的建筑足跡尺度功能分類, 樣本數據和代碼已開源!

論文介紹 題目:Visual-language reasoning segmentation (LARSE) of function-level building footprint across Yangtze River Economic Belt of China 期刊:Sustainable cities and society(中科院一區TOP,IF10.5)…

【軟件】navicat 官方免費版

Navicat Premium Lite https://www.navicat.com.cn/download/navicat-premium-lite

每個路由器接口,都必須分配所屬網絡內的 IP 地址,用于轉發數據包

在IP網絡中,主機(Host)和路由器接口(Router Interface)都需要分配網絡地址(IP地址)。 1. 主機(Host)的IP地址分配 (1) 作用 主機的IP地址用于唯一標識該設備&#xff0…

鴻蒙OSUniApp頁面切換動效實戰:打造流暢精致的轉場體驗#三方框架 #Uniapp

UniApp頁面切換動效實戰:打造流暢精致的轉場體驗 引言 在移動應用開發中,頁面切換動效不僅能提升用戶體驗,還能傳達應用的品質感。隨著HarmonyOS的普及,用戶對應用的動效體驗要求越來越高。本文將深入探討如何在UniApp中實現流暢…

Tesseract OCR 安裝與中文+英文識別實現

一、下載 https://digi.bib.uni-mannheim.de/tesseract/ 下載,盡量選擇時間靠前的(識別更好些)。符合你的運行機(我的是windows64) 持續點擊下一步安裝,安裝你認可的路徑即可,沒必要配置環境變…