freeRTOS总结(三)任务挂起和恢复

1,任务的挂起与恢复的API函数(熟悉)

在这里插入图片描述
任务挂起和恢复的区别
挂起还能被恢复,删除任务后无法恢复。
带FromISR后缀是在中断函数中专用的API函数

1.1任务挂起函数介绍

void vTaskSuspend(TaskHandle_t xTaskToSuspend)
xTaskToSuspend 待挂起任务的任务句柄
此函数用于挂起任务,使用时需将宏 INCLUDE_vTaskSuspend 配置为 1。
无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复 。
注意:当传入的参数为NULL,则代表挂起任务自身(当前正在运行的任务)

1.2任务恢复函数介绍(任务中恢复)

void vTaskResume(TaskHandle_t xTaskToResume)
xTaskToResume 待恢复任务的任务句柄
使用该函数注意宏:INCLUDE_vTaskSuspend必须定义为 1
注意:任务无论被 vTaskSuspend() 挂起多少次,只需在任务中调用 vTakResume() 恢复一次,就可以继续运行。且被恢复的任务会进入就绪态!

1.3任务恢复函数介绍(中断中恢复)

BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)
xTaskToResume 待恢复任务的任务句柄

xTaskResumeFromISR返回值描述如下:
pdTRUE 任务恢复后需要进行任务切换(被恢复任务优先级>当前任务优先级)
pdFALSE 任务恢复后不需要进行任务切换
使用该函数注意宏:INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须定义为 1
注意:中断服务程序中要调用freeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级

2实验

2.1实验目的

在这里插入图片描述

2.2实验实现过程

首先打开宏
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置NVIC分组为4

/******************************************************************************************************* @file        freertos.c* @author      正点原子团队(ALIENTEK)* @version     V1.4* @date        2022-01-04* @brief       FreeRTOS 移植实验* @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司***************************************************************************************************** @attention** 实验平台:正点原子 F407电机开发板* 在线视频:www.yuanzige.com* 技术论坛:www.openedv.com* 公司网址:www.alientek.com* 购买地址:openedv.taobao.com******************************************************************************************************/#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t   task1_handler;
void task1( void * pvParameters );#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t   task2_handler;
void task2( void * pvParameters );#define TASK3_PRIO         4
#define TASK3_STACK_SIZE   128
TaskHandle_t   task3_handler;
void task3( void * pvParameters );/******************************************************************************************************//*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/
void freertos_demo(void)
{    xTaskCreate((TaskFunction_t) start_task,(char *)	"start_task",(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,(void *) NULL,(UBaseType_t) START_TASK_PRIO,(TaskHandle_t *)&start_task_handler);//开启任务调度vTaskStartScheduler();}
void start_task( void * pvParameters )
{taskENTER_CRITICAL();               /* 进入临界区  任何任务和中断都不能打断当前程序运行*/xTaskCreate((TaskFunction_t) task1,(char *)	"task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK1_PRIO,(TaskHandle_t *)&task1_handler	);xTaskCreate((TaskFunction_t) task2,(char *)	"task2",(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK2_PRIO,(TaskHandle_t *)&task2_handler	);					xTaskCreate((TaskFunction_t) task3,(char *)	"task3",(configSTACK_DEPTH_TYPE) TASK3_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK3_PRIO,(TaskHandle_t *)&task3_handler	);vTaskDelete(NULL);//删除当前任务也就是开始任务taskEXIT_CRITICAL();}void task1( void * pvParameters )
{uint32_t task1_num=0;while(1){task1_num++;printf("task1_num= %d \n",task1_num);LED0_TOGGLE();vTaskDelay(500);}
}void task2( void * pvParameters )
{uint32_t task2_num=0;while(1){task2_num++;printf("task2_num= %d \n",task2_num);LED1_TOGGLE();vTaskDelay(500);}
}void task3( void * pvParameters )
{//静态变量在程序运行期间只会被初始化一次,即使经过多次函数调用或程序执行。因此,在程序下次运行时,静态变量的值将保持上一次程序运行结束时的值,并不会重新赋初值。//如果未显式指定初始值,则静态变量将根据其类型自动初始化为默认值。例如,静态变量 uint8_t key_up 初始值为 0。static uint8_t key =0;while(1){key = key_scan(0);if(key==KEY0_PRES){/*挂起任务1*/vTaskSuspend(task1_handler);}else if(key==KEY1_PRES){/*恢复任务1*/vTaskResume(task1_handler);}vTaskDelay(10);}
}

外部中断触发函数

void KEY2_INT_IRQHandler(void)
{ HAL_GPIO_EXTI_IRQHandler(KEY2_INT_GPIO_PIN);        /* 调用中断处理公用函数 清除KEY2所在中断线 的中断标志位,中断下半部在HAL_GPIO_EXTI_Callback执行 */__HAL_GPIO_EXTI_CLEAR_IT(KEY2_INT_GPIO_PIN);        /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
}/*** @brief       中断服务程序中需要做的事情*              在HAL库中所有的外部中断服务函数都会调用此函数* @param       GPIO_Pin:中断引脚号* @retval      无*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{delay_ms(20);      /* 消抖 */BaseType_t xYieldRequired;if (KEY2 == 0){xYieldRequired = xTaskResumeFromISR(task1_handler);}if(xYieldRequired==pdTRUE){portYIELD_FROM_ISR(xYieldRequired );}}/*** @brief       外部中断初始化程序* @param       无* @retval      无*/
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, 6,0);               /* 抢占2,子优先级2 */HAL_NVIC_EnableIRQ(KEY2_INT_IRQn);                       /* 使能中断线2 */}

