实时操作系统Freertos开坑学习笔记:(三):任务的挂起与恢复、中断管理

news2024/11/18 17:35:55

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、任务挂起与恢复的API函数
    • 1.具体函数描述
      • ①vTaskSuspend()任务挂起(暂停)函数
      • ②vTaskResume()任务恢复函数
      • ③xTaskResumeFromISR()在中断中恢复挂起任务
    • 2.恢复任务函数跟中断恢复任务函数有什么区别?
  • 二、任务挂起与恢复的具体例程
    • 1.实验目的
    • 2.具体代码
      • ①创建任务代码
      • ②LED、key0,1任务代码
      • ③key2进入中断恢复挂起的任务
  • 三、任务挂起与恢复的内部实现
  • 四、freertos的中断管理
    • 1.什么是中断?
    • 2.中断优先级分组机制
    • 3.中断相关寄存器
    • 4.中断管理具体例程
    • 5.中断管理总结


前言

在这里插入图片描述
本节包括这四个内容,主要掌握1和2,3属于选修内容,如果想深入理解可以学习。

一、任务挂起与恢复的API函数

1.具体函数描述

在这里插入图片描述

①vTaskSuspend()任务挂起(暂停)函数

vTaskSuspend()是FreeRTOS中的一个函数,用于暂停任务的执行。当调用此函数时,任务进入暂停状态,并且在恢复之前不具备执行的资格。

该函数的语法如下:

void vTaskSuspend(TaskHandle_t xTaskToSuspend);

在这里,xTaskToSuspend是要暂停的任务的句柄。该句柄是在使用xTaskCreate()或xTaskCreateStatic()函数创建任务时获得的。

当调用vTaskSuspend()时,任务立即从准备运行的任务列表中移除。任务保持在暂停状态,直到使用vTaskResume()函数恢复它。

需要注意的是,vTaskSuspend()不应该从中断服务例程(ISR)中调用。而应该使用vTaskSuspendFromISR()函数从ISR中挂起任务。
在这里插入图片描述

②vTaskResume()任务恢复函数

vTaskResume()是FreeRTOS中的一个函数,用于恢复暂停任务的执行。当调用此函数时,任务从暂停状态转换为就绪状态,使其具备执行的资格。

该函数的语法如下:

BaseType_t vTaskResume(TaskHandle_t xTaskToResume);

在这里,xTaskToResume是要恢复的任务的句柄。该句柄是在使用xTaskCreate()或xTaskCreateStatic()函数创建任务时获得的。

当调用vTaskResume()时,任务被添加回准备运行的任务列表中。如果恢复的任务具有比当前运行任务更高的优先级,可能会发生上下文切换,允许恢复的任务立即开始执行。

需要注意的是,vTaskResume()不应该从中断服务例程(ISR)中调用。而应该使用vTaskResumeFromISR()函数从ISR中恢复任务。

vTaskResume()在需要恢复先前暂停的任务的场景中很有用,例如在特定事件或资源可用后。一旦任务被恢复,它将从暂停的位置继续执行。
在这里插入图片描述

③xTaskResumeFromISR()在中断中恢复挂起任务

xTaskResumeFromISR()是FreeRTOS中的一个函数,用于从中断服务例程(ISR)中恢复暂停的任务的执行。与vTaskResume()函数不同,xTaskResumeFromISR()是专门设计用于在ISR中恢复任务的函数。

该函数的语法如下:

BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume);

在这里,xTaskToResume是要恢复的任务的句柄。该句柄是在使用xTaskCreate()或xTaskCreateStatic()函数创建任务时获得的。

当调用xTaskResumeFromISR()时,任务从暂停状态转换为就绪状态,使其具备执行的资格。与vTaskResume()不同的是,xTaskResumeFromISR()将任务的恢复操作延迟到稍后的上下文切换中。

在ISR中调用xTaskResumeFromISR()时,需要在ISR返回之前调用一个适当的API来请求上下文切换。这可以通过使用xHigherPriorityTaskWoken参数来完成,该参数在调用API时设置为pdTRUE。

xTaskResumeFromISR()在需要从ISR中恢复先前暂停的任务的场景中很有用,例如在中断处理程序完成后恢复任务的执行。

需要注意的是,由于xTaskResumeFromISR()是从ISR中调用的,因此它具有一些特殊的限制和要求,包括对中断嵌套的支持和使用特殊的上下文切换机制。
在这里插入图片描述

2.恢复任务函数跟中断恢复任务函数有什么区别?

恢复任务函数(vTaskResume)和中断恢复任务函数(xTaskResumeFromISR)在功能和用法上有一些区别。

1.调用方式:恢复任务函数可以从任务上下文中调用,而中断恢复任务函数只能从中断服务例程(ISR)中调用。
2.上下文切换:恢复任务函数(vTaskResume)可以立即执行上下文切换,使恢复的任务立即开始执行。而中断恢复任务函数(xTaskResumeFromISR)将任务的恢复操作延迟到稍后的上下文切换中,需要通过调用适当的API来请求上下文切换,并设置xHigherPriorityTaskWoken参数为pdTRUE。
3.中断嵌套:中断恢复任务函数(xTaskResumeFromISR)支持中断嵌套,可以在多个中断级别中正确地恢复任务。而恢复任务函数(vTaskResume)不具备中断嵌套的支持,只能在任务上下文中调用。
4.限制和要求:由于中断恢复任务函数(xTaskResumeFromISR)是从ISR中调用的,因此它具有一些特殊的限制和要求。例如,需要正确配置和处理中断控制器,以及使用特殊的上下文切换机制。

总的来说,恢复任务函数(vTaskResume)适用于从任务上下文中恢复暂停的任务,而中断恢复任务函数(xTaskResumeFromISR)适用于从中断服务例程中恢复暂停的任务.

意思就是说:xTaskResumeFromISR()函数需要在中断服务例程(ISR)中调用。当进入中断并需要恢复暂停的任务时,可以在中断服务函数中调用xTaskResumeFromISR()函数。

在调用xTaskResumeFromISR()函数之前,需要确保已经正确配置和处理中断控制器,并设置xHigherPriorityTaskWoken参数为pdTRUE。这样在中断服务函数返回之前,会立即请求一个上下文切换,使得恢复的任务能够在稍后的上下文切换中开始执行。

注意,xTaskResumeFromISR()函数只能用于从中断上下文中恢复任务,不能从普通任务上下文中调用该函数。如果需要从普通任务上下文中恢复任务,应该使用vTaskResume()函数。

具体关于freertos的中断机制,后面会具体说明。

二、任务挂起与恢复的具体例程

1.实验目的

在这里插入图片描述

2.具体代码

代码如下:

①创建任务代码

在这里插入图片描述

②LED、key0,1任务代码

在这里插入图片描述

③key2进入中断恢复挂起的任务

在这里插入图片描述

三、任务挂起与恢复的内部实现

在这里插入图片描述
在这里插入图片描述

四、freertos的中断管理

主要内容包括:
在这里插入图片描述

1.什么是中断?

在这里插入图片描述
裸机编程里,中断是一个很重要的概念。这里我也不多说了,如图,由某些条件触发中断请求,然后CPU停止当前程序,进入中断处理程序执行,完毕后返回打断的程序处继续执行。
如果出现了一个中断,同时又出现了一个更加重要的中断请求,即中断嵌套,那怎么办呢?
采用中断优先级分组机制。

2.中断优先级分组机制

在这里插入图片描述
看这个中断优先级寄存器,高四位和低四位是不同的,只有高四位才用于优先级表示。那么对于抢占优先级和子优先级这两种配置方法而言,有以下的配置方式:
在这里插入图片描述
比如我们最常用的NVIC_PriorityGroup_2,那么抢占优先级有两位,00、01、10、11这4种形式,子优先级同样也是两位。

那对于freeetos来说,中断优先级怎么管理呢?
在这里插入图片描述
这里建议只要抢占优先级,采用NVIC_PriorityGroup_4,让抢占优先级占据全部的4位。

3.中断相关寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
看不懂,根本看不懂,还是上例程来理解吧。

4.中断管理具体例程

在这里插入图片描述
说明:这里创建两个定时器,由于系统管理的优先级范围是5-15,所以如果我关中断,优先级为6的定时器会被关闭,而优先级为4的不会受影响。

