FreeRTOS-中斷管理

學習內容

中斷概念

中斷是計算機系統中一種重要的事件驅動機制,用于在特定條件下打斷正在執行的程序,并跳轉到預定義的中斷處理程序中執行特定的操作。當發生中斷時,處理器會立即中止當前正在執行的指令,保存當前的執行狀態,并執行相應的中斷處理程序。

中斷可以由多種事件觸發,例如硬件設備的狀態改變、定時器溢出、外部信號等。常見的中斷事件包括鍵盤輸入、鼠標移動、網絡數據到達等。

中斷的作用是實現對實時事件的及時響應。通過中斷,計算機系統能夠在發生特定事件時立即中斷當前任務,執行與該事件相關的處理程序,以確保及時處理和響應事件。中斷能夠提高系統的實時性、可靠性和可處理性。

中斷的處理過程包括以下步驟:

  1. 中斷觸發:某個事件觸發中斷,如硬件設備發出中斷請求信號。
  2. 中斷響應:處理器檢測到中斷請求,并立即中止當前執行的指令。
  3. 保存現場:處理器保存當前的執行狀態(如程序計數器、寄存器等),以便在中斷處理完成后能夠恢復執行。
  4. 中斷服務程序執行:處理器跳轉到預定義的中斷服務程序(ISR),執行與中斷相關的操作。
  5. 中斷處理完成:中斷服務程序執行完成后,處理器恢復之前保存的執行狀態,并繼續執行原來的程序。

通過合理使用中斷,可以實現并發處理、異步事件處理和實時響應,提高系統的性能和可靠性。中斷在各種計算機系統中廣泛應用,包括嵌入式系統、操作系統和實時系統等。

?

ARM中的中斷優先級

ARM Cortex-M 使用了 4 位寬的寄存器來配置中斷的優先等級,這個寄存器就是中斷優先級配置寄存器。

GD32中,分為搶占優先級和子優先級。(數值越小,優先級越高)

分組

搶占優先級

響應優先級

分組0

0(可取值為0)

4(可取值為0到15)

分組1

1(可取值為0到1)

3(可取值為0到7)

分組2

2(可取值為0到3)

2(可取值為0到3)

分組3

3(可取值為0到7)

1(可取值為0到1)

分組4

4(可取值為0到15)

0(可取值為0)

通常我們在代碼中來進行配置:

nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);

全局中斷的意思是,把全局的中斷優先級大概定義到一個區間,具體到哪種類型的中斷,自行去配置合適的優先級。因此,我們對于一些中斷源可以通過以下代碼來配置優先級:

nvic_irq_enable(xxx_irqn, 6, 0); // >= 5

上面中的全局中斷配置,配置為搶占優先級為4,響應優先級為0,那么就把具體中斷源的區間給框定了。搶占優先級取值介于0到15,響應優先級只能為0。因此,上面配置具體中斷源優先級為5和0,在全局中斷源的范疇內。當然你設置一個范圍不在范疇內,是不生效,或者會出現其他問題。

通常在FreeRTOS配置外設的中斷優先級都在5及以上 (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)

FreeRTOS的中斷優先級

FreeRTOSConfig.h中,configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY配置了中斷優先級:

#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5

默認位置為5。

在GD32中,優先級的數值越小,優先級越高。通過優先級分組可以知道,優先級分為0到15個等級。那么FreeRTOS中的這個優先級是什么含義呢?

開啟中斷和關閉中斷:

portENABLE_INTERRUPTS();
portDISABLE_INTERRUPTS();

優先級配置注意

低于或等于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 優先級的中斷函數(數值越大,優先級越低),FreeRTOS的API函數才能對其生效。例如configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY為5,則中斷函數配置的參數必須為[5, 15]的任意值。(所有優先級均為搶占優先級時)

?

中斷優先級和任務優先級

示例

  1. 創建timer中斷,每秒打印數據
  2. 創建任務,掃描按鍵事件
  3. 當按鍵按下,關閉所有中斷,當按鍵再次按下,開啟中斷
  4. 觀察效果

注意:vTaskDelay和delay_1ms的有區別

//main.c
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "FreeRTOS.h"
#include "task.h"
#include "usart0.h"TaskHandle_t            start_handler;
TaskHandle_t            task_key_handler;void task_key(void *pvParameters) {uint32_t flag = 0;FlagStatus pre_state = RESET;while(1) {FlagStatus state = gpio_input_bit_get(GPIOA, GPIO_PIN_0);if(SET == state && pre_state == RESET) {// 當前高電平, 上一次為低電平,按下pre_state = state;if(flag == 0) {printf("disable \r\n");// 關閉中斷portDISABLE_INTERRUPTS();} else if(flag == 1) {// 開啟中斷printf("enable \r\n");portENABLE_INTERRUPTS();}flag++;if(flag > 1) flag = 0;} else if(RESET == state && pre_state == SET) {// 當前高電平, 上一次為低電平,抬起pre_state = state;}delay_1ms(20);}
}void Usart0_recv(uint8_t *data, uint32_t len) {printf("recv: %s\r\n", data);
}static void GPIO_config() {// 時鐘初始化rcu_periph_clock_enable(RCU_GPIOA);// 配置GPIO模式gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_0);
}#define PRESCALER	10000
#define FREQ	    1static void TIMER_config() {// 時鐘配置rcu_periph_clock_enable(RCU_TIMER5);// 復位定時器timer_deinit(TIMER5);rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);timer_parameter_struct tps;timer_struct_para_init(&tps);tps.prescaler = PRESCALER - 1; // 分頻系數  240 000 000tps.period = SystemCoreClock / PRESCALER / FREQ - 1; // 周期計數值 1Hztimer_init(TIMER5, &tps);nvic_irq_enable(TIMER5_DAC_IRQn, 5, 0);timer_interrupt_enable(TIMER5, TIMER_INT_UP);timer_enable(TIMER5);
}void TIMER5_DAC_IRQHandler(void) {if(SET == timer_interrupt_flag_get(TIMER5, TIMER_INT_UP)) {printf("timer\r\n");}//清除中斷標志位timer_interrupt_flag_clear(TIMER5,TIMER_INT_FLAG_UP);
}void start_task(void *pvParameters) {GPIO_config();Usart0_init();TIMER_config();printf("start\r\n");taskENTER_CRITICAL();xTaskCreate(task_key, "task_key", 64, NULL, 2, &task_key_handler);vTaskDelete(start_handler);taskEXIT_CRITICAL();
}int main(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);xTaskCreate(start_task, "start_task", 128, NULL, 1, &start_handler);vTaskStartScheduler();while(1) {}
}

?

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

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

相關文章

圖像梯度處理與邊緣檢測

在圖像處理的世界里&#xff0c;我們常常需要從復雜的像素矩陣中提取有意義的信息 —— 比如一張照片中物體的輪廓、醫學影像中病灶的邊界、自動駕駛視野里的道路邊緣。這些 “邊界” 或 “輪廓” 在專業術語中被稱為 “邊緣”&#xff0c;而捕捉邊緣的核心技術&#xff0c;離不…

GPU服務器與PC 集群(PC農場):科技算力雙子星

在數字經濟高速發展的今天&#xff0c;算力已成為驅動科技創新與產業變革的核心引擎。GPU服務器憑借其強大的并行計算能力&#xff0c;在圖形渲染、人工智能訓練等領域展現出不可替代的優勢&#xff1b;而PC集群則通過分布式架構&#xff0c;以高性價比和靈活擴展特性&#xff…

秋招Day19 - 分布式 - 分布式鎖

單體時代&#xff0c;可以直接用本地鎖來實現對競爭資源的加鎖&#xff0c;分布式環境下就要用到分布式鎖了有哪些分布式鎖的實現方案&#xff1f;MySQL分布式鎖、Zookeeper分布式鎖、Redis分布式鎖MySQL分布式鎖如何實現&#xff1f;創建一張鎖表&#xff0c;對字段定義唯一性…

AIStarter平臺亮點解析:從ComfyUI項目上架到一鍵運行的完整指南

大家好&#xff01;今天分享一個AIStarter平臺的深度體驗&#xff0c;帶你了解如何通過這個平臺輕松上架和運行AI項目&#xff01;視頻中&#xff0c;博主在凌晨分享了AIStarter的強大功能&#xff0c;重點展示了ComfyUI 4.0和5.0整合包的上架過程&#xff0c;以及如何簡化AI項…

電腦錄屏軟件推薦:如何使用oCam錄制游戲、教程視頻

在工作、學習或游戲過程中&#xff0c;我們經常需要錄制電腦屏幕&#xff0c;比如制作教程視頻、記錄游戲操作、分享軟件使用過程等。oCam 是一款功能強大且操作簡單的屏幕錄制工具&#xff0c;支持 Windows 系統&#xff0c;深受用戶喜愛。今天簡鹿辦公就來手把手教你如何使用…

安裝cuml報錯

安裝命令 &#xff08;注意cuda的版本&#xff09; pip install --no-cache-dir --extra-index-urlhttps://pypi.nvidia.com cuml-cu11 報錯&#xff1a; 找了很多網上的教程 1.版本問題 沒解決 pip install --upgrade pip pip install --upgrade setuptools 2.參考下面博…

【ECharts?】解決Vue 中 v-show 導致組件 ECharts 樣式異常問題

解決Vue 中 v-show 導致組件 ECharts 樣式異常問題 問題概述 在使用 Vue 的 v-show 指令實現 <PageOne/>、<PageTwo/>、<PageThree/> 三個視圖的定時切換時&#xff0c;<PageTwo/> 顯示時出現了異常&#xff0c;具體表現為 ECharts 圖表渲染圖表尺寸異…

旅游管理虛擬仿真實訓室:重構實踐教學新生態

在旅游產業數字化轉型與教育信息化深度融合的背景下&#xff0c;旅游管理虛擬仿真實訓室成為連接理論教學與行業實踐的關鍵紐帶。它通過沉浸式技術還原旅游場景&#xff0c;解決傳統實訓中資源受限、風險較高、時空局限等問題&#xff0c;為旅游管理專業人才培養提供全新路徑。…