注意NVIC配置HAL_NVIC_SetPriority(KEY2_INT_IRQn, 6,0);优先级要在5-15之间
官方参考链接
https://www.freertos.org/zh-cn-cmn-s/taskresumefromisr.html

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

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

相关文章

在黑马程序员大学的2023年终总结

起笔 时间真快,转眼又是年末。是时候给2023做个年终总结了,为这一年的学习、生活以及成长画上一个圆满的句号。 这一年相比去年经历了很多事情,接下来我会一一说起 全文大概4000字,可能会占用你15分钟左右的时间 经历 先来给大…

Excel中快速隐藏中间四位手机号或者身份证号等

注意:以下方式必须再新增一列,配合旧的一列用来对比操作,即根据旧的一列的数据源,通过新的一列的操作逻辑来生成新的隐藏数据 1、快捷方式是使用CtrlE 新建一列:手动输入第一个手机号隐藏后的号码,即在N2单…

k8s的集群调度:

k8s的集群调度: Scheduler:负责调度资源,把pod调度到node节点 预算策略 优先策略 list-watch k8s集群当中,通过list-watch的机制进行每个组件的协作,保持数据同步,每个组件之间的解耦 Kubectl配置文件&#xff0c…

关于burpsuite对app(移动端)进行抓包的配置

可以使用手机模拟器,我这里以自己手机(物理机)演示配置过程 如果是使用的模拟器那么肯定和电脑是在同一局域网 如果使用物理机,那么可以通过连接同一WiFi确保在同一局域网环境下 查看电脑内网ip:192.168.1.105 &am…

人工智能会造成人类失业吗?

科技革命的目的是为了提高人们生活水平和质量,而人工智能却取代了越来越多的职业,造成了人们的失业,这和科技革命的宗旨不是相矛盾了吗?!! 人工智能通过融合“数据、算力和算法”的力量,对人类…

1879_什么是丝印

Grey 全部学习内容汇总: GitHub - GreyZhang/g_hardware_basic: You should learn some hardware design knowledge in case hardware engineer would ask you to prove your software is right when their hardware design is wrong! 1873_什么是丝印 丝印这个词…

基于springboot在线考试系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合,利用java技术建设在线考试系统,实现在线考试的信息化。则对于进一步提高在线考试管理发展,丰富在线考试管理经验能起到不少的促进作用。 在线考试系统能够通过互…

ChatGPT:让产品经理工作更高效的AI助手