(1)首先创建两个基本定时器TIM6和TIM7
在这里插入图片描述
(2)修改两个定时器的优先级为4和6
在这里插入图片描述
(3)实现每一秒进入一次中断,并打印字符串的功能:只需初始化时配置好分频系数与计数周期,使得每1秒触发中断即可。
在这里插入图片描述
在这里插入图片描述
stm32f429系列设置系统时钟频率为180MHZ,而TIM6和TIM7的时钟频率是90MHz,所以900000000/10000/9000=1s。

(4)将关闭中断函数放在任务1里面执行
在这里插入图片描述
在这里插入图片描述
整个任务函数的作用是每秒钟执行一次任务,并在 task1_num 自增到 5 的时候关闭中断,延时 5 秒后再开启中断。当两个定时器1秒进一次中断打印字符串,到5秒时关中断,这时只有不在系统管理的中断优先级为4的定时器能继续运行,5-15优先级的中断会直接停止。然后过5秒后,开中断,两个定时器中断又正常运行。

注意:这里if语句里面,为什么只能用delay_ms(5000);而不能用vTaskDelay(5000);呢?
delay_ms(5000) 和 vTaskDelay(5000) 是两种不同的延时函数。

delay_ms(5000):这是一个常见的延时函数,用于在代码中添加一个指定的毫秒级延时。在该函数中,程序将会一直阻塞,直到经过指定的时间(5秒)后才继续执行后续代码。这种延时函数通常用于裸机编程或非实时操作系统中,因为它会阻塞任务的执行,可能导致任务无法响应其他事件。

vTaskDelay(5000):这是 FreeRTOS 提供的一个延时函数,用于在任务中实现延时。在该函数中,任务将会进入阻塞状态,并将 CPU 时间片让给其他任务或中断处理程序,以便系统可以继续执行其他任务。在经过指定的时间(5秒)后,任务会被重新唤醒,并继续执行后续代码。这种延时函数是实时操作系统中常用的方式,可以实现任务之间的时间片轮转和优先级调度。

总结:delay_ms(5000) 是一个阻塞式的延时函数,会阻塞任务的执行;vTaskDelay(5000) 是 FreeRTOS 提供的一个非阻塞式延时函数,任务在延时期间会进入阻塞状态,让出 CPU 时间片给其他任务.选择使用哪种延时函数取决于具体的应用场景和系统需求。

再注意:系统管理的优先级范围是可以设置的。
看的是BASEPRI寄存器:屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断。当BASEPRI设置为0x50时,代表中断优先级在5-15内的均被屏蔽,0-4的中断优先级正常执行。

5.中断管理总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/972055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PAT 1167 Cartesian Tree

