首页
/
每日頭條
/
生活
/
FreeRTOS配置選項中關于NVIC相關配置的說明
FreeRTOS配置選項中關于NVIC相關配置的說明
更新时间:2024-10-05 09:12:07

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


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

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
2022國際跳棋培訓班
2022國際跳棋培訓班
2022國際跳棋培訓班?新華社福州5月27日電(記者林凱)27日,受國家體育總局棋牌運動管理中心、中國國際跳棋協會委托,由福建省社會體育指導中心承辦的全國國際跳棋初級輔導員培訓班(福建)在福州開班,今天小編就來說說關于2022國際跳棋培訓班...
2024-10-05
大衆攬巡會不會降價
大衆攬巡會不會降價
1937年成立、1938年在沃爾夫斯堡建成當時世界上最大的汽車廠,受到福特的啟發,彼時的大衆承擔起在德國将汽車這一交通工具“國民化”的使命。大衆汽車的德語名稱為Volkswagen,其中,Volks在德語中意為“國民”,Wagen在德語中意...
2024-10-05
反滲透膜生命周期
反滲透膜生命周期
在反滲透設備出水中TDS值意味着什麼?什麼程度該換膜了?膜分離設備在水淨化中起着特有的功效,即除去水裡的懸浮固體.病菌.病毒感染.無機化合物.滅蟲劑.有機化合物和融解汽體。膜分離技術在中國的運用起源于20時代70年代。自20世際90時代至今...
2024-10-05
呼吸的深度是什麼
呼吸的深度是什麼
呼吸的深度是什麼?呼吸深度是呼吸的強弱程度,就是說一次呼吸的氣體交換程度比如說深呼吸,就是指最大的限度的一次性氣體交換,今天小編就來說說關于呼吸的深度是什麼?下面更多詳細答案一起來看看吧!呼吸的深度是什麼呼吸深度是呼吸的強弱程度,就是說一次...
2024-10-05
克裡琴科史上輸得最慘的一次
克裡琴科史上輸得最慘的一次
都知道,大小克裡琴科是拳壇學曆最高的拳王,也是最有紳士風度的兩兄弟,在他們十幾年職業生涯中,從未在賽前和對手動過手,但即使是這樣,大克裡琴科還是被對手扇了一個大嘴巴,此人就是英國著名拳手德裡克·切索拉。1983年切索拉出生于津巴布韋首都哈拉...
2024-10-05
Copyright 2023-2024 - www.tftnews.com All Rights Reserved