STM32---FreeRTOS中斷管理試驗

一、實驗

實驗目的:學會使用FreeRTOS的中斷管理

創建兩個定時器,一個優先級為4,另一個優先級為6;注意:系統所管理的優先級范圍 :5~15

現象:兩個定時器每1s,打印一段字符串,當關中斷時,停止打印,開中斷時持續打印。?

實驗設計:創建兩個任務:start_task、task1

2個任務的功能如下:

start_task:用于創建task1任務

task1:中斷測試任務,任務中將調到用關中斷和開中斷函數來體現對中斷的管理。

代碼:

main.c

#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include "freertos_demo.h"
#include "Delay.h"
#include "sys.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"int main(void){	uart_init(9600);Timer_Init();delay_init();// 創建任務FrrrRTOS_Demo(); 	  
}

freertos_demo.c

#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"/******************************************************************任務配置****************************************************/
//任務優先級
#define START_TASK_PRIO					1
//任務堆棧大小	
#define START_TASK_STACK_SIZE 	64  
//任務句柄
TaskHandle_t StartTask_Handler;
//任務函數
void start_task(void *pvParameters);//任務優先級
#define TASK1_PRIO					2
//任務堆棧大小	
#define TASK1_STACK_SIZE 		64  
//任務句柄
TaskHandle_t Task1_Handler;
//任務函數
void task1(void *pvParameters);/******************************************************************任務函數****************************************************/
void FrrrRTOS_Demo(void)
{//創建開始任務xTaskCreate((TaskFunction_t )start_task,            			//任務函數( char*         )"start_task",          			//任務名稱(uint16_t       )START_TASK_STACK_SIZE, 			//任務堆棧大小(void*          )NULL,                  			//傳遞給任務函數的參數(UBaseType_t    )START_TASK_PRIO,       			//任務優先級(TaskHandle_t*  )&StartTask_Handler);   			//任務句柄 // 啟動任務調度vTaskStartScheduler();
}void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //進入臨界區//創建LED0任務xTaskCreate((TaskFunction_t )task1,     	(const char*    )"task1",   	(uint16_t       )TASK1_STACK_SIZE, (void*          )NULL,				(UBaseType_t    )TASK1_PRIO,	(TaskHandle_t*  )&Task1_Handler); vTaskDelete(StartTask_Handler); //刪除開始任務taskEXIT_CRITICAL();            //退出臨界區
}// 任務1函數
void task1(void *pvParameters)
{uint8_t task1_num = 0;while(1){if(++task1_num == 5){task1_num = 0;printf("關中斷\r\n");portDISABLE_INTERRUPTS();delay_xms(5000);												//不可以使用vTaskDelay()函數:因為此函數會在內部開啟中斷引起任務切換printf("開中斷\r\n");portENABLE_INTERRUPTS();}vTaskDelay(1000);}
}

Timer.c

#include "stm32f10x.h"                  // Device header
#include "usart.h"void Timer_Init(void)
{//RCC打開時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//選擇時基單元的時鐘,內部時鐘一般默認初始化可以寫可以不寫TIM_InternalClockConfig(TIM2);TIM_InternalClockConfig(TIM3);//配置時基單元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//TIM_CKD_DIV1代表1分屏TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//代表向上計數TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//72MHZ分頻7200,就是10k,10k計10000個數就是1sTIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//高級定時器才有,現在是通用定時器給0TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);//如果不加入這一句,會導致復位之后從1開始計數TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ClearFlag(TIM3, TIM_FLAG_Update);//TIM_IT_Update代表更新中斷,中斷控制,用來控制某個中斷能不能通往NIVCTIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;									//新版RTOS可管理的NVIC中斷:11~15NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&NVIC_InitStructure);//啟動定時器TIM_Cmd(TIM2, ENABLE);TIM_Cmd(TIM3, ENABLE);
}void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){printf("優先級4\r\n");TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}void TIM3_IRQHandler(void)
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET){printf("優先級15\r\n");TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
}

二、實驗現象

三、重點?

開中斷和關中斷函數:

portDISABLE_INTERRUPTS();                    //關中斷
portENABLE_INTERRUPTS();                     //開中斷      

關中斷之后不能使用vTaskDelay()函數,此函數中會打開中斷。(Delay函數不能使用的可以找找我的文章,有專門修改后適用于FreeRTOS操作系統的延遲函數)

