首页 > 其他分享 >Freertos学习03-Task状态

Freertos学习03-Task状态

时间:2023-06-26 23:22:20浏览次数:40  
标签:03 Task 函数 Freertos 状态 void NULL 任务 include

一、前言

  FreeRTOS是一个流行的实时操作系统,它支持多任务处理。在FreeRTOS中,任务有不同的状态,这些状态反映了任务在系统中的行为。

二、状态特点

任务可以存在于以下状态中:

  • 运行
    当任务实际执行时,它被称为处于运行状态。 任务当前正在使用处理器。 如果运行 RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。

  • 准备就绪
    准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态), 但目前没有执行的任务, 因为同等或更高优先级的不同任务已经处于运行状态。

  • 阻塞
    如果任务当前正在等待时间或外部事件,则该任务被认为处于阻塞状态。 例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态), 直到延迟结束-一个时间事件。 任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量 事件。 处于阻塞状态的任务通常有一个"超时"期, 超时后任务将被超时,并被解除阻塞, 即使该任务所等待的事件没有发生。

“阻塞”状态下的任务不使用任何处理时间,不能 被选择进入运行状态。

  • 挂起
    与“阻塞”状态下的任务一样, “挂起”状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务 没有超时。 相反,任务只有在分别通过 vTaskSuspend() 和 xTaskResume() API 调用明确命令时 才会进入或退出挂起状态。
    image
      以上几种状态中需要注意挂起态和阻塞态,函数可以通过调用vTaskDelay()函数来进入阻塞态,挂起态则通过vTaskSuspend()进入挂起态

三、实例测试

1.相关函数

1)挂起函数vTaskSuspend(),这个函数可以将任务从就绪、运行、以及阻塞态置入挂起态,输入参数为任务的句柄,将函数写在任务函数的内部可以将自己挂起,此时输入参数无须句柄,为NULL。
image

2)挂起所有任务函数vTaskSuspendAll(),这个函数的工作原理是系统维护一个全局变量uxSchedulerSuspended的计数值,对于FreeRTOS来说,task的切换是在中断中发生的,如果中断进来,中断中会对uxSchedulerSuspended这个变量的值进行判断,从而决定是否需要进行Task切换。当其大于0的时候禁止调度,等于0的时候表示允许调度。
  如果调度器挂起话,当前正在执行的Task会一直继续执行,内核不再调度(意味着当前任务不会被切换出去),直到该任务调用了xTaskResumeAll()函数。
注意在使用vTaskSuspendAll()挂起其余任务区间,不允许调用其他FreeRTOS API 函数。
image
3)恢复函数vTaskResume(),挂起函数相对,恢复函数可以将处于挂起状态的函数恢复至就绪态,注意只能是就绪态。使用时只需要传入句柄即可。
image

4)恢复所有函数xTaskResumeAll(),可与vTaskSuspendAll()配合使用,将所有函数的挂起态解除。
image

2.代码测试

测试1:该例子在任务创建之后先将task1挂起,经短暂延迟恢复,所以可以观察到有一段只有task2输出,task1无输出:

#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"

void mytask1(void *pvParam)
{
	while (1)
	{
		printf("111-task1 \n");
		vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时
	}
}

void mytask2(void *pvParam)
{
	while (1)
	{
		printf("222-task2 \n");
		vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时
	}
}

void app_main(void)
{
	TaskHandle_t xHandle = NULL; // 任务句柄

	xTaskCreate(mytask1, "mytask1", 1024, NULL, 1, &xHandle); // 传入参数
	xTaskCreate(mytask2, "mytask2", 1024, NULL, 2, NULL);	  // 传入参数
	vTaskDelay(2000 / portTICK_PERIOD_MS);					  // 延时
	vTaskSuspend(xHandle);									  // 挂起
	vTaskDelay(2000 / portTICK_PERIOD_MS);					  // 延时
	vTaskResume(xHandle);									  // 恢复
}

image
测试2:测试vTaskSuspendAll()xTaskResumeAll(),有时我们需要保证某个任务运行期间不被打扰,例如对都某时间点的各传感器数据进行采样,因为要保证传感器数据尽量在同一时刻采集,所以此时我们可以停止其他任务调度,等待采集结束后再恢复。

#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"

void mytask1(void *pvParam)
{

	printf("task1-begin \n");
	vTaskSuspendAll(); // 挂起所有任务
	for (int i = 0; i < 9999; i++)
	{
		for (int j = 0; j < 9999; j++)
		{
			; // 模拟不可中断任务
		}
	}

	xTaskResumeAll(); // 恢复所有任务
	printf("task1-over \n");
	vTaskDelete(NULL);
}