近年来,人工智能技术在各个领域得到了广泛应用,其中包括产品经理日常工作中的自然语言处理(NLP)。而ChatGPT是一款最新的NLP模型,它已经成为产品经理在日常工作中的得力助手。本文将详细介绍ChatGPT在产品经理日常工作…

归并排序-排序算法

前言 如果一个数组的左右区间都有序,我们可以使用一种方法(归并),使这个数组变得有序。 如下图: 过程也很简单,分别取左右区间中的最小元素,再把其中较小的元素放到临时数组中,例如…

Python书籍推荐,建议收藏

学习Python的书籍可太多了,从入门到放弃,应有尽有啊 入门书籍 根据豆瓣评分的高低,这里介绍了一些经典入门书籍,大家根据自身情况选择尝试 《Python编程:从入门到实践(第二版)》 非常经典且非…

14 简约登录页

效果演示 实现了一个简单的登录表单的样式,包括背景颜色、边框、字体颜色、字体大小、字体粗细、输入框样式、提交按钮样式等。当用户在输入框中输入内容时,输入框下方的提示文字会动态地变化,以提示用户输入正确的信息。当用户点击提交按钮时…

使用SpirngBoot时部分编译报错解决方案:

1. 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。 报错截图: 解决方案: 找到springboot的java版本看是多少版本,springboot 3.0以上的版本需要最低JDK17的版本,所以查看你自己…

Vue3插件开发教程:步步指导如何编写Vue3插件

关注⬆️⬆️⬆️⬆️ 专栏后期更新更多前端内容 文章目录 Vue3 插件插件注册形式插件主要的场景使用插件Vue3 插件 插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。 插件注册形式 一个插件可以是一个拥有 install() 方法的对象,也可以直接是一个安装函数本身。 i…

【矩阵论】Chapter 9—广义逆矩阵知识点总结复习

文章目录 广义逆矩阵1 广义逆矩阵定义2 减号逆3 最小二乘广义逆4 极小范数广义逆5 Moore-Penrose(加号逆) 广义逆矩阵 1 广义逆矩阵定义 广义逆矩阵 G G G的定义:对任意 m n m\times n mn矩阵的 A A A,如果存在某个 n m n\time…

软件测试|MySQL ORDER BY详解:排序查询的利器

简介 在数据库中,我们经常需要对查询结果进行排序,以便更好地展示数据或满足特定的业务需求。MySQL提供了ORDER BY子句,使我们能够轻松地对查询结果进行排序。本文将详细介绍MySQL ORDER BY的用法和示例,帮助大家更好地理解和应用…

JS事件循环

目录 概述1. 堆栈(Call Stack)2. 堆(Heap)3. 事件队列(Event Queue)4. 宿主环境(Host Environment) 事件循环(Event Loop)微任务和宏任务(Microta…

工程管理系统功能设计与实践:实现高效、透明的工程管理

在现代化的工程项目管理中,一套功能全面、操作便捷的系统至关重要。本文将介绍一个基于Spring Cloud和Spring Boot技术的Java版工程项目管理系统,结合Vue和ElementUI实现前后端分离。该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个…

数据库的导入导出以及备份

1.数据库的导出和导入 一.navicat导入导出 导入:右键➡运行SQL文件 导出选:中要导出的表➡右键➡转储SQL文件➡数据和结构 mysqldump命 1. 进入navicat安装目录的bin目录,cmd打开命令窗口 2. mysql -u用户名 -p ➡ 输入密码 3. creat…

String的(toCharArray\split)方法*

题目 class Solution {public int firstUniqChar(String s) {int[] sum new int[26];char[] num s.toCharArray();for(int i0;i<num.length;i) {sum[num[i]-a];}for(int j0;j<num.length;j) {if(sum[num[j]-a] 1) {return j;}}return -1; } }题目 …

博途WinCC专业版C/S架构入门指南

WinCC Professional V16 支持客户机/服务器架构&#xff0c;但目前只支持单个服务器或单对冗余服务器/多个客户机的模式&#xff0c;还不能支持像WinCC V7.5 SP1中的多个服务器/多个客户机的分布式架构。 组态步骤如下&#xff1a; 1. 在项目中分别添加服务器站和客户机站&…