FreeRTOS可管理的中斷優先級,版本不一樣,可管理的優先級就不一樣;

是由FreeRTOSConfig.h文件里面的宏決定:


#define configKERNEL_INTERRUPT_PRIORITY 255 ?// 內核中斷優先級(最低優先級)
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 ?

// 允許調用 FreeRTOS API 的最高中斷優先級(優先級 11)

//可管理的中斷優先級:11 到 15

?適用于STM32F103C8T6項目帶注釋完整的FreeRTOSConfig.h文件:

/** FreeRTOS V202212.01* Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.** Permission is hereby granted, free of charge, to any person obtaining a copy of* this software and associated documentation files (the "Software"), to deal in* the Software without restriction, including without limitation the rights to* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of* the Software, and to permit persons to whom the Software is furnished to do so,* subject to the following conditions:** The above copyright notice and this permission notice shall be included in all* copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** https://www.FreeRTOS.org* https://github.com/FreeRTOS**/#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H// 如果需要支持操作系統,可以取消注釋以下宏定義
//#define SYSTEM_SUPPORT_OS 1/*-----------------------------------------------------------* 應用程序特定的定義。** 這些定義應根據您的硬件和應用程序需求進行調整。** 這些參數在 FreeRTOS API 文檔的“配置”部分中有詳細描述,* 文檔可在 FreeRTOS.org 網站上找到。** 參見 http://www.freertos.org/a00110.html*----------------------------------------------------------*/// 將 FreeRTOS 的中斷處理函數映射到 CMSIS 標準的中斷處理函數
#define xPortPendSVHandler               PendSV_Handler  // PendSV 中斷處理函數
//#define xPortSysTickHandler              SysTick_Handler // SysTick 中斷處理函數(注釋掉,使用自定義的 SysTick_Handler)
#define vPortSVCHandler                  SVC_Handler     // SVC 中斷處理函數// 啟用獲取當前任務句柄的 API
#define INCLUDE_xTaskGetCurrentTaskHandle 1/*-------------------------------- FreeRTOS 內核配置 --------------------------------*/
#define configUSE_PREEMPTION            1  // 啟用搶占式調度
#define configUSE_IDLE_HOOK             0  // 禁用空閑任務鉤子函數
#define configUSE_TICK_HOOK             0  // 禁用時鐘節拍鉤子函數
#define configCPU_CLOCK_HZ              ( ( unsigned long ) 72000000 )  // CPU 時鐘頻率,72MHz
#define configTICK_RATE_HZ              ( ( TickType_t ) 1000 )         // 系統節拍頻率,1000Hz(1ms 一個節拍)
#define configMAX_PRIORITIES            ( 5 )                           // 最大任務優先級數
#define configMINIMAL_STACK_SIZE        ( ( unsigned short ) 128 )      // 空閑任務的最小堆棧大小
#define configTOTAL_HEAP_SIZE           ( ( size_t ) ( 17 * 1024 ) )    // 系統堆的總大小,17KB
#define configMAX_TASK_NAME_LEN         ( 16 )                          // 任務名稱的最大長度
#define configUSE_TRACE_FACILITY        0  // 禁用可視化跟蹤調試功能
#define configUSE_16_BIT_TICKS          0  // 使用 32 位 Tick 計數器
#define configIDLE_SHOULD_YIELD         1  // 空閑任務在有同等優先級的用戶任務時主動讓出 CPU/*-------------------------------- FreeRTOS API 包含配置 --------------------------------*/
// 以下宏定義用于控制是否包含特定的 FreeRTOS API 函數
#define INCLUDE_vTaskPrioritySet        1  // 包含任務優先級設置函數
#define INCLUDE_uxTaskPriorityGet       1  // 包含獲取任務優先級函數
#define INCLUDE_vTaskDelete             1  // 包含任務刪除函數
#define INCLUDE_vTaskCleanUpResources   0  // 不包含任務資源清理函數
#define INCLUDE_vTaskSuspend            1  // 包含任務掛起函數
#define INCLUDE_vTaskDelayUntil         1  // 包含絕對延時函數
#define INCLUDE_vTaskDelay              1  // 包含相對延時函數
#define INCLUDE_vTaskResumeFromISR      1  // 包含從中斷恢復任務函數
#define INCLUDE_xTaskGetSchedulerState  1  // 包含獲取調度器狀態函數/*-------------------------------- 中斷優先級配置 --------------------------------*/
/*-------------------------------- 可管理的中斷優先級:11 到 15(對應 NVIC 優先級 191 到 255) --------------------------------*/// Cortex-M3/M4 的 NVIC 中斷優先級配置
#define configKERNEL_INTERRUPT_PRIORITY 255  // 內核中斷優先級(最低優先級)
// configMAX_SYSCALL_INTERRUPT_PRIORITY 不能設置為 0
// 參見 http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191  // 允許調用 FreeRTOS API 的最高中斷優先級(優先級 11)// STM32 庫使用的中斷優先級范圍是 0-15,15 對應最低優先級 255
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15  // 內核中斷優先級(最低優先級)#endif /* FREERTOS_CONFIG_H */

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

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

相關文章

docker利用docker-compose-gpu.yml啟動RAGFLOW,文檔解析出錯【親測已解決】

0.問題說明 想要讓RAGFLOW利用GPU資源跑起來,可以選擇docker-compose-gpu.yml啟動。(但是官網啟動案例是86平臺的不是NVIDIA GPU的,docker-compose-gpu.yml又是第三方維護,所以稍有問題) 1.問題 docker利用docker-c…

【AI深度學習網絡】卷積神經網絡(CNN)入門指南:從生物啟發的原理到現代架構演進

深度神經網絡系列文章 【AI深度學習網絡】卷積神經網絡(CNN)入門指南:從生物啟發的原理到現代架構演進【AI實踐】基于TensorFlow/Keras的CNN(卷積神經網絡)簡單實現:手寫數字識別的工程實踐 引言 在當今…

【ThreeJS Basics 06】Camera

文章目錄 Camera 相機PerspectiveCamera 透視相機正交相機用鼠標控制相機大幅度轉動(可以看到后面) 控制組件FlyControls 飛行組件控制FirstPersonControls 第一人稱控制PointerLockControls 指針鎖定控制OrbitControls 軌道控制TrackballControls 軌跡球…

Linux | Ubuntu 與 Windows 雙系統安裝 / 高頻故障 / UEFI 安全引導禁用

注:本文為 “buntu 與 Windows 雙系統及高頻故障解決” 相關文章合輯。 英文引文,機翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何將 Ubuntu 20.04 和雙啟動與 Windows 10 一起安裝 Dave’s RoboShack Published in…

在 C++ 中,通常會使用 `#define` 來定義宏,并通過這種方式發出警告或提示。

在 C++ 中,通常會使用 #define 來定義宏,并通過這種方式發出警告或提示。 如何實現 GBB_DEPRECATED_MSG 宏: 你可以通過以下方式定義一個宏,顯示棄用警告: #include <iostream>// 定義一個宏,用來打印棄用警告 #define GBB_DEPRECATED_MSG(msg

el-tree右鍵節點動態位置展示菜單;el-tree的節點圖片動態根據節點屬性color改變背景色;加遮罩層(opacity)

一、el-tree右鍵節點動態位置展示菜單 關鍵:@node-contextmenu="handleRightClick"與@node-click=“handleNodeClick” <div class="content"><el-tabs class="tabs" @tab-click="handleClick" v-model="Modal"…

Leetcode 378-有序矩陣中第 K 小的元素

給你一個 n x n 矩陣 matrix &#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩陣中第 k 小的元素。 請注意&#xff0c;它是 排序后 的第 k 小元素&#xff0c;而不是第 k 個 不同 的元素。 你必須找到一個內存復雜度優于 O(n2) 的解決方案。 示例 1&#xff1…

【二.提示詞工程與實戰應用篇】【3.Prompt調優:讓AI更懂你的需求】

最近老張在朋友圈秀出用AI生成的國風水墨畫,隔壁王姐用AI寫了份驚艷全場的年終總結,就連樓下小賣部老板都在用AI生成營銷文案。你看著自己跟AI對話時滿屏的"我不太明白您的意思",是不是懷疑自己買了臺假電腦?別慌,這可能是你的打開方式不對。今天咱們就聊聊這個…

UNIAPP前端配合thinkphp5后端通過高德API獲取當前城市天氣預報

如何通過 UniApp 前端項目與 ThinkPHP5 后端結合高德天氣 API 獲取天氣預報信息。我們將分為前端和后端兩部分進行實現。以下是一個完整的代碼. 一、項目結構 project/ ├── frontend/ (UniApp 項目) │ ├── pages/ │ │ └── weather/ │ │ ├── in…

