tft每日頭條

 > 生活

 > FreeRTOS配置選項中關于NVIC相關配置的說明

FreeRTOS配置選項中關于NVIC相關配置的說明

生活 更新时间:2024-09-02 14:14:32

FreeRTOS配置選項中關于NVIC相關配置的說明(FreeRTOS配置選項中關于NVIC相關配置的說明)1

NVIC 的全稱是 Nested vectored interrupt controller,即嵌套向量中斷控制器。對于 M3 内核的 MCU,每個中斷的優先級都是用寄存器中的 8 位來設置的。 8 位理論上設置 2^8 = 256 級中斷,但是實際中用不了這麼多,所以芯片廠商根據自己生産的芯片做出了調整。比如 ST的 STM32F1xx 隻使用了這個 8 位中的高四位[7:4],低四位都為零,這樣 2^4=16,隻能表示 16級中斷嵌套。

優先級分組,搶占優先級和子優先級

STM32F1xx 是隻使用了這個 8 位寄存器的高四位[7:4]。

FreeRTOS配置選項中關于NVIC相關配置的說明(FreeRTOS配置選項中關于NVIC相關配置的說明)2

就是這

FreeRTOS配置選項中關于NVIC相關配置的說明(FreeRTOS配置選項中關于NVIC相關配置的說明)3

STM32 支持 5 種優先級分組,系統上電複位後,默認使用的是優先級分組0,也就是沒有搶占式優先級,隻有子優先級,

  • 具有高搶占式優先級的中斷可以在具有低搶占式優先級的中斷服務程序執行過程中被響應,即中斷嵌套,或者說高搶占式優先級的中斷可以搶占低搶占式優先級的中斷的執行。
  • 在搶占式優先級相同的情況下,有幾個子優先級不同的中斷同時到來,那麼高子優先級的中斷優先被響應。
  • 在搶占式優先級相同的情況下,如果有低子優先級中斷正在執行,高子優先級的中斷要等待已被響應的低子優先級中斷執行結束後才能得到響應,即子優先級不支持中斷嵌套。
  • Reset、 NMI、 Hard Fault 優先級為負數,高于普通中斷優先級,且優先級不可配置。
  • 系統中斷(比如:PendSV,SVC,SysTick)不一定比外部中斷(比如 SPI,USART)要高,因為它們是在同一個 NVIC 下面設置的。

我們在上一篇筆記《FreeRTOS|FreeRTOS中斷測試》中将 NVIC 優先級分組設置為 4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);設置 NVIC 的優先級分組為 4 表示支持 0-15 級搶占優先級不支持子優先級。

在 NVIC 分組為 4 的情況下,搶占優先級可配置範圍是 0-15,那麼數值越小,搶占優先級的級别越高,即 0 代表最高優先級,15 代表最低優先級。

FreeRTOSConfig.h 中與中斷有關的配置選項 :
  1. Cortex-M内核使用8bit來配置優先級,但是STM32隻使用了高4bit,數值越小,優先級越高。在往寄存器裡面寫數值配置的時候,是按照8bit來寫的,所以需要經過轉換,公式為: ((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF),其中的priority就是我們配置的真正的優先級。

FreeRTOS配置選項中關于NVIC相關配置的說明(FreeRTOS配置選項中關于NVIC相關配置的說明)4

源碼在這:

FreeRTOS配置選項中關于NVIC相關配置的說明(FreeRTOS配置選項中關于NVIC相關配置的說明)5

2.SysTick中斷優先級配置

  • #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15

configKERNEL_INTERRUPT_PRIORITY,此宏定義是用來配置 FreeRTOS 用到的 SysTick 中斷和 PendSV 中斷的優先級。在 NVIC 分組設置為4 的情況下,此宏定義的範圍就是 0-15,即專門配置搶占優先級。這裡配置為了 15,即 SysTick和 PendSV 都是配置為了最低優先級,實際項目中也建議大家配置最低優先級即可。

  • #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

宏定義 configLIBRARY_LOWEST_INTERRUPT_PRIORITY的數值經過 4bit偏移後得到一個 8bit的優先級數值,即宏定義 configKERNEL_INTERRUPT_PRIORITY 的數值。這個 8bit 的數值才可以實際賦值給相應中斷的優先級寄存器。這裡的宏定義數值是供 PendSV 和 SysTick 中斷進行優先級配置的。 比如:我們這裡配置宏定義 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 是 0x0f,經過 4bit 偏移後就是 0xf0,即 SysTick 和 PendSV 的中斷優先級就是 240。

3.可屏蔽的中斷優先級配置

  • #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY: 用于配置STM32的特殊寄存器basepri寄存器的值,用于屏蔽中斷,當大于basepri值的優先級的中斷将被全部屏蔽。basepri隻有4bit有效,默認隻為0,即全部中斷都沒有被屏蔽。configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY配置為:5,意思就是中斷優先級大于5的中斷都被屏蔽。當把配置好的優先級寫到寄存器的時候,是按照8bit來寫的,所以真正寫的時候需要經過轉換,公式為: ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff),其中的priority就是我們配置的真正的優先級。經過這個公式之後得到的是下面的這個宏: configMAX_SYSCALL_INTERRUPT_PRIORITY。在FreeRTOS中,關中斷是通過配置basepri寄存器來實現的,關掉的中斷由配置的basepri的值決定,小于basepri值的中斷FreeRTOS是關不掉的,這樣做的好處是可以系統設計者可以人為的控制那些非常重要的中斷不能被關閉,在緊要的關頭必須被響應。此宏定義比較重要。

  • #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

宏定義 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 的數值經過 4bit 偏移後得到一個 8bit 的優先級數值,即宏定義 configMAX_SYSCALL_INTERRUPT_PRIORITY 的數值。 這個數值是賦值給寄存器 basepri 使用的,8bit 的數值才可以實際賦值給相應中斷的優先級寄存器。這裡的宏定義數值賦給寄存器 basepri 後就可以實現全局的開關中斷操作了。

FreeRTOSConfig.h文件中的關于NVIC的相關配置

FreeRTOS配置選項中關于NVIC相關配置的說明(FreeRTOS配置選項中關于NVIC相關配置的說明)6


喜歡我文章的朋友,歡迎關注、分享、點贊、評論。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved