FreeRTOS实时操作系统(三)任务挂起与恢复

news2024/9/20 20:44:40

系列文章目录

FreeRTOS实时操作系统(一)RTOS的基本概念

FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库)


文章目录

  • 系列文章目录
  • 前言
  • 任务挂起与恢复
  • 普通挂起恢复实例
  • 中断恢复实例


前言

继续跟着正点原子学习FreeRTOS之任务挂起与恢复


任务挂起与恢复

挂起任务类似暂停任务,不是删除任务。

利用的API函数:
挂起任务:vTaskSuspend()
恢复被挂起的任务:vTaskResume()
在中断中恢复被挂起的任务:xTaskResumeFromISR() (一般带FromISR后缀是在中断函数中专用的API函数)

1.任务挂起:

void vTaskSuspend(TaskHandle_t xTaskToSuspend) 

传回的参数是任务句柄,当是NULL时,挂起当前正在运行的任务。

使用时需将宏 INCLUDE_vTaskSuspend 配置为1。

无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复 。

在这里插入图片描述
在默认生成的HAl库中是打开的。

2.任务恢复:

void vTaskResume(TaskHandle_t xTaskToResume) 

传回参数是待恢复的任务句柄,任务即使被 vTaskSuspend() 挂起多次,只需在任务中调用 vTakResume() 一次,就可以继续运行,且被恢复的任务会进入就绪态。

使用时,宏INCLUDE_vTaskSuspend必须定义为 1

3.中断中任务恢复:

BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)  

参数是待恢复任务的句柄

返回值:

pdTRUE任务恢复后需要进行任务切换
pdFALSE任务恢复后不需要进行任务切换

任务切换是指恢复的任务优先级比目前的高,需要调用一个函数来实现抢占。

使用时需要将宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须定义为1,HAl库不知道为啥要放在FreeRTOS.h文件,现在还不是很懂。
在这里插入图片描述

中断服务程序中要调用freeRTOS的API函数,中断优先级不能高于FreeRTOS所管理的最高优先级

普通挂起恢复实例

使用起来很简单:

/* 任务三,判断按键KEY0,按下KEY0删除task1 */
void task3( void * pvParameters )
{
    uint8_t key = 0;
    while(1)
    {
        key = key_scan(0);
        if(key == KEY0_PRES)
        {
            printf("挂起task1\r\n");
            vTaskSuspend(task1_handler);
        }else if(key == KEY1_PRES)
        {
            printf("在任务中恢复task1\r\n");
            vTaskResume(task1_handler);
        }
        vTaskDelay(10);
    }
}

中断恢复实例

注意1:
在这里插入图片描述
上面是FreeRTOS管理的优先级,我们使用的外部中断要比5-15数值之间,优先级上看是小于等于FreeRTOS管理的最高优先级。
官网说明链接:在 ARM Cortex-M Core 上运行 RTOS
在这里插入图片描述

注意2:
在官网中说明了:
在这里插入图片描述
HAl库中,自动就是设置对的:
在这里插入图片描述
下面以正点原子的程序为例子:

void extix_init(void)
{
    GPIO_InitTypeDef gpio_init_struct; 
    key_init();    
    gpio_init_struct.Pin = KEY2_INT_GPIO_PIN;
    gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;            /* 下降沿触发 */
    gpio_init_struct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(KEY2_INT_GPIO_PORT, &gpio_init_struct);    /* KEY2配置为下降沿触发中断 */
    HAL_NVIC_SetPriority(KEY2_INT_IRQn, 5, 0);               /* 抢占5,子优先级0 */
    HAL_NVIC_EnableIRQ(KEY2_INT_IRQn);                       /* 使能中断线2 */
}

/**
 * @brief       中断服务程序中需要做的事情
                在HAL库中所有的外部中断服务函数都会调用此函数
 * @param       GPIO_Pin:中断引脚号
 * @retval      无
 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    delay_ms(20);      /* 消抖 */
    switch(GPIO_Pin)
    {
        BaseType_t xYieldRequired;//重点
        case KEY2_INT_GPIO_PIN:
            if (KEY2 == 0)
            {
                xYieldRequired = xTaskResumeFromISR(task1_handler);//重点
                printf("在中断中恢复task1\r\n");//重点
                portYIELD_FROM_ISR(xYieldRequired);//重点
             }
            break;
        default : break;
    }
}

