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

2023-11-18

系列文章

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

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

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

FreeRTOS实时操作系统(四)中断任务管理

FreeRTOS实时操作系统(五)进入临界区、任务调度器挂起与恢复

FreeRTOS实时操作系统(六)列表与列表项

FreeRTOS实时操作系统(七)时间片调度及RTOS的滴答定时器

FreeRTOS实时操作系统(八)任务状态查询及时间统计函数

FreeRTOS实时操作系统(九)时间延时函数及消息队列

FreeRTOS实时操作系统(十)信号量

FreeRTOS实时操作系统(十一)队列集

FreeRTOS实时操作系统(十二)事件标志组

FreeRTOS实时操作系统(十三)任务通知

FreeRTOS实时操作系统(十四)软件定时器

FreeRTOS实时操作系统(十五)Tickless低功耗模式

FreeRTOS实时操作系统(十六)内存管理



前言

继续跟着正点原子学习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()函数会自己判断当前值,是否执行任务切换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS实时操作系统(三)任务挂起与恢复 的相关文章

  • BFD库

    BFD库 2011 01 16 11 16 22 分类 LINUX 什么是 BFD Binary format descriptor 即二进制文件格式描述符 它是连接工具 ld 和二进制文件操作工具 bin util 实现对于目标文件操作的

随机推荐

  • 手机设置无密码时显示“已被管理员、加密政策或凭据存储停用”的解决办法

    前段时间手机上为了抓包安装了SSL证书 并且设置了锁屏密码 后来觉得锁屏密码很麻烦就想着关掉锁屏密码 发现无密码选项是灰色的 并且提示 已被管理员 加密政策或凭据存储停用 如下图 网上百度大多数办法就是 设置 gt 安全 gt 删除凭证 然
  • 华为手机一键刷新在哪里_华为一小步,国产系统一大步,鸿蒙OS2.0手机系统低调发布...

    12月16日上午 华为如约低调发布了鸿蒙OS 2 0的手机开发者Beta版 从发布会上展示的鸿蒙OS 2 0界面来看 似乎就是EMUI 11的翻版 华为鸿蒙OS避免了以前失败的手机系统没有生态的问题 采用了兼容安卓生态的策略 全面兼容安卓应
  • element ui 实现动态表单

    实现具体功能 对表单进行新增 删除以及验证每一个表单的字段 实现效果如图 1 实现表单的添加和删除 新增 addForm index this refs form validate valid gt if valid alert submi
  • 数据结构的复杂度

    数据结构的复杂度 在介绍复杂度之前我们现分享一个名词叫算法效率 算法效率 算法效率是指算法执行的时间 算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量 算法效率也分为两种 一种是时间效率 一种是空间效率 也被称为时间
  • html爱心表白代码(最全)

    目录 写在前面 十四个表白效果及使用说明 最后几个是最新的效果 购买本文前12个代码 怎么在页面添加文字和背景音乐 如何得到自己喜欢的音乐链接地址 怎么修改背景颜色或字体颜色 其他表白代码 跨年表白代码 最新表白代码 绝对好看 常见问题说明
  • MATLAB小技巧(33)arima时间序列

    MATLAB小技巧 33 arima时间序列 前言 一 MATLAB仿真 二 仿真结果 三 小结 前言 MATLAB进行图像处理相关的学习是非常友好的 可以从零开始 对基础的图像处理都已经有了封装好的许多可直接调用的函数 这个系列文章的话主
  • Ajax回调函数中再次使用Ajax访问controller,通过controller return来重定向跳转页面失败

    Ajax访问controller 通过controller return来重定向跳转页面失败 Ajax回调函数中再次使用Ajax访问controller 通过controller return来重定向跳转页面失败 ajax type pos
  • python自定义输出颜色_Python logging自定义字段输出及设置日志打印颜色

    importloggingimportosfrom logging importhandlersclassJsonFilter logging Filter 此处定义字段的默认值 如果打印信息时不设置对应字段 则为默认值 服务服务名或者服务
  • 武侠乂怎么修改服务器,武侠乂操作技巧 武侠乂手游怎么操作

    武侠乂怎么操作 武侠乂是一个主要以生存竞技玩法为主游戏 在有限的时间和安全空间内 玩家需要边生存边搜索边战斗 最终击败所有其他玩家来获得胜利 今天小辰给大家介绍一下武侠乂的操作技巧 一起来看看吧 武侠乂怎么操作 如上图 手游不像端游 整体简
  • nvidia驱动安装·

    nvidia驱动安装 禁用nouveau驱动 sudo apt get remove purge nvidia sudo gedit etc modprobe d blacklist conf 在文本最后添加 禁用nouveau第三方驱动
  • 超详细的Nginx负载均衡+高可用配置(亲测附图)

    负载均衡 目的 提升吞吐率 提升请求性能 提 高容灾 Nginx 实现负载均衡用到 proxy pass 代 模块核心配置 将客户端请求代 转发至一组 upstream 虚拟服务池 负载均衡和反向代理的区别是 反向代理由代理服务器指定特定的
  • 电商零售行业1--用户消费行为分析

    用户消费行为分析 项目背景 数据处理 导入数据 数据探索可视化 数据预处理 用户整体消费分析 用户个体消费分析 用户消费金额 消费次数 描述性统计 用户消费分布图 用户累计消费金额占比分析 贡献度 用户消费行为 首购时间 最后一次购买时间
  • 解决php7.2后报错Warning: Use of undefined constant PRE - assumed问题

    解决此种问题其实也不是很难 只是报了 Warning警告 我们只需要关闭 PHP错误提示 就行了 具体步骤如下 1 打开 php ini 2 设置 error reporting E ALL E DEPRECATED E STRICT 3
  • 使用fiddle抓包使用教程

    Fiddler是什么 Fiddler是一个http调试代理 它能 够记录所有的你电脑和互联网之间的http通讯 Fiddler 可以也可以让你检查所有的http通讯 设置断点 以及Fiddle 所有的 进出 的数据 指cookie html
  • 如何在css文件中使用本地ttf/woff/woff2字体?

    如何在css文件中使用本地ttf woff woff2字体 1 首先下载ttf woff woff2字体文件 免费的字体文件可以上阿里矢量图库进行下载 不过数量很少 2 在css文件中配置相应代码 font face font family
  • 关于IBM MQ6.0与MQ8.0的通信问题

    国庆之后 负责的一个项目突然出现了问题 描述问题 在网络 业务 业务量都没有增长的情况下 MQ8的批量发送通道突然就挂掉了 变成retrying状态了 消息全都堵在传输队列里了 死信队列无消息 实时通道正常 排除网络原因导致的通道问题 采取
  • Cannot declare class app\home\controller\Cases because the name is already in use

    Cannot declare class app home controller Cases because the name is already in use 命名空间冲突了 use 模型类的时候使用as别名 同一个页面上 命名空间不同
  • MyBatis-Plus主键生成策略

    主键生成策略 MyBatis Plus默认实现5种主键生成策略 分别是 AUTO 配合数据库设置自增主键 可以实现主键的自动增长 类型为nmber INPUT 由用户输入 NONE 不设置 等同于INPUT ASSIGN ID 只有当用户未
  • 常见git报错问题

    1 windows使用git时出现 warning LF will be replaced by CRLF windows中的换行符为 CRLF 而在linux下的换行符为LF 所以在执行add 时出现提示 解决办法 rm rf git 删
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO