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 */
相关文章:
STM32---FreeRTOS中断管理试验
一、实验 实验目的:学会使用FreeRTOS的中断管理 创建两个定时器,一个优先级为4,另一个优先级为6;注意:系统所管理的优先级范围 :5~15 现象:两个定时器每1s,打印一段字符串&#x…...
Python 网络爬虫教程与案例详解
Python 网络爬虫教程与案例详解 在当今数字化时代,数据的价值愈发凸显。Python 作为一门强大的编程语言,在数据获取领域有着广泛的应用,其中网络爬虫便是一项重要的技术。网络爬虫能够自动从网页中提取所需数据,极大地提高了数据…...
HTTP 状态代码 501 502 问题
问题 单个客户端有时会出现 报错 501 或 502 如下: System.Net.Http.HttpRequestException: Response status code does not indicate success: 501 (Not Implemented) 分析 可以排除 服务器无法处理的问题(测试发现 一个客户端报错,不会影响…...
React 之 Redux 第二十八节 学习目标与规划大纲及概要讲述
接下来 开始Redux 全面详细的文档输出,主要基于一下几个方面,欢迎大家补充指正 一、Redux 基础概念 为什么需要 Redux? 前端状态管理的挑战(组件间通信、状态共享) Redux 解决的问题:集中式、可预测的状态…...
visual studio 2022 手工写一个简单的MFC程序
书籍:《Visual C 2017从入门到精通》的2.1.2 MFC方式中2.手工写一个简单的MFC程序 环境:visual studio 2022 内容:手工写一个简单的MFC程序 1.文件->新建->项目 2.根据以下步骤选择Windows桌面向导 3.输入项目名,选择保…...
GaussDB自带诊断工具实战指南
一、引言 GaussDB是一种分布式的关系型数据库。在数据库运维中,快速定位性能瓶颈、诊断故障是保障业务连续性的关键。GaussDB内置了多种诊断工具,结合日志分析、执行计划解析和实时监控功能,帮助开发者与运维人员高效解决问题。本文深入讲解…...
python GUI之实现一个自定义的范围滑块控件:QRangeSlider
在图形用户界面(GUI)开发中,滑块控件是一种常用于选择数值范围的交互元素。然而,很多时候默认的滑块控件无法满足复杂的交互需求,例如同时选择一个范围的起始值和结束值。为此,实现了一个自定义的范围滑块控…...
测试用例总结
一、通用测试用例八要素 1、用例编号; 2、测试项目; 3、测试标题; 4、重要级别; 5、预置条件; 6、测试输入; 7、操作步骤; 8、预期输出 二、具体分析通…...
深度学习之图像学习知识点
数据增广: 数据增广是深度学习中常用的技巧之一,主要用于增加训练数据集,让数据集尽可能的多样化,使得训练的模型具有更强的泛化能力,目前数据增广主要包括:水平/垂直翻转,旋转,缩放…...
vulnhub靶场之【digitalworld.local系列】的development靶机
前言 靶机:digitalworld.local-devt-improved,IP地址为192.168.10.10 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机选择使用VMware打开文件,都选择桥接网络 这里官方给的有两种方式&…...
C语言---猜数字游戏
猜数字游戏代码 #include <stdio.h> #include <time.h> #include <stdlib.h>void meun() {printf("**********************\n");printf("******* 1.play *******\n");printf("******* 0.quit *******\n");printf("*****…...
C#中泛型的协变和逆变
协变: 在泛型接口中,使用out关键字可以声明协变。这意味着接口的泛型参数只能作为返回类型出现,而不能作为方法的参数类型。 示例:泛型接口中的协变 假设我们有一个基类Animal和一个派生类Dog: csharp复制 public…...
Select 下拉菜单选项分组
使用<select>元素创建下拉菜单,并使用 <optgroup> 元素对选项进行分组。<optgroup> 元素允许你将相关的 <option> 元素分组在一起,并为每个分组添加一个标签。 <form action"#" method"post"><la…...
文件上传漏洞详细利用流程
一、了解基本术语 1、后门 像房子一样,前门后门都可以进出房子,而较之前门,后门更具有隐蔽性。电脑技术中的后门是抽象概念,意指隐蔽性高或不常用的,区别于常规操作所使用的一种出入口。现金网络后门形形色色&#x…...
蓝桥与力扣刷题(蓝桥 旋转)
题目:图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。 我们用一个 nm的二维数组来表示一个图片,例如下面给出一个 34 的 图片的例子: 1 3 5 7 9 8 7 6 3 5 9 7 这个图片顺时针旋转…...
transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3
目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…...
使用DiskGenius工具来实现物理机多硬盘虚拟化迁移
使用DiskGenius工具来实现物理机多硬盘虚拟化迁移 概述准备工作注意事项实操过程记录1、Win7虚拟机,安装有两个硬盘(硬盘0和硬盘1),各分了一个区,磁盘2是一块未使用的磁盘2、运行DiskGenius程序,记录现有各…...
iOS安全和逆向系列教程 第5篇 iOS基础开发知识速览 - 理解你要逆向的目标
iOS安全和逆向系列教程 第5篇 iOS基础开发知识速览 - 理解你要逆向的目标 正如上一篇文章结尾所预告的,在完成环境搭建后,我们需要了解iOS开发的基础知识。这不是要求你成为一名iOS开发者,而是为了让你在逆向分析过程中能够理解应用的代码结…...
计算机常用单词
文章目录 计算机单词1-100101-200201-300301-400401-500501-600601-700701-800801-900901-10001001-11001101-12001201-13001301-14001401-15001501-16001601-1695 计算机单词 参考 1-100 1. file [英faɪl 美faɪl] n. 文件;v. 保存文件 2. command [英kəˈmɑ…...
TS的接口 泛型 自定义类型 在接口中定义一个非必须的属性
TS的接口 泛型 自定义类型 接口 新建一个ts文件,在里面定义一个接口 export interface PersonInter{id:string,name:string,age:number }在vue文件中引入这个ts文件 <script lang"ts" setup name"Person">import {type PersonInter} …...
76.读取计时器运行时间 C#例子 WPF例子
TimerManager:一个增强的定时器类,带时间管理功能 在使用定时器时,我们常常需要知道定时器的运行状态,比如它已经运行了多久,或者还剩下多少时间。然而,.NET 的 System.Timers.Timer 类本身并没有直接提供…...
React封装通用Table组件,支持搜索(多条件)、筛选、自动序号、数据量统计等功能。未采用二次封装调整灵活,包含使用文档
封装通用组件 一、封装思想二、react代码三、css代码四、实现效果五、使用文档 BasicTableModal 表格模态框组件1.组件简介2.功能特点3.使用方法基础用法宽度控制示例带筛选功能搜索功能示例自定义单元格渲染 4.API 说明PropsColumn 配置项Filter 配置项 5.注意事项 一、封装思…...
【JavaEE】-- 多线程(初阶)4
文章目录 8.多线程案例8.1 单例模式8.1.1 饿汉模式8.1.2 懒汉模式 8.2 阻塞队列8.2.1 什么是阻塞队列8.2.2 生产者消费者模型8.2.3 标准库中的阻塞队列8.2.4 阻塞队列的应用场景8.2.4.1 消息队列 8.2.5 异步操作8.2.5 自定义实现阻塞队列8.2.6 阻塞队列--生产者消费者模型 8.3 …...
WP 高级摘要插件:助力 WordPress 文章摘要精准自定义显示
wordpress插件介绍 “WP高级摘要插件”功能丰富,它允许用户在WordPress后台自定义文章摘要。 可设置摘要长度,灵活调整展示字数;设定摘要最后的显示字符, 如常用的省略号等以提示内容未完整展示;指定允许在摘要中显示…...
论文阅读 EEG-Inception
EEG-Inception: A Novel Deep Convolutional Neural Network for Assistive ERP-Based Brain-Computer Interfaces EEG-Inception是第一个集成Inception模块进行ERP检测的模型,它有效地结合了轻型架构中的其他结构,提高了我们方法的性能。 本研究的主要目…...
FFmpeg入门:最简单的音频播放器
FFmpeg入门:最简单的音频播放器 欢迎大家来到FFmpeg入门的第二章,今天只做一个最简单的FFmpeg音频播放器;同样,话不多说,先上流程图 流程图 以上流程和视频播放器的解码过程基本上是一致的; 不同点在于 S…...
物联网感应层数据采集器实现协议转换 数据格式化
数据采集器的核心功能实现涉及多个技术层面的协同工作,以下是各模块的详细实现解析: 协议转换实现 协议解析引擎:采用插件式架构,例如: P r o t o c o l P a r...
基于Linux系统的物联网智能终端
背景 产品研发和项目研发有什么区别?一个令人发指的问题,刚开始工作时项目开发居多,认为项目开发和产品开发区别不大,待后来随着自身能力的提升,逐步感到要开发一个好产品还是比较难的,我认为项目开发的目的…...
8.1.STM32_OLED
4.STM32_OLED 跟着江协科大的视频,无法点亮OLED屏幕解决办法 每个人使用的0.96寸OLED屏幕信号不一样,存在很多兼容性问题 归根结底就是驱动的问题! 本人的OLED是SSD1306,在淘宝店铺找了驱动文件后成功点亮,示例见文末 请针对自…...
Netty笔记9:粘包半包
Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8…...