用的是按键外部中断的例子,需要注意的是外部中断初始化的时候,中断优先级设置的是5。

这里需要注意,我们需要对返回值判断是否需要切换任务,但是无需我们自己判断:
在这里插入图片描述
如上图所示portYIELD_FROM_ISR()函数会自己判断当前值,是否执行任务切换。

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

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

相关文章

记录--封装一个通过js调用的全局vue组件

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在使用vue项目编写的时候,不可避免的会碰到需要时js api来调用组件进行显示的情况 例如饿了么element ui 的 Notification 通知、Message 消息提示等组件 虽然已经提供了,…

postman和jmete接口测试的用法与区别

目录 前言 接口测试的目的 接口测试怎么测: 1.创建接口用例集(没区别) 2.步骤的实现(有区别) 3数据用例的实现 4断言的实现 5执行 6其他 总结: 前言 前阶段做了一个小调查,发现软件测…

DETR 系列有了新发现?DETRs with Hybrid Matching 论文阅读笔记

DETR 系列有了新发现?DETRs with Hybrid Matching 论文阅读笔记 一、Abstract二、引言三、相关工作目标检测中的 DETR其它视觉任务中的 DETR标签赋值 四、方法4.1 基础知识通用的 DETR 框架通用的可变形 Deformable-DETR 框架 4.2 混合匹配4.2.1 混合分支计划一对一…

client-go的Indexer三部曲之三:源码阅读

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 《client-go的Indexer三部曲》全部链接 基本功能性能测试源码阅读 本篇概览 本文是《client-go的Indexer三部曲》系列的终篇,主要任务是阅读和…

Vue全家桶(四):Vue Router 路由

目录 Vue Router1. 相关理解1.1 Vue Router的理解1.2 对SPA应用的理解1.3 路由的理解 2. 基本路由2.1 vue-router使用步骤2.2 几个注意点2.3 触发路由2.4 嵌套路由2.5 路由传递参数方式2.5.1 params 方式2.5.2 Query的方式 2.6 命名路由2.7 路由的props配置2.8 路由跳转的repla…

H3C-HCL模拟器-VLAN划分实验

一、实验拓扑结构图: 二、实验需求: 1. 按图示为PC配置IP地址 2. SW1和SW2上分别创建vlan10和vlan20,要求PC3和PC5属于vlan10,PC4和PV6属于vlan20 3. SW1和SW2相连的接口配置为trunk类型,允许vlan10和vlan20通过 4…

AI工程化的“基座能力”?—— 聊聊GPT Function Calling

点击↑上方↑蓝色“编了个程”关注我~ 这是Yasin的第 94 篇原创文章 最近AI大模型火出了圈,很多人惊叹它的智能程度。但大多数人都以为它的能力主要在“聊天”、“写文案”这方面。然而实际它能做的远远更多。 Chat GPT是当今世界上最智能的模型,它前段时…

【Linux】—— 详解进程PCB和进程状态

前言: 在上篇我们已经对有关体系结构的基本知识进行了详细的介绍,接下来我们将进入网络编程的第一个大块—— 有关进程相关的知识!!! 目录 前言 (一) 基本概念 1、描述进程-PCB 2、查看进程…

【人工智能】— 逻辑回归分类、对数几率、决策边界、似然估计、梯度下降

【人工智能】— 逻辑回归分类、对数几率、决策边界、似然估计、梯度下降 逻辑回归分类Logistic Regression ClassificationLogistic Regression: Log OddsLogistic Regression: Decision BoundaryLikelihood under the Logistic ModelTraining the Logistic ModelGradient Desc…

使用vue脚手架搭建前端工程(附:搭配ElementUI来快速开发)

目录 一、搭建过程 1. 全局安装webpack(打包工具) 2. 全局安装vue脚手架 3. 初始化vue项目 4. vue项目目录的简单介绍 二、执行流程分析 三、自己造一个组件案例 四、ElementUI的使用 1. 环境的引入 2. 一个简单使用 3. 使用它来快速搭建后台管…

AI绘画Stable diffusion保姆级教程,看这一篇就够了「安装-配置-画图」

随着chat gpt爆火之后,越来越多的人开始关注人工智能,人工智能相关的其他应用如AI绘画,也再次得到人们的关注。AI绘画的确很上头,最近几天小编也研究一下,这里把研究的过程以及中间遇到的问题整理一下,我这…

吴恩达471机器学习入门课程3第1周——异常检测

异常检测 1 导包2 - 异常检测2.1 问题陈述2.2 数据集可视化您的数据 2.3 高斯分布2.2.1 估计高斯分布的参数2.2.2 选择阈值 ϵ \epsilon ϵ2.4 高维数据集异常检测 实现异常情况检测算法,并应用它来检测网络上的故障服务器。 1 导包 import numpy as np import ma…

管理类联考——英语二——知识篇——写作题目说明——B节

MBA,MPA,MPAcc管理类联考英语写作部分由A,B两节组成,主要考查考生的书面表达能力。共2题,25分。A节要求考生根据所给情景写出约100词(标点符号不计算在内)的应用文,包括私人和公务信函、通知、备忘录等。共…

【ESP8266 (12F)】硬件参数 以及 固件烧录

本文资料及工具地址:https://github.com/CQUPTLei/ESP8266 一、基本关系1.1 ESP8266 芯片 和 ESP 12F 模组1.2 乐鑫科技和安信可 二、ESP 8266开发板2.1 ESP 12F 产品规格2.2 ESP8266 开发板 三、固件与固件下载3.1 什么是固件3.2 固件和用户程序3.2 如何下载固件3.…

Linux下配置lunavim

前言 在lunavim官网中提供了安装脚本,一件安装即可,但是经常因为网络不稳定而导致安装失败。这里提供在Linux下进行git加速的几种方法,可以尝试下。如果问题没有解决,也不要担心,我们还提供了两种平替方法进行luanvim的…

linux实验五sed和awk

按要求写出正则表达式 显示/etc/passwd中以bash结尾的行;显示/var/log/secure文件中包含“Failed”或“FAILED”的行查找/etc/man_db.conf中含有“以m开头,并以n结尾的单词”模式的行;显示/etc/man_db.conf中,包含Linux绝对路径的行&#xff…

基础巩固(六)自定义View

文章目录 View绘制流程MeasureLayoutDraw 自定义View的实现的步骤步骤1:实现Measure、Layout、Draw流程自定义 MeasureViewGroup.LayoutParamsMeasureSpec 自定义Layout 自定义属性 绘制工具类Paint具体使用 PathCanvas View绘制流程 在绘制前,系统会有一…

Python恶搞代码

文章目录 前言Tkinter界面设计Threading多线程恶搞代码 尾声 前言 快来领取python无限弹窗恶搞代码吧!每天写一些有趣的小程序,带你成为一个浪漫的程序员! Tkinter界面设计 1. 创建一个简单的界面 Tkinter 是 Python 标准库中的一个 GUI&…

自然语言处理从入门到应用——动态词向量预训练:双向语言模型

分类目录:《自然语言处理从入门到应用》总目录 对于给定的一段输入文本 w 1 w 2 ⋯ w n w_1w_2\cdots w_n w1​w2​⋯wn​,双向语言模型从前向(从左到右)和后向(从右到左)两个方向同时建立语言模型。这样做…

go 调试利器之pprof指标分析

文章目录 概要一、指标类型1.1、堆栈指标1.2、CPU指标分析1.3、http-pprof 二、go tool pprof2.1、可视化2.2、CPU火焰图 概要 Go语言原生支持对于程序运行时重要指标或特征进行分析。pprof是其中一种重要的工具,其不仅可以分析程序运行时的错误(内存泄…