藍橋杯C組真題——巧克力

題目如下 思路 代碼及解析如下 謝謝觀看

CSDN博客寫作教學(五):從寫作到個人IP的體系化構建(完結篇)

導語 (第一篇)Markdown編輯器基礎 (第二篇)Markdown核心語法 (第三篇)文章結構化思維 (第四篇)標題優化與SEO實戰 通過前四篇教程,你已掌握技術寫作的“術”——排版、標題、流量與數據。但真正的價值在于將技能升維為“道”:用技術博客為支點,撬動個人品牌與職業發…

Elasticsearch簡單學習

1、依賴的導入 <!--ES依賴--> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>2、客戶端鏈接 RestHighLevelClient client new RestHigh…

macOS Sequoia 15.3 M3 Pro芯片 iOS 開發環境配置記錄(最新)

進行如下工作之前首先確保終端已翻墻&#xff0c;在ClashX選擇“復制終端代理命令”&#xff0c;在終端進行粘附并執行。 安裝 homebrew Homebrew 是 Mac 平臺的一個包管理工具&#xff0c;提供了許多Mac下沒有的Linux工具等。 /bin/bash -c "$(curl -fsSL https://raw…

迷你世界腳本組隊接口:Team

組隊接口&#xff1a;Team 彼得兔 更新時間: 2023-04-26 10:19:04 具體函數名及描述如下: 序號 函數名 函數描述 1 getNumTeam(...) 當前隊伍數量 2 getTeamPlayerNum(...) 獲取指定隊伍玩家數量 3 getTeamPlayers(...) 獲取指定隊伍玩家 4 random…

使用 Deepseek + kimi 快速生成PPT

前言 最近看到好多文章和視頻都在說&#xff0c;使用 Deepseek 和 kimi 能快速生成精美的 ppt&#xff0c;畢竟那都是別人說的&#xff0c;只有自己嘗試一次才知道結果。 具體操作 第一步&#xff1a;訪問 deepseek 我們訪問 deepseek &#xff0c;把我們想要輸入的內容告訴…

初始提示詞(Prompting)

理解LLM架構 在自然語言處理領域&#xff0c;LLM&#xff08;Large Memory Language Model&#xff0c;大型記憶語言模型&#xff09;架構代表了最前沿的技術。它結合了存儲和檢索外部知識的能力以及大規模語言模型的強大實力。 LLM架構由外部記憶模塊、注意力機制和語…

【IDEA】IDEA常用的VM配置,優化配置讓開發過程更順暢

日常開發中&#xff0c;如果使用IDEA卡頓、卡死&#xff0c;一般是需要根據自己電腦的實際性能調整VM參數&#xff0c;才能有更好的開發體驗。 設置方法 選擇Help>Edit Custom VM Options&#xff0c;粘貼以下內容&#xff0c;重啟 IntelliJ IDEA使配置生效。 idea64.exe.…

【Python爬蟲】利用代理IP爬取跨境電商AI選品分析

引言 隨著DeepSeek的流行&#xff0c;越來越多的用戶開始嘗試將AI工具融入到日常工作當中&#xff0c;借助AI的強大功能提高工作效率。最近又掀起了一波企業出海的小高潮&#xff0c;那么如果是做跨境電商業務&#xff0c;怎么將AI融入工作流中呢&#xff1f;在做跨境電商的時候…

【Flink銀行反欺詐系統設計方案】1.短時間內多次大額交易場景的flink與cep的實現

【flink應用系列】1.Flink銀行反欺詐系統設計方案 1. 經典案例&#xff1a;短時間內多次大額交易1.1 場景描述1.2 風險判定邏輯 2. 使用Flink實現2.1 實現思路2.2 代碼實現2.3 使用Flink流處理 3. 使用Flink CEP實現3.1 實現思路3.2 代碼實現 4. 總結 1. 經典案例&#xff1a;短…

C語言——鏈表

大神文獻&#xff1a;https://blog.csdn.net/weixin_73588765/article/details/128356985 目錄 一、鏈表概念 1. 什么是鏈表&#xff1f; 1.1 鏈表的構成 2. 鏈表和數組的區別 數組的特點&#xff1a; 鏈表的特點&#xff1a; 二者對比&#xff1a; 二…