当前位置: 首页 > article >正文

在freertos中,中断优先级和任务优先级之间的关系和使用方法

中断优先级和任务优先级如何匹配?任务优先级不同任务之间该用多高的优先级?中断优先级不同中断中该用多高的优先级?中断优先级和任务优先级设置时,怎样设置可以让任务在调度时屏蔽中断?怎样设置可以让任务在调度时?中断不受任务调度影响,怎样设置?可以让临界区或禁用中断语句生效。

在实时操作系统(RTOS)中,中断优先级和任务优先级的匹配是一个关键的设计问题。合理的优先级设置可以确保系统的实时性和稳定性。以下是关于中断优先级和任务优先级匹配的详细说明,以及如何设置优先级来满足不同的需求。


1. 中断优先级和任务优先级的匹配

1.1 中断优先级

  • 中断优先级是硬件级别的优先级,由中断控制器(如NVIC)管理。

  • 高优先级的中断可以抢占低优先级的中断。

  • 中断优先级通常是一个数值,数值越小,优先级越高(例如,0是最高优先级)。

1.2 任务优先级

  • 任务优先级是操作系统级别的优先级,由RTOS(如FreeRTOS)管理。

  • 高优先级的任务可以抢占低优先级的任务。

  • 任务优先级通常是一个数值,数值越大,优先级越高(例如,在FreeRTOS中,优先级范围是0到configMAX_PRIORITIES-1)。

1.3 匹配原则

  • 中断优先级应高于任务优先级
    中断是硬件触发的,通常需要快速响应。因此,中断优先级应设置为高于所有任务的优先级,以确保中断能够及时处理。

  • 任务优先级应根据实时性需求设置
    实时性要求高的任务(如控制任务)应设置为高优先级,而实时性要求低的任务(如日志任务)可以设置为低优先级。


2. 任务优先级的设置

2.1 任务优先级的分配

  • 高优先级任务
    实时性要求高的任务,如控制任务、通信任务等。优先级可以设置为接近最大值(例如,在FreeRTOS中设置为configMAX_PRIORITIES-1)。

  • 中优先级任务
    一般任务,如数据处理任务、状态监测任务等。优先级可以设置为中等值。

  • 低优先级任务
    实时性要求低的任务,如日志任务、调试任务等。优先级可以设置为较低值(例如,在FreeRTOS中设置为1或2)。

2.2 任务优先级的注意事项

  • 避免过多的任务设置为相同优先级,否则可能导致任务切换频繁,影响系统性能。

  • 高优先级任务应尽量短小精悍,避免长时间占用CPU,导致低优先级任务无法运行。


3. 中断优先级的设置

3.1 中断优先级的分配

  • 高优先级中断
    实时性要求高的中断,如硬件定时器中断、通信中断(如UART、SPI、I2C)等。优先级可以设置为较高值(例如,0或1)。

  • 中优先级中断
    一般中断,如ADC采样中断、GPIO中断等。优先级可以设置为中等值。

  • 低优先级中断
    实时性要求低的中断,如看门狗中断等。优先级可以设置为较低值。

3.2 中断优先级的注意事项

  • 中断服务程序(ISR)应尽量短小,避免长时间占用CPU。

  • 高优先级中断应尽量避免嵌套,否则可能导致系统响应变慢。


4. 如何设置任务和中断优先级以满足不同需求

4.1 让任务在调度时屏蔽中断

5.2 同步机制

