FreeRTOS中断配置和临界值

news/2024/11/15 8:31:27/

Cortx-M 中断

优先级分组

Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。高的抢占式优先级可以打断低的抢占式优先级,故名抢占;而在抢占式优先级相同的情况下,响应优先级越高,同时发生则先响应它,但是不能打断低响应优先级,响应表达的是响应速度。
这4个寄存器位的分组方式如下:

第0组:所有4位用于指定响应优先级

第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级

第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级

第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级

第4组:所有4位用于指定抢占式优先级

NVIC_PriorityGroup_0=> 选择第0组

NVIC_PriorityGroup_1=> 选择第1组

NVIC_PriorityGroup_2=> 选择第2组

NVIC_PriorityGroup_3=> 选择第3组

NVIC_PriorityGroup_4=> 选择第4组

优先级:
// 选择使用优先级分组第1组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);// 使能EXTI0中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);// 使能EXTI9_5中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

移植FreeROTS时选择组4,全部都是抢占优先级,一共16个优先级。

用于中断屏蔽的特殊寄存器

PRIMASK寄存器用于禁止除NMI和HardFalut外的所有异常和中断。
FAULTMASK寄存器禁止除NMI外的所有异常和中断。
BASEPRI寄存器屏蔽优先级低于某一个阈值的中断。

FreeRTOS中断配置

在这里插入图片描述
portENABLE_INTERRUPTS()是开中断。
portDISABLE_INTERRUPTS()的关中断。
vPortSetBASEPRI()时向寄存器BASEPRI写入一个值。
vPortRaiseBASEPRI()是屏蔽优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断

临界段代码

指那些必须完整运行,不能被打断的代码段。FreeRTOS在进入临界代码段的时候需要关闭中断,当处理完临界段代码以后再打开中断。

任务级的临界代码保护:
taskEATER_CRITICAL()进入临界段
taskEXIT_CRITICAL()退出临界段

中断级临界段代码保护: 用于中断程序,这个中断的优先级一定要低于configMAX_SYSCALL_INTERRUPT_PRIORITY
tsakENTER_CRITICAL_FROM_ISR()进入临界区
taskEXIT_CRITICAL_FROM_ISR()退出临界区

FreeRTOS中断测试实验

实验目的

使用两个定时器,一个优先级4,一个优先级5,两个定时器每隔1s通过串口输出一串字符串。然后在某个任务中关闭中断一段时间,查看两个定时器的输出情况。

实验设计

start_task():创建另外一个任务。
interrupt_task():中断测试任务,任务中会调用FreeRTOS的关中断函数portDISABLE_INTERRUPTS()来将中断关闭一段时间。

main

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "FreeRTOS.h"
#include "task.h"//任务优先级
#define START_TASK_PRIO			1
//任务堆栈大小	
#define START_STK_SIZE 			256  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define INTERRUPT_TASK_PRIO		2
//任务堆栈大小	
#define INTERRUPT_STK_SIZE 		256  
//任务句柄
TaskHandle_t INTERRUPTTask_Handler;
//任务函数
void interrupt_task(void *p_arg);int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 delay_init();	    				//延时函数初始化	 uart_init(115200);					//初始化串口LED_Init();		  					//初始化LEDTIM3_Int_Init(10000-1,7200-1);		//初始化定时器3,定时器周期1STIM5_Int_Init(10000-1,7200-1);		//初始化定时器5,定时器周期1S//创建开始任务xTaskCreate((TaskFunction_t )start_task,            //任务函数(const char*    )"start_task",          //任务名称(uint16_t       )START_STK_SIZE,        //任务堆栈大小(void*          )NULL,                  //传递给任务函数的参数(UBaseType_t    )START_TASK_PRIO,       //任务优先级(TaskHandle_t*  )&StartTask_Handler);   //任务句柄              vTaskStartScheduler();          //开启任务调度
}//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建中断测试任务xTaskCreate((TaskFunction_t )interrupt_task,  			//任务函数(const char*    )"interrupt_task", 			//任务名称(uint16_t       )INTERRUPT_STK_SIZE,		//任务堆栈大小(void*          )NULL,						//传递给任务函数的参数(UBaseType_t    )INTERRUPT_TASK_PRIO,		//任务优先级(TaskHandle_t*  )&INTERRUPTTask_Handler); 	//任务句柄vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}//中断测试任务函数 
void interrupt_task(void *pvParameters)
{static u32 total_num=0;while(1){total_num+=1;if(total_num==5) {printf("关闭中断.............\r\n");portDISABLE_INTERRUPTS();				//关闭中断delay_xms(5000);						//延时5sprintf("打开中断.............\r\n");	//打开中断portENABLE_INTERRUPTS();total_num=0;}LED0=~LED0;vTaskDelay(1000);}
} 

运行结果

在这里插入图片描述
configMAX_SYSCALL_INTERRUPT_PRIORITY设置为5,TIM5的中断优先级为5,TIM3的中断优先级为4,所以当关闭中断时TIM5被关闭,TIM3没有被关闭。


http://www.ppmy.cn/news/78342.html

相关文章

Spring Security实现登录

前言 Spring Security是Spring框架下的一个用于身份验证和授权的框架,它可以帮忙管理web应用中的用户认证、授权以及安全性问题。本文将介绍如何使用Spring Security实现用户登录功能,本文主要包括以下内容: 环境准备Spring Security核心概…

软件测试流程

1、软件测试流程 通常,软件测试流程包括以下几个步骤: 需求分析:确定软件的功能和性能需求,明确测试范围,并编写相应的测试计划。 测试计划:根据需求分析,制定测试计划,包括测试范…

视频转换芯片MS7200概述 HDMI转数字RGB/YUV/HDMI RXReceive/替代IT66021FN

1. 基本介绍 MS7200 是一款 HDMI 接收芯片,兼容 HDMI1.4b 及 HDMI 1.4b 以下标准的视频 3D 传输格 式,最高分辨率可支持到 4K30Hz,最高采样率达到 300MHz。MS7200 支持 YUV 和 RGB 之 间的色彩空间转换,数字接口支持 YUV 及 RGB 格…

Android NFC研究工具包入门指南

目录 一、NFC简介 二、Android NFC研究工具包 三、NFC的开发环境配置 四、NFC的使用方法 五、Android Beam 六、总结 一、NFC简介 NFC(Near Field Communication)近场通信,是一种短距离的高频无线通信技术,允许电子设备之间…

物联网手势控制小车所遇问题与解决方案

LCD1602无法显示问题 问题描述:按照开源社区教程完成LCD1602驱动显示程序的编写,成功点亮屏幕,开启背光,但无法观察到显示数据。 分析过程与解决方案: 1.是否IIC地址不对 使用以下代码扫描IIC总线上的设备&#xf…

【lager】日志系统2:测试程序调试

design 官方设计文档 design cmakelist增加plog构建 cmake_minimum_required(VERSION 3.1.3 FATAL_ERROR) project(Lager)set(CMAKE_CXX_STANDARD 11) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)find_package(

shell编程快捷命令

shell编程快捷命令 一、快捷排序 — sort 命令二、快捷去重 — uniq 命令三、快捷替换 — tr 命令四、快速裁剪 — cut 命令五、文件拆分 — split 命令七、变量扫描器 — eval 命令 一、快捷排序 — sort 命令 sort命令用于以行为单位,对文件的内容进行排序 语法格…

HCIA——VLAN

目录 1,什么是VLAN: 2,如何实现VLAN: 3,VLAN的划分方式: 4,交换机接口类型: 1,Access接口: 2,Trunk接口:允许将一个接口划分给多…