【在線五子棋對戰】十、對戰玩家匹配管理模塊

文章目錄前言Ⅰ. 匹配隊列實現Ⅱ. 匹配隊列管理類實現完整代碼前言 五子棋對戰的玩家匹配是根據自己的天梯分數進行匹配的&#xff0c;而服務器中將玩家天梯分數分為三個檔次&#xff1a; 青銅&#xff1a;天梯分數小于 2000 分白銀&#xff1a;天梯分數介于 2000~3000 分之間…

k8s之ingress定義https訪問方式

接上文&#xff1a;https://blog.csdn.net/soso678/article/details/149607069?spm1001.2014.3001.5502定義后端應用與service [rootmaster ingress]# cat my-nginx.yml apiVersion: apps/v1 kind: Deployment metadata:name: my-nginx spec:selector:matchLabels:run: my-n…

《C++ vector 完全指南:vector的模擬實現》

《C vector 完全指南&#xff1a;vector的模擬實現》 文章目錄《C vector 完全指南&#xff1a;vector的模擬實現》一、定義vector的成員變量二、用vector實現動態二維數組三、vector的接口實現1.vector的默認成員函數&#xff08;1&#xff09;構造函數實現&#xff08;2&…

騰訊云代碼助手使用指南

騰訊云代碼助手使用指南什么是騰訊云代碼助手功能區展示功能介紹功能演示一、創建新項目1.先用Chat 把口語化的需求轉換成AI更容易接受的結構化提示詞2.再用Craft 模式進行代碼生成3.成果展示二、老項目探索1.使用Codebase 幫理解項目代碼三、代碼補全1.只需輸入標準的函數名&a…

【vue3+vue-pdf-embed】實現PDF+圖片預覽

【vue3vue-pdf-embed】實現PDF圖片預覽項目背景項目代碼分析代碼項目背景 技術棧&#xff1a;vue3Tselementplus 需要實現PDF和圖片預覽 圖片預覽很好解決了&#xff0c;可以用elementplus 自帶的組件el-image 可實現 PDF預覽可以用搜了一圈&#xff0c;有兩個方案&#xff0c…

Leetcode力扣解題記錄--第21題(合并鏈表)

題目鏈接&#xff1a;21. 合并兩個有序鏈表 - 力扣&#xff08;LeetCode&#xff09; 題目描述 將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 示例 1&#xff1a; 輸入&#xff1a;l1 [1,2,4], l2 [1,3,4] 輸出&…

基于單片機的樓宇門禁系統的設計與實現

2、系統總體設計 2.1硬件的總體設計 為了使門禁系統智能化&#xff0c;需要一個主控芯片對整個門禁系統進行管理控制。接著還需要對應的模塊完成包括數字密碼驗證和IC卡識別驗證的功能。當出現非法闖入、驗證失敗等情況時還需要對操作人員進行警告。最后需要一個人機交互界面方…

全天候自動化數字型智能驅鳥裝置,電網防鳥高科技

鳥類在輸電線路鐵塔、電線桿上筑巢、棲息和排泄是個大問題&#xff0c;很容易引發線路故障導致停電。為了保障電網安全穩定運行&#xff0c;會用到各種智能驅鳥裝置來驅趕鳥類&#xff0c;避免涉鳥故障發生。例如全天候自動化數字型智能驅鳥裝置&#xff0c;其厲害的地方在于它…

技術、生態與商業:從PC到移動的平臺之爭

在科技發展的漫長歷史中&#xff0c;我們常常驚嘆于那些改變世界的偉大技術。然而&#xff0c;深入探究會發現&#xff0c;單純的技術領先并不能保證最終的勝利。從 PC 操作系統到移動終端&#xff0c;乃至服務器軟件&#xff0c;那些最終笑傲江湖的巨頭們都遵循著一個共同的法…

android JXL 導出Excel(.xls/xlsx)

前面使用過 POI 導出xlsx但是它體量比較大&#xff0c;功能較豐富&#xff0c;在一些對包size比較敏感并且導出需求相對簡單的項目中就不太適合。 poi鏈接&#xff1a;Android 導入導出excel xls、xlsx_android excel導入導出-CSDN博客 jxl 包體積小&#xff0c;使用簡單、AP…

mysql 的主從機制是怎么實現的?

MySQL 作為當前最流行的開源關系型數據庫之一&#xff0c;為了滿足數據的高可用、負載均衡和容災備份等需求&#xff0c;廣泛應用主從復制&#xff08;Replication&#xff09;機制。其核心思想是&#xff1a;在一臺主庫&#xff08;Master&#xff09;上發生的所有數據變更都會…

【PHP 函數從入門到精通】

&#x1f9e0; PHP 函數從入門到精通 PHP 函數是編程中最基礎、也是最強大的工具之一。它不僅可以簡化代碼、提高復用性&#xff0c;還能通過各種高級用法&#xff0c;讓你寫出更靈活、更現代的代碼。 下面我們從函數的基礎講起&#xff0c;逐步深入&#xff0c;帶你掌握函數的…