void mytask2(void *pvParam)
{
	while (1)
	{
		printf("222-task2 \n");
		vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时
	}
}

void app_main(void)
{
	TaskHandle_t xHandle = NULL; // 任务句柄

	xTaskCreate(mytask1, "mytask1", 2048, NULL, 1, &xHandle); // 传入参数
	xTaskCreate(mytask2, "mytask2", 2048, NULL, 2, NULL);	  // 传入参数
}

测试结果:符合预期。
image

THE END!

标签:03,Task,函数,Freertos,状态,void,NULL,任务,include
From: https://www.cnblogs.com/seekwhale13/p/17506877.html

相关文章

  • 03 CRUD分类
    公共字段自动填充预准备实现步骤:代码实现在commons下创建MyMetaObjecthandler类,编写:packagecom.itheima.reggie.common;importcom.baomidou.mybatisplus.core.handlers.MetaObjectHandler;importlombok.extern.slf4j.Slf4j;importorg.apache.ibatis.reflecti......
  • 线程上运行 task
    我没能实现始终在一个线程上运行task 前文我们总结了在使用常驻任务实现常驻线程时,应该注意的事项。但是我们最终没有提到如何在处理对于带有异步代码的办法。本篇将接受笔者对于该内容的总结。如何识别当前代码跑在什么线程上一切开始之前,我们先来使用一种简单的方式来识......
  • javascript:return confirm('您确定要删除吗?')
    javascript:returnconfirm('您确定要删除吗?')οnclick="javascript:returnconfirm('您确定要删除吗?')" 用在<a>和<input>标签里都可以 例如:<ahref="?id=XXX"οnclick="javascript:returnconfirm('您确定要删除该条数据吗?')"......
  • Freertos学习03-Task优先级
    一、前言FreeRTOS是一个流行的实时操作系统,它允许用户创建多个任务并在它们之间共享处理器时间。在FreeRTOS中,任务的优先级别是非常重要的,因为它决定了任务在系统中的执行顺序。二、任务优先级特点FreeRTOS中的任务优先级别是一个整数,范围从0到configMAX_PRIORITIES-1,其......
  • Authentication to host '10.167.32.123' for user 'root' using method 'mysql_
    连接Mysql5.7以上的版本的数据库出现报错:C#连接远程连接mysql时,抛异常:Authenticationtohost'10.167.32.123'foruser'root'usingmethod'mysql_native_password'failedwithmessage:Readingfromthestreamhasfailed最终在Mysql官网的bug提交区发现已经有人也遇到......
  • CF603E Pastoral Oddities
    CF603EPastoralOddities题意给定一张\(n\)个点的无向图,初始没有边。依次加入\(m\)条带权的边,每次加入后询问是否存在一个边集,满足每个点的度数均为奇数。若存在,则还需要最小化边集中的最大边权。题解感觉自己找性质的能力还是太弱了。首先有一个结论,如果整张图的联通......
  • 【HMS Core】web端网页应用集成账号服务,请求/oauth2/v3/token返回状态码403
    【问题描述】web端网页应用接入华为账号,请求/oauth2/v3/token返回状态码403请求代码:响应日志:【问题分析】这是由于跨域访问报错了,建议从服务器端调用token接口重试,不要把client_secret暴露到web端【解决方案】服务器端调用token接口参考链接:https://developer.huawei.com/consumer......
  • 一个同步机无传感滑膜观测器模型加代码,该模型基于28035芯片,采用了典型的smo+pll方案
    一个同步机无传感滑膜观测器模型加代码,该模型基于28035芯片,采用了典型的smo+pll方案。这段代码是实际应用代码,而不是一般的玩票代码,因此具有较高的可比性(不同于ti例程)。需要注意的是,少数文件中的中文注释可能存在乱码问题。至于m文件,它并没有太多用处,直接运行simulink模型即可。知......
  • outlook2003存储位置
    默认的保存路径是c:\DocumentsandSettings\你的用户名\LocalSettings\ApplicationData\Microsoft\Outlook,如果想更改位置需要事先建立,如d:\email,然后在关闭outlook的情况下把c:\DocumentsandSettings\你的用户名\LocalSettings\ApplicationData\Microsoft\Outlook里面的......
  • Freertos学习02-Task传入参数
    一、前言介绍了freertos具有许多特点,其中的任务调度将有助提高系统的实时性,并将各任务解耦,有助于产品的后续维护与开发,上一节介绍了freertos中关于任务的创建与删除,这一节介绍如何在创建函数的同时并传递参数。二、传递参数再次回顾xTaskCreate()函数的用法以及各输入参数,其中......