FreeRTOS学习笔记—任务挂起和恢复

news2025/1/11 5:54:20

文章目录

  • 一、任务挂起和恢复API函数
    • 1.1 vTaskSuspend()函数
    • 1.2 vTaskResume()函数
    • 1.3 xTaskResumeFromISR()函数
  • 二、任务挂起和恢复
    • 2.1 任务1挂起解挂任务2
    • 2.2 中断中解挂任务1
  • 三、补充内容
    • 3.1 FreeRTOS数据类型
    • 3.2 中断优先级分组
    • 3.3 错误问题

一、任务挂起和恢复API函数

在项目中有时我们会遇到某些任务需要暂停一段时间,过一段时间在重新运行的情况。任务挂起和恢复就满足了这种需求。当某个任务需要暂停一段时间时,可以将其挂起。当需要重新运行时,再恢复就可以了。。FreeRTOS 的任务挂起和恢复API函数如下

任务恢复和挂起API函数

1.1 vTaskSuspend()函数

该函数的功能是于将某个任务设置为挂起态。任务进入挂起态后,就永远都不会进入运行态。除非调用任务恢复函数 vTaskResume()或 xTaskResumeFromISR()。任务挂起函数有以下输入参数

  • xTaskToSuspend
    要挂起的任务的任务句柄。如果需要挂起任务自身,该参数写NULL。

任务挂起函数无返回值。

1.2 vTaskResume()函数

该函数的功能是将一个任务从挂起态恢复到就绪态。任务恢复函数有以下输入参数

  • xTaskToResume
    需要恢复的任务的任务句柄。

任务恢复函数也没有返回值。

1.3 xTaskResumeFromISR()函数

该函数的功能是在中断服务函数中恢复一个任务。该函数有以下输入参数

  • xTaskToResume
    要恢复的任务的任务句柄。

该函数有以下返回值

  • pdTRUE
    恢复运行的任务的任务优先级等于或者高于正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数以后必须进行一次上下文切换。
  • pdFALSE
    恢复运行的任务的任务优先级低于当前正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数的以后不需要进行上下文切换。

二、任务挂起和恢复

2.1 任务1挂起解挂任务2

任务创建可以见上一篇,任务创建与删除。这里直接修改任务1。任务1修改为,运行10次任务1之后,将任务2挂起。再运行10次后,解挂任务2。任务1函数如下

void taks1_task (void *pxCreatedTask)
{
	u8 task1Cunt = 0;   // 任务1运行次数计数变量
	
	while (1)
	{
		task1Cunt = task1Cunt + 1;   // task1运行次数加1
		
		Med_Led_StateReverse(LED0);   // LED0状态取反
		vTaskDelay(500);   // 延时500ms
		
		// 运行5次后
		if (task1Cunt == 10)
		{
			// 挂起任务2
			vTaskSuspend(TASK2Task_Handler);
		}
		if (task1Cunt == 20)
		{
			// 解挂任务2
			vTaskResume(TASK2Task_Handler);
		}
	}
}

2.2 中断中解挂任务1

最开始尝试在外部中断中挂起和解挂任务1,发现挂起任务1时,程序异常。查询后发现,在中断中不能使用挂起函数。因此调整了一下,任务2运行5次后,挂起任务1。通过外部中断,解挂任务1。

在中断中解挂任务时注意,需要判断一下函数xTaskResumeFromISR()的返回值。如果函数xTaskResumeFromISR()返回值为pdTRUE,那么说明要恢复的这个任务的任务优先级等于或者高于正在运行的任务(被中断打断的任务),所以在退出中断的时候一定要进行上下文切换

外部中断程序配置如下

/*
 *==============================================================================
 *函数名称:Exit_Init
 *函数功能:初始化外部中断
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Exit_Init (void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	EXTI_InitTypeDef  EXTI_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   // 开启AFIO时钟

	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);   //选择GPIO管脚用作外部中断线路
	
	//EXTI0 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;   //EXTI0中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=6;   //抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;   //子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	   //根据指定的参数初始化VIC寄存器
	
	EXTI_InitStructure.EXTI_Line=EXTI_Line0;   // EXIT0
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;   // 中断
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;   // 上升沿触发
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;   // 使能
	EXTI_Init(&EXTI_InitStructure);
}

外部中断的中断服务函数如下

/*
 *==============================================================================
 *函数名称:EXTI0_IRQHandler
 *函数功能:外部中断0中断服务函数
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */

// 任务1的任务句柄
extern TaskHandle_t TASK1Task_Handler;

void EXTI0_IRQHandler(void)
{
	BaseType_t YieldRequired;	
	
	// 如果EXIT0中断标志位被置1
	if(EXTI_GetITStatus (EXTI_Line0)==1)
	{
		YieldRequired = xTaskResumeFromISR(TASK1Task_Handler);   // 恢复任务1
		
		if(YieldRequired == pdTRUE)
		{
			// 执行一次任务调度
			portYIELD_FROM_ISR(YieldRequired);
		}
	}
	EXTI_ClearITPendingBit (EXTI_Line0);   // 清除中断标志位
}

三、补充内容

3.1 FreeRTOS数据类型

在portmacro.h头文件,里面定义了2个数据类型

  • TickType_t
    FreeRTOS中断计数值类型,可以是16位也可以是32位,对于32位CPU来说TickType_t最好为32位。
  • BaseType_t
    能够让CPU运行效率最高的数据类型。对于32位CPU,BaseType_t就是uint32_t 。16位CPU就是uint16_t ,8位CPU就是uint8_t 。

3.2 中断优先级分组

优先级分组:中断控制器(NVIC)允许定义每个中断优先级的比特被分割成定义中断的优先级比特和定义中断的次优先级比特。为简单起见,必须将所有位定义为抢占优先位。如果不是这样(如果某些位表示次优先级),下面的断言将失败。

简单来说,就是在设置优先级分组时,需要将全部的位都设置为抢占优先级。否则会导致程序异常。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);   // 设置系统中断优先级分组4	

3.3 错误问题

在编译时发现有下面的错误提示

错误提示

该错误是因为“task.h”必须出现在“FreeRTOS.h”下面。

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

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

相关文章

ChatGPT | Word文档如何更好地提取表格内容给ChatGPT

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! Word文档如何更好地提取表格内容给ChatGPT做知识库,这属于文本预处理工作。 本文只讲思路、测试结果,技术实现用Python和Java都能完成,下一篇文章再贴源码…

Python实用工具--全python制作一个音乐下载器

前言 又来展示一下关于Python的实用小技巧了,这次就来分享分享–如何用Python来制作一个音乐下载器 做这个有什么用啊,我只能说,可以免费下载歌曲啊,这样就能每月保住自己钱包咯 效果展示 基本界面 图片以及文字都是可以自己更…

《动手学深度学习》——线性神经网络

