這個是全網(wǎng)最詳細(xì)的STM32項目教學(xué)視頻。
第一篇在這里:
視頻在這里
V3:HAL庫開發(fā)、手把手教學(xué)下面功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、openmv視覺控制、電磁循跡、FreeRTOS、K210視覺智能車(更新中)、K230視覺智能車(更新中)、MSPM0G3507視覺智能車(更新中)
22.4.2-中斷優(yōu)先級相關(guān)
中斷優(yōu)先級說明(掌握)
給出中斷相關(guān)優(yōu)先級說明、中斷在freeRTOS的注意事項。
中斷是MCU的硬件特性,STM32 MCU的NVIC管理硬件中斷。STM32F103使用4位設(shè)置優(yōu)先級分組策略,用于設(shè)置中斷的搶占優(yōu)先級和次優(yōu)先級,優(yōu)先級數(shù)字越小,優(yōu)先級越高。每個中斷有一個中斷服務(wù)例程,即ISR,用于對中斷做出響應(yīng)。
FreeRTOS的運行用到中斷,F(xiàn)reeRTOS的上下文切換就是在PenSV中斷中進(jìn)行的,F(xiàn)reeRTOS還需要一個基礎(chǔ)時鐘產(chǎn)生嘀嗒信號。在CubeMX中啟用FreeRTOS后,系統(tǒng)會對NVIC做一些設(shè)置,例如。啟用FreeRTOS后,中斷優(yōu)先級分組策略自動設(shè)置為4位全部用于搶占優(yōu)先級,所以搶占優(yōu)先級編號是0到15。
這個就是加入FreeRTOS自動設(shè)置的
還有兩個參數(shù)非常重要,F(xiàn)reeRTOS并不是可以管理MCU的所有中斷,可以設(shè)置FreeRTOS可以管理那些優(yōu)先級的中斷。
configLIBRARY_LOWEST_INTERRUPT_PRIORITY: ,表示中斷的最低優(yōu)先級數(shù)值,因為中斷分組策略是4位全部用搶占優(yōu)先級,所以這個數(shù)值是15。
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY :表示FreeRTOS可管理的最高優(yōu)先級(freeRTOS中,中斷里面使用的FreeRTOS函數(shù)和任務(wù)中使用的FreeRTOS函數(shù)是不一樣的,這個我們后面會講到),默認(rèn)是5。也就是說中斷優(yōu)先級數(shù)等于或者大于5的中斷ISR里,才可以調(diào)用FreeRTOS的中斷安全API函數(shù),也就是待用"FromISR"后綴的函數(shù),使用taskDISABLE_INTERRUPTS()函數(shù)也只能屏蔽優(yōu)先級數(shù)值等于或者大于5的中斷。所以也不能在優(yōu)先級高于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY的中斷ISR里面調(diào)用FreeRTOS的API函數(shù),即便是帶"FromISR"的中斷安全函數(shù)也是不可以的。
中斷中要使用FreeRTOS的中斷級 API函數(shù)(理解)
在中斷的ISR中斷服務(wù)函數(shù)里,有時會需要調(diào)用FreeROTS的API函數(shù),但是調(diào)用普通的API函數(shù)可能會存在問題。列如,在ISR中斷服務(wù)函數(shù)里調(diào)用osDelay就會出現(xiàn)問題,因為osDelay會使任務(wù)進(jìn)入阻塞狀態(tài),而ISR中斷服務(wù)函數(shù)根本就不是任務(wù),ISR中斷服務(wù)函數(shù)運行的時候,也不能進(jìn)行任務(wù)調(diào)度。
所以FreeRTOS的API函數(shù)分為兩個版本,一個稱為"任務(wù)級" 即普通名稱的API函數(shù),另一個是"中斷級"帶有"FromISR"的函數(shù)或帶有"FROM_ISR"的宏函數(shù)。
比如我們后面在按鍵中斷中釋放和消耗二值信號量就使用"FromISR"結(jié)尾的 中斷釋放信號量函數(shù)xSemaphoreGiveFromISR
下面總結(jié)一下為什么中斷中要使用中斷級API函數(shù):
- 中斷上下文與任務(wù)上下文不同,ISR 中的代碼不能做任務(wù)調(diào)度和阻塞等操作。
- 使用中斷級 API 函數(shù)可以確保中斷中的操作是安全的,避免阻塞、調(diào)度或其他不安全的行為。
中斷及其ISR的設(shè)計原則(重點)
根據(jù)FreeRTOS管理中斷的特點,中斷的優(yōu)先級和ISR中斷服務(wù)函數(shù)程序設(shè)計應(yīng)該遵循如下原則。
- ISR的代碼應(yīng)該盡量簡短,應(yīng)該將比較耗時的處理功能轉(zhuǎn)移到任務(wù)函數(shù)里實現(xiàn).
- 在可屏蔽中斷的ISR里,能調(diào)用中斷級的FreeRTOS API函數(shù),絕對不能調(diào)用普通的FreeRTOS API函數(shù)。在不可屏蔽中斷的ISR里,不能調(diào)用任何的FreeRTOS API函數(shù)
-
中斷優(yōu)先級和任務(wù)優(yōu)先級區(qū)別
- ? MCU的中斷有中斷優(yōu)先級,有中斷服務(wù)例程(ISR); FreeRTOS的任務(wù)有任務(wù)優(yōu)先級,有任務(wù)函數(shù)。這兩者的特點和區(qū)別具體如下。中斷是MCU的硬件特性,由硬件事件或軟件信號引起中斷,運行哪個ISR是由硬件決定的。中斷的優(yōu)先級數(shù)字越小,表示優(yōu)先級越高,所以中斷的最高優(yōu)先級為0。
- ? FreeRTOS 的任務(wù)是一個純軟件的概念,與硬件系統(tǒng)無關(guān)。任務(wù)的優(yōu)先級是開發(fā)者在軟件中賦予的,任務(wù)的優(yōu)先級數(shù)字越低,表示優(yōu)先級越低,所以任務(wù)的最低優(yōu)先級為0。FreeRTOS 的任務(wù)調(diào)度器決定哪個任務(wù)處于運行狀態(tài),F(xiàn)reeRTOS 在中斷優(yōu)先級為 15 的PendSV中斷里進(jìn)行上下文切換,所以,只要有中斷ISR在運行, FreeRTOS就無法進(jìn)行任務(wù)切換。
- ? 任務(wù)只有在沒有ISR運行的時候才能運行,即使優(yōu)先級最低的中斷,也可以搶占高優(yōu)先級的任務(wù)的執(zhí)行,而任務(wù)不能搶占 ISR 的運行。
在實際的軟件設(shè)計中,一般要盡量簡化ISR的功能,使其盡量少占用CPU的時間。一般的硬件中斷都是處理一些數(shù)據(jù)的接收或發(fā)送工作,例如,采用中斷方式進(jìn)行ADC數(shù)據(jù)采集時,只需在 ADC 的中斷里將數(shù)據(jù)讀取到緩沖區(qū),而對數(shù)據(jù)進(jìn)行濾波、頻譜計算等耗時間的工作,就轉(zhuǎn)移到任務(wù)函數(shù)里處理。