个人学习记录,代码难免不尽人意。 A Cartesian tree is a binary tree constructed from a sequence of distinct numbers. The tree is heap-ordered, and an inorder traversal returns the original sequence. For example, given the sequence { 8, 15, 3, 4, 1…

机器学习-波士顿房价预测

目录 一.数据处理 读入数据 数据形状变换 数据集划分 数据归一化处理 将上面封装成load data函数 二. 模型设计 完整封装运行代码: 根据loss值进行梯度计算 控制部分变量的变化图像: 一.数据处理 读入数据 # 导入需要用到的package import numpy as np…

迷你上下标数字转换器

将输入字符串中的数字转换成迷你数字字符,您可以复制带迷你数字的纯文本到任意地方。 (本笔记适合初通Python,熟悉六大基本数据类型(str字符串、int整型、float浮点型、list列表、tuple元组、set集合、dict字典)常规应用的 coder 翻阅) 【学习的细节是欢…

1.1 计算机网络在信息时代中的作用

思维导图: 正文: 我的理解: 这段话是一本书或课程的第一章简介,它的目的是为读者或学生提供一个关于计算机网络基础知识的框架或大纲。 首先,它强调了这章是整本书的一个概览,会先介绍计算机网络在信息时…

Oracle数据库尚硅谷学习笔记

文章目录 Oracle数据库体系结构简介补充SQL初步导入sql文件别名连接符distinct去重的坑 过滤和排序数据日期格式比较运算其它比较运算符逻辑运算优先级排序 单行函数SQL中不同类型的函数单行函数字符数值日期转换通用 使用条件表达式嵌套查询 多表查询等值连接非等值连接左外连…

大数据组件-Flink环境搭建

🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…

盛元广通生态环境监测实验室管理系统LIMS

系统背景: 当环境问题已经被普罗大众都开始关心那已经是世界的焦点了,我们在面临水污染、空气污染日益加剧的今天,为解决这些问题,做好监测预警,需要更可靠的数据支撑和智能化管理手段来指导我们决策和行动&#xff0…

【docker】Mac M1 构建 x64 linux镜像

亲测教程 文章目录 首先构建环境 首先 首先你需要有一个 Dockerfile 比如:这里以一个 python 项目举例 FROM python:3.10-slimWORKDIR /appCOPY requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD [ "pyth…

Android Studio新版本New UI及相关设置丨遥遥领先版

1、前言 俗话说工欲善其事必先利其器嘛,工具用不好怎么行呢,借着Android Studio的更新,介绍一下新版本中的更新内容,以及日常开发中那些好用的设置。 2、关于新版本 2.1、最新正式版本 Android Studio Giraffe | 2022.3.1 Pat…

IntelliJ IDEA(Windows 版)的所有快捷键

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥 大家好 本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Windows 版)的所有快捷…

微服务-OpenFeign基本使用

一、前言 二、OpenFeign基本使用 1、OpenFeign简介 OpenFeign是一种声明式、模板化的HTTP客户端,它使得调用RESTful网络服务变得简单。在Spring Cloud中使用OpenFeign,可以做到像调用本地方法一样使用HTTP请求访问远程服务,开发者无需关注…

垃圾回收 - 复制算法

GC复制算法是Marvin L.Minsky在1963年研究出来的算法。说简单点,就是只把某个空间的活动对象复制到其它空间,把原空间里的所有对象都回收掉。这是一个大胆的想法。在此,我们将复制活动对象的原空间称为From空间,将粘贴活动对象的新…

如何快速搭建母婴行业的微信小程序?

如果你想为你的母婴行业打造一个独特的小程序,但没有任何编程经验,别担心!现在有许多小程序制作平台提供了简单易用的工具,让你可以轻松地建立自己的小程序。接下来,我将为你详细介绍搭建母婴行业小程序的步骤。 首先&…

mysql(九)mysql主从复制

目录 前言概述提出问题主从复制的用途工作流程 主从复制的配置创建复制账号配置主库和从库启动主从复制从另一个服务器开始主从复制主从复制时推荐的配置sync_binloginnodb_flush_logs_at_trx_commitinnodb_support_xa1innodb_safe_binlog 主从复制的原理基于语句复制优点&…

线程的组织(TCB)

线程隶属于进程,是操作系统进行任务调度的最小单位。 Thread线程知识小结_迷茫的羔羊羊的博客-CSDN博客? 线程控制块TCB的结构如下: 将多个线程的线程控制块TCB组成一张线程表:

【前端demo】动态赋值CSS

文章目录 效果过程html实现oninput与onchange事件统一配置CSS 代码HTMLCSSJS 其他demo 效果 动态显示CSS样式,由:root统一配置。 效果预览:https://codepen.io/karshey/pen/BavLrwy 参考: Dynamic CSS Variables(codepen.io) 漫谈document…

开源风雷CFD软件多物理场耦合接口开发路线分享!!!

本文将基于开发过程中积累的经验,介绍风雷如何基于preCICE开发适配器。 preCICE是一个开源的多物理场数值模拟耦合库,可以用于多个求解器联合求解一个复杂的多场问题,支持在大规模并行系统上应用,具有良好的并行效率。并且可以对…

危险边缘:揭示 Python 编程中易被忽视的四个安全陷阱

今天我们将要谈论一个非常重要的话题:Python 编程中的安全问题。作为一门广受欢迎的编程语言,Python 已经成为了许多开发者、计算机专业学生以及打工人的必备技能。 原文链接食用更佳 危险边缘:揭示 Python 编程中易被忽视的四个安全问题 然…

算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理

算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理 欧拉函数AcWing 874. 筛法求欧拉函数 快速幂AcWing 875. 快速幂AcWing 876. 快速幂求逆元 扩展欧几里德(裴蜀定理)AcWing 877. 扩展欧几里得算法AcWing 878. 线性同余方程 中国剩余定理…

DHCP工作过程详解

只有是一个网段的,它才会发送 ARP 请求,获取 MAC 地址。如果发现不是呢?Linux 默认的逻辑是,如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发送到网关。 因为网关要和当前的网络至…