参考资料: 《动手学深度学习》 3.1 线性回归 3.1.1 线性回归的基本元素 样本: n n n 表示样本数, x ( i ) [ x 1 ( i ) , x 2 ( i ) , ⋯ , x d ( i ) ] x^{(i)}[x^{(i)}_1,x^{(i)}_2,\cdots,x^{(i)}_d] x(i)[x1(i)​,x2(i)​,⋯,xd(i)​…

序列化对象

1:对象序列化 以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。使用到的流是对象字节输出流:ObjectOutputStream 2:对象要序列化,必须实现Serializable序列化接口 2:对象反序…

二十四、HTTPS

文章目录 一、HTTPS(一)定义(二)HTTP与HTTPS1.端口不同,是两套服务2.HTTP效率更高,HTTPS更安全 (三)加密,解密,密钥等概念(四)为什么要…

【H5】文件下载(javascript)

系列文章 【移动设备】iData 50P 技术规格 本文链接:https://blog.csdn.net/youcheng_ge/article/details/130604517 【H5】avalon前端数据双向绑定 本文链接:https://blog.csdn.net/youcheng_ge/article/details/131067187 【H5】安卓自动更新方案&a…

hivesql列转行

原表: 目标表: sql代码: select dp as 日期 ,city_name as 城市, split_part(subject,‘:’,1) as 指标, cast( split_part(subject,‘:’,2) as double ) as 数值 from( select trans_array(2,‘;’,dp,city_name,subject) as (dp,city_na…

探秘高逼格艺术二维码的制作过程-AI绘画文生图

前几天看到几个逼格比较高的二维码,然后自己动手做了一下,给大家看看效果: 1、文生图(狮子): 2、文生图(城市): 下边将开始介绍怎么做的,有兴趣的可以继续读…

Vault AppRole最佳实现过程

AppRole AppRole身份验证方法允许机器或应用程序使用 Vault 定义的角色进行身份验证。AppRole 的开放式设计支持使用不同的工作流和配置来应对大量应用程序。这种身份验证方法主要是面向自动化工作流程(机器和服务)设计的,对人类操作者不太有用。 “AppRole”代表一组 Vau…

大数据Doris(五十六):RESOTRE数据恢复

文章目录 RESOTRE数据恢复 一、RESTORE数据恢复原理 二、RESTORE 数据恢复语法 三、RESOTRE数据恢复案例 1、在 Doris 集群中创建 mydb_recover 库 2、执行如下命令恢复数据 3、查看 restore 作业的执行情况 四、注意事项 RESOTRE数据恢复 Doris 支持BACKUP方式将当前…

力扣 40. 组合总和 II

题目来源:https://leetcode.cn/problems/combination-sum-ii/description/ C题解: 这道题的难点在于解集中不能包含重复的组合。如果用set去重会造成超时,所以只能在单层递归逻辑中处理。通过识别下一个数与当前数是否相同,来修改…

抖音小程序--开启沙盒模式后一直报,获取白名单失败:您没有权限访问此应用

一. 出现问题 按照抖音开发文档创建沙盒环境,然后替换appid后一直报无权限,如下图: 最后才发现,登录抖音开发工具的账户必须是超级管理员账户,添加的协助开发者,就算给了全部权限,也依然会报上面…

Navicat 入选中国信通院发布的《中国数据库产业图谱(2023)》

7 月 4 日,2023 年可信数据库发展大会主论坛在北京国际会议中心成功召开。会上,中国信息通信研究院正式发布《中国数据库产业图谱(2023)》。作为中国数据库生态工具供应商,凭借易用、稳定、可靠的产品力,以…

【C++】4.工具:读取yaml配置信息

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍读取yaml配置信息。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&…

web学习1--maven--项目管理工具

写在前面: 这学期搞主攻算法去了,web的知识都快忘了。开始复习学习了。 文章目录 maven介绍功能介绍maven安装jar包搜索仓库 pom文件项目介绍父工程依赖管理属性控制可选依赖构建 依赖管理依赖的传递排除依赖可选依赖 maven生命周期分模块开发模块聚合…

产品的帮助中心怎么建设?关于帮助文档的7个小技巧

用户使用产品的过程中,常常会遇到与产品使用相关的问题。这时候,用户通常会面临三个选择:1.寻找客服的帮助 2.阅读产品帮助文档 3.放弃使用产品。 显然,对于企业而言,当然是希望能够帮助用户解决问题,使其…

shiro入门

1、概述 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。借助 Shiro 您可以快速轻松地保护任何应用程序一一从最小的移动应用程序到最大的 Web 和企业应用程序。 作用:Shiro可以帮我们完成 :认证、授权、加密、会话管理、与 Web 集成、…

车载通信,来看看SOA架构通信如何跨系统的

SOA车载跨系统通信 在车载系统中实现跨系统通信时,SOA架构(Service-Oriented Architecture,面向服务的架构)可以提供一种有效的解决方案。以下是一种基于SOA的车载跨系统通信的概述: 定义服务接口:首先&a…

2023年无线蓝牙耳机排行榜,十款无线蓝牙耳机品牌推荐

蓝牙耳机作为现代生活必备的电子产品之一,我们在选购时的选择就显得尤为重要。随着各大科技公司对蓝牙耳机功能的不断完善,用户对于耳机的期望也越来越高,音质、性能、降噪、舒适度等方面都成为了用户选择蓝牙耳机时考虑的因素。接下来我们一…

从零开始 Spring Boot 57:JPA中的一对多关系

从零开始 Spring Boot 57:JPA中的一对多关系 图源:简书 (jianshu.com) 在上篇文章中我们介绍了如何在 JPA 中实现实体的一对一关系,在关系型数据库设计中,除了一对一关系,还存在一对多关系。本篇文章介绍如何在 JPA 中…