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.rhkb.cn/news/28885.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

永磁直驱式风力发电虚拟同步机仿真模型Matlab/Simulink模型

很久没有分享虚拟同步机控制相关的方向了,毕业后在电科院的项目又有所接触。这个课题方向其实作为硕士毕业课题还是够用的,相对来说也是比较容易毕业的,因为涉及的分支比较多。 后续对虚拟同步机的控制,我就延续我前面博客提到的方…

图像分类项目1:基于卷积神经网络的动物图像分类

1、选题背景及动机 在现代社会中,图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用,例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类,可以帮助人们更好地了解动物种类、数量和分布情况,从…

Vue 3 整合 WangEditor 富文本编辑器:从基础到高级实践

本文将详细介绍如何在 Vue 3 项目中集成 WangEditor 富文本编辑器,实现图文混排、自定义扩展等高阶功能。 一、为什么选择 WangEditor? 作为国内流行的开源富文本编辑器,WangEditor 具有以下优势: 轻量高效:压缩后仅…

Ansys Zemax | 使用衍射光学器件模拟增强现实 (AR) 系统的出瞳扩展器 (EPE):第 4 部分

附件下载 联系工作人员获取附件 在 OpticStudio 中使用 RCWA 工具为增强现实(AR)系统设置出瞳扩展器(EPE)的示例中,首先解释了k空间中光栅的规划,并详细讨论了设置每个光栅的步骤。 介绍 本文是该四篇文…

CMake学习笔记(一):工程的新建和如何将源文件生成二进制文件

cmake是我们在工作过程中比较常见的一个工具,该系列文章是自己用来学习的笔记。目前只是记录下自己学习cmake的过程中的一些重要的知识点,其是以项目需求为导向并非完整的cmake的学习路线和系统,同样也并非适合所有的人。 1.生成一个可执行文…

libcoap在Ubuntu下的编译(基于CMake)

引言 libcoap 是一个开源的轻量级 C 语言库,用于实现 CoAP(Constrained Application Protocol,受限应用协议)。CoAP 是一种专为资源受限设备设计的轻量级通信协议,适用于物联网(IoT)和嵌入式系…

Docker新手入门(持续更新中)

一、定义 快速构建、运行、管理应用的工具。 Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用。 所谓镜像,就是将应用所需的函数库、依赖、配置等应用一起打包得到的。 所谓容器,为每个镜像的应用进程创建…

蓝桥杯C组真题——巧克力

题目如下 思路 代码及解析如下 谢谢观看

SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决

介绍一下我的是ubuntu20.04.机载电脑是orinnx,通过源码烧写的系统。 首先打开终端,输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容, ONNX(Open Neural Network E…

在虚拟机上安装hadoop

在虚拟机上安装 Hadoop 是一个常见的实验环境搭建过程。以下是详细的步骤和注意事项: 前面的课程我们已经准备好了三台虚拟设备球供我们学习大数据技术,今天我们将使用其中的一台设备来运行第一个hadoop 程序。 运行第一个 hadoop程序 要运行 hadoop 程序…

Redis 常见数据类型

官方文档 RedisCommands 1)Redis 的命令有上百个,如果纯靠死记硬背比较困难,但是如果理解 Redis 的一些机制,会发现这些命令有很强的通用性。 2)Redis 不是万金油,有些数据结构和命令必须在特定场景下使用…

VBA信息获取与处理第五节:如何在单个工作表中查找某个给定值

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

永磁同步电机无速度算法--改进滑模观测器SMO(边界层法)

一、原理介绍 根据滑模观测器的定义,其切换函数是一个拥有高频切换特性的不连续项,为了进一步减小系统的抖振,将符号函数替换为Sigmoid函数,该函数为一种连续、光滑的切换函数,对抖振有良好的抑制效果,其数…

基于SpringBoot+mybatis+layui就业管理系统设计和实现

基于SpringBootmybatislayui就业管理系统设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &…

​《开源高仿Windows 12网页版:零安装体验未来操作系统界面》​​

📌 大家好,我是智界工具库,致力于分享好用实用且智能的软件以及在JAVA语言开发中遇到的问题,如果本篇文章对你有所帮助请帮我点个小赞小收藏吧,谢谢喲!😘😘😘 博主声…

docker 安装达梦数据库(离线)

docker安装达梦数据库,官网上已经下载不了docker版本的了,下面可通过百度网盘下载 通过网盘分享的文件:dm8_20240715_x86_rh6_rq_single.tar.zip 链接: https://pan.baidu.com/s/1_ejcs_bRLZpICf69mPdK2w?pwdszj9 提取码: szj9 上传到服务…

HTML第三节

一.初识CSS 1.CSS定义 A.内部样式表 B.外部样式表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

【大模型系列篇】国产开源大模型DeepSeek-V3技术报告解析

DeepSeek-V3技术报告 目录 DeepSeek-V3技术报告 1. 摘要 2. 引言 3. DeepSeek V3 架构 3.1 基础架构 3.1.1. 多头潜在注意力 3.1.2. DeepSeekMoE和无辅助损失的负载均衡 3.2 多令牌预测 4. 基础设施 4.1 计算集群 4.2 训练框架 4.2.1. DualPipe算法与计算通信协同优…

linux的文件系统及文件类型

目录 一、Linux支持的文件系统 二、linux的文件类型 2.1、普通文件 2.2、目录文件 2.3、链接文件 2.4、字符设备文件: 2.5、块设备文件 2.6、套接字文件 2.7、管道文件 三、linux的文件属性 3.1、关于权限部分 四、Linux的文件结构 五、用户主目录 5.1、工作目录…

rabbitmq-amqp事务消息+消费失败重试机制+prefetch限流

1. 安装和配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…