FreeRTOS 開關中斷
FreeRTOS 開關中斷函數(shù)為 portENABLE_INTERRUPTS ()和 portDISABLE_INTERRUPTS(),這兩個函數(shù)其實是宏定義,在 portmacro.h 中有定義,如下:
#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()
#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0)
可以看出開關中斷實際上是通過函數(shù) vPortSetBASEPRI(0)和 vPortRaiseBASEPRI()來實現(xiàn)的。
函數(shù) vPortSetBASEPRI()是向寄存器 BASEPRI 寫入一個值,此值作為參數(shù) ulBASEPRI 傳 遞進來,portENABLE_INTERRUPTS()是開中斷,它傳遞了個 0 給 vPortSetBASEPRI(),根據(jù)我們前面講解 BASEPRI 寄存器可知,結果就是開中斷。
函 數(shù) vPortRaiseBASEPRI() 是 向 寄 存 器 BASEPRI 寫 入 宏configMAX_SYSCALL_INTERRUPT_PRIORITY , 那 么 優(yōu) 先 級 低 于configMAX_SYSCALL_INTERRUPT_PRIORITY 的中斷就會被屏蔽!
臨界段代碼
臨界段代碼也叫做臨界區(qū),是指那些必須完整運行,不能被打斷的代碼段,比如有的外設的初始化需要嚴格的時序,初始化過程中不能被打斷。FreeRTOS 在進入臨界段代碼的時候需要關閉中斷,當處理完臨界段代碼以后再打開中斷。FreeRTOS 系統(tǒng)本身就有很多的臨界段代碼,這些代碼都加了臨界段代碼保護,我們在寫自己的用戶程序的時候有些地方也需要添加臨界段代碼保護。
FreeRTOS 與 臨 界 段 代 碼 保 護 有 關 的 函 數(shù) 有 4 個 :taskENTER_CRITICAL() 、taskEXIT_CRITICAL() 、 taskENTER_CRITICAL_FROM_ISR() 和taskEXIT_CRITICAL_FROM_ISR(),這四個函數(shù)其實是宏定義,在 task.h 文件中有定義。這四個函數(shù)的區(qū)別是前兩個是任務級的臨界段代碼保護,后兩個是中斷級的臨界段代碼保護。
任務級臨界代碼保護使用方法如下:
中斷級臨界代碼保護使用方法如下:
-
開關
+關注
關注
20文章
3298瀏覽量
97000 -
嵌入式
+關注
關注
5175文章
19979瀏覽量
324445 -
寄存器
+關注
關注
31文章
5495瀏覽量
127799 -
函數(shù)
+關注
關注
3文章
4400瀏覽量
66368 -
FreeRTOS
+關注
關注
14文章
496瀏覽量
65742
發(fā)布評論請先 登錄
轉:第15章 FreeRTOS臨界段和開關中斷
轉第16章 FreeRTOS調度鎖,任務鎖和中斷鎖
為什么ucosII移植后開關中斷函數(shù)總是報錯?
STM32,NVIC不能通過FreeRTOS開關中斷函數(shù)屏蔽中斷是怎么回事
FreeRTOS_中斷Github簡介
怎樣去使用FreeRTOS的中斷配置和臨界段呢
RTThread中開關中斷的具體實現(xiàn)過程以及進入臨界區(qū)的相關操作說明
請問ch32v307全局中斷開關定義怎樣寫?
基于STM32應用的FreeRTOS中斷設置

STM32之FreeRTOS:(一) 中斷配置和臨界段的使用

Cortex-M中斷及FreeRTOS中斷優(yōu)先級配置原理

評論