5.3 注意事项

  • 方法
    在任务中调用taskENTER_CRITICAL()taskEXIT_CRITICAL(),进入临界区时会屏蔽所有可屏蔽的中断。

  • 适用场景
    当任务需要访问共享资源时,可以通过进入临界区来屏蔽中断,确保操作的原子性。

    void TaskFunction(void *pvParameters) {while (1) {// 进入临界区,屏蔽中断taskENTER_CRITICAL();// 访问共享资源SharedResourceAccess();// 退出临界区,恢复中断taskEXIT_CRITICAL();}
    }

    4.2 让中断不受任务调度影响

  • 方法
    将中断优先级设置为高于所有任务的优先级。

  • 适用场景
    当中断需要快速响应时,确保中断不会被任务调度延迟。

    // 设置中断优先级(以STM32为例)
    NVIC_SetPriority(UART_IRQn, 0);  // 将UART中断优先级设置为最高
    NVIC_SetPriority(TIM_IRQn, 1);   // 将定时器中断优先级设置为次高

    4.3 让临界区或禁用中断语句生效

  • 方法
    使用taskENTER_CRITICAL()taskEXIT_CRITICAL()进入临界区,或者直接禁用中断(如__disable_irq())。

  • 适用场景
    当需要保护共享资源或确保代码段的原子性时。

    void CriticalSectionFunction() {// 进入临界区,屏蔽中断taskENTER_CRITICAL();// 执行关键代码CriticalCode();// 退出临界区,恢复中断taskEXIT_CRITICAL();
    }

    5. 总结

    5.1 优先级设置原则

  • 中断优先级
    实时性要求高的中断设置为高优先级,确保快速响应。

  • 任务优先级
    实时性要求高的任务设置为高优先级,确保任务及时调度。

  • 临界区
    使用taskENTER_CRITICAL()taskEXIT_CRITICAL()保护共享资源。

  • 避免高优先级任务或中断长时间占用CPU。

  • 合理分配优先级,避免优先级反转或饥饿问题。

    • 中断屏蔽
      通过设置中断优先级或直接禁用中断,确保关键代码的原子性。

相关文章:

在freertos中,中断优先级和任务优先级之间的关系和使用方法

中断优先级和任务优先级如何匹配?任务优先级不同任务之间该用多高的优先级?中断优先级不同中断中该用多高的优先级?中断优先级和任务优先级设置时,怎样设置可以让任务在调度时屏蔽中断?怎样设置可以让任务在调度时&…...

Linux软件编程:IO编程

IO(linux输入输出) 1. IO概念: I:输入 O:输出 Linux 一切皆是文件 屏幕 -> /dev/tty 磁盘 -> /dev/sda 网卡 键盘 -> /dev/event 鼠标-> /dev/mice 都是一个文件 2. IO操作的对象: 文件 3. 文…...

2025-2-14算法打卡

一,右旋字符串 1.题目描述: 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操…...

在 debian 12 上安装 mysqlclient 报错

报错如下 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting mysqlclientUsing cached https://pypi.tuna.tsinghua.edu.cn/packages/61/68/810093cb579daae426794bbd9d88aa830fae296e85172d18cb0f0e5dd4bc/mysqlclient-2.2.7.tar.gz (91 kB)Installi…...

javaEE2

maven 搭建 前后端交互 HTML servlet 后台和数据库交互 servlet jdbc 未来 servlet-->springmvc jdbc-->mybatis-->mybatisplus/jpa javaee-->spring-->springboot SERVLET tomcat ~Apache 服务 Apache(音译为阿帕奇)是世界上使用排名第一的Web服务器…...

2025最新深度学习pytorch完整配置:conda/jupyter/vscode

从今天开始,开始一个新的专栏,更新深度学习相关的内容,从入门到精通,首先的首先是关于环境的配置指南:工欲善其事必先利其器! PyTorch 是由 Facebook(现 Meta)开发的 开源深度学习框…...

华为小艺助手接入DeepSeek,升级鸿蒙HarmonyOS NEXT即可体验

小艺助手接入DeepSeek的背景与意义 随着人工智能技术的不断发展,大模型成为推动智能交互升级的关键力量。DeepSeek在自然语言处理等领域具有出色的表现,其模型在语言理解、生成等方面展现出强大的能力。华为小艺助手接入DeepSeek,旨在借助其先…...

C++ 标准库常见容器

容器类型类型分类特点示例代码vector序列容器动态数组,支持随机访问,末尾操作效率高std::vector v {1, 2, 3}; v.push_back(4);deque序列容器双端队列,支持两端操作和随机访问std::deque d {1, 2, 3}; d.push_front(0);list序列容器双向链表…...

Ubuntu 上安装 MySQL 8.0.22

在 Ubuntu 上安装 MySQL 8.0.22,可以通过以下步骤完成: 步骤 1:更新系统软件包 sudo apt update sudo apt upgrade -y步骤 2:下载 MySQL 官方 APT 仓库包 前往 MySQL 官方下载页面获取 APT 仓库配置包的链接:MySQL A…...

C++ 中的继承与派生

在 C 中,继承与派生是面向对象编程的重要特性,它们允许创建新类(派生类)来复用现有类(基类)的属性和方法,同时还能添加新的功能或修改现有功能,下面为你详细介绍。 基本概念 继承&…...

qt QRadioButton 总结

1. QRadioButton 基本概念 用途:用于单选场景,同一分组中仅允许一个按钮被选中。 继承关系:继承自 QAbstractButton,支持按钮的通用特性(如点击事件、状态切换)。 默认行为:同一父容器下的多个…...

Git 查看修改记录 二

Git 查看修改记录 二 续接 Git 查看一个文件的修改记录 一 一、修改 A.txt 修改 A.txt number6执行命令 git add . git commit -a -m "修改 number6" # git commit -a -m "修改 number6" 执行 输出如下 # $ git commit -a -m "修改 number6"…...

【STM32】增量型旋钮编码器

1.增量型旋钮编码器原理 该编码器有A,B两相,当顺时针旋转时 B相会提前A相90度(匀速转的时候),也就是A相上升沿时,B相对应高电平,计数器会1,A相下降沿时,B相为低电平时&…...

电动汽车电池监测平台系统设计(论文+源码+图纸)

1总体设计 本次基于单片机的电池监测平台系统设计,其整个系统架构如图2.1所示,其采用STC89C52单片机作为控制器,结合ACS712电流传感器、TLC1543模数转换器、LCD液晶、DS18B20温度传感器构成整个系统,在功能上可以实现电压、电流、…...

备战蓝桥杯 Day2 枚举 Day3 进制转换

Day2 枚举 1.要点 枚举要细致&#xff0c;考虑所有情况&#xff0c;一般为填空题&#xff0c;根据题目选择手算还是机算 Day3 进制转换 进制转换 1.要点 1.任意k进制转换为十进制 输入字符串得到某个k进制数组a(从1开始&#xff0c;长度为n) ll y0; for(int i1;i<n;…...

基于语义语言的语义通信(SemCom)理论:语义编码、语义解码、CSED 及语言利用

语义通信(Semantic Communication, SemCom)超越了传统 Shannon 通信范式,旨在通过语义信息的高效编码、解码及推理,实现更智能、高效的通信系统。在基于语义语言(Semantic Language)的 SemCom 设计中,核心问题包括: 语义编码问题(Semantic Encoding Problem)语义解码…...

差分的性质

目录 差分的性质1)各阶差分均可用函数值表示2)用各阶差分表示函数值3)差商与差分的关系 差分的性质 1)各阶差分均可用函数值表示 例如 Δ n f k ( E − I ) n f k ∑ j 0 n ( − 1 ) j ( n j ) E n − j f k ∑ j 0 n ( − 1 ) j ( n j ) f n k − j \Delta^nf_k(\text…...

语义源的速率-失真特征(Rate-Distortion Characteristics of Semantic Sources)在语义通信中的理论分析

1. 引言 在传统香农信息论中,通信的目标是无失真地传输比特流,其核心度量是 信道容量(Shannon Capacity)。然而,在语义通信(Semantic Communication, SemCom)中,通信目标不仅仅是比特的正确传输,而是接收端对信息的正确理解。因此,我们需要重新定义源编码(Source C…...

python 浅拷贝和深拷贝

浅拷贝&#xff08;Shallow Copy&#xff09;语法示例代码 1示例代码 2 深拷贝&#xff08;Deep Copy&#xff09;语法示例代码 浅拷贝与深拷贝的区别示例&#xff1a;浅拷贝与深拷贝的对比 浅拷贝&#xff1a;只复制外层容器&#xff0c;内层嵌套对象仍然是共享的&#xff0c;…...

Python基于 Flask 创建简单Web服务并接收文件

在全部网口上创建web服务, 监听8080端口关闭debug模式GET时返回HTML界面, 用于提交文件POST到 /upload 时, 从接收的 file 变量中读取文件, 并传递给 opencv 解析为 image 对象 from flask import Flask, request, redirect, url_for import os import cv2 import numpy impor…...

DeepSeek助力:打造属于你的GPTs智能AI助手

文章目录 一、环境准备1.安装必要的工具和库2. 选择合适的开发语言 二、核心技术选型1. 选择适合的AI框架 三、功能实现1. 文本生成与对话交互2. 代码生成与自动补全3. 数据分析与报告生成 四、案例实战1. 搭建一个简单的聊天机器人2. 创建一个代码生成器 五、总结与展望1. 当前…...

C语言基础系列【12】运算符

博主介绍&#xff1a;程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x1f…...

【verilog】函数clogb2的解读

最近经常看到clogb2函数。 源代码如下所示。 function integer clogb2; input [31:0] value; reg [31:0] tmp; reg [31:0] rt; begin tmp value - 1; for (rt 0; tmp > 0; rt rt 1) tmp tmp >> 1; clogb2 rt; end endfunction 这个函数的意思是&#xff1a;这段…...

服务器之连接简介(Detailed Explanation of Server Connection)

一台服务器最大能支持多少连接&#xff1f;一台客户端机器最多能发起多少条连接&#xff1f;&#xff1f; 我们知道TCP连接&#xff0c;从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】&#xff08;这里也对应着TCP四元组&#xff1a;源IP、源端口、…...

华为2288H V5服务器无法启动问题处理

问题&#xff1a;通电后服务器前面显示888&#xff0c;点击电源键没有反应 一.通过管理口管理服务器硬件设备 华为2288H V5它默认的IP是192.168.2.100 网关是255.255.255.0 2.将网线一头连接服务器的Mgmt口&#xff0c;另一头来连接笔记本的网口&#xff0c;将笔记本的的本地…...

Windows系统中常用的命令

随着Windows系统的不断改进&#xff0c;维护系统时有时候会因为新系统的更新而找不到对应的模块或者相关的信息入口&#xff0c;这个时候&#xff0c;记住一些命令就可以起到很好的帮助作用。 比如&#xff0c;windows11中的网络属性的修改&#xff0c;可能习惯了windows10或者…...

华宇TAS应用中间件与因朵科技多款产品完成兼容互认证

在数字化浪潮澎湃向前的当下&#xff0c;信息技术的深度融合与协同发展成为推动各行业创新变革的关键力量。近日&#xff0c;华宇TAS应用中间件携手河北因朵科技有限公司&#xff0c;完成了多项核心产品的兼容互认证。 此次兼容性测试的良好表现&#xff0c;为双方的进一步深入…...

数据结构:哈夫曼树

1.概念 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种用于数据压缩的二叉树&#xff0c;由大卫哈夫曼&#xff08;David A. Huffman&#xff09;于1952年提出。它通过构建最优二叉树来实现数据的高效压缩&#xff0c;广泛应用于文件压缩、图像压缩等领域。 哈夫曼树的…...

第36天:安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入

时间轴&#xff1a; 演示案例&#xff1a; Java-三方组件-Log4J&JNDI Java-三方组件-FastJson&反射 Maven的下载及配置&#xff1a; IDEA配置Maven的超详细步骤_java_脚本之家 Java-三方组件-Log4J&JNDI JNDI 注入&#xff1a; ( 见图 ) Java Naming and Dire…...

21爬虫:使用playwright接管本地已经登录淘宝的浏览器并查找python相关店铺信息

1.playwright如何接管本地浏览器 &#xff08;1&#xff09;首先找到电脑上安装的Chrome浏览器可执行程序的完整路径&#xff1a; Mac电脑上可执行程序的完整路径为&#xff1a; /Applications/Google Chrome.app/Contents/MacOS/Google Chrome windows系统的电脑上查找可执行…...