【FreeRtos基础入门】任务状态

本文详细解释了在FreeRTOS中任务可能遇到的三种状态:阻塞、暂停和就绪,以及它们在STM32等单片机上的应用,涉及任务创建、暂停/恢复和优先级管理。
摘要由CSDN通过智能技术生成


前言

freertos使用stm32系列单片机,使用其他的也可以,如esp系列等…

任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能,包括任务的创建、删除、挂起、恢复和优先级控制等方面的内容。


一、任务状态

以前我们很简单地把任务的状态分为2中:运行(Runing)、非运行(Not Running)。
这两种"非运行"状态就不一样,可以细分为:
阻塞状态(Blocked)
暂停状态(Suspended)
就绪状态(Ready)

1.阻塞状态(Blocked)

在日常生活的例子中,母亲在电脑前跟同事沟通时,如果同事一直没回复,那么母亲的工作就被卡住了、被堵住了、处于阻塞状态(Blocked)。重点在于:母亲在等待。
在 上个博客的 实验中,如果把任务2中的vTaskDelay没有调用,那么任务1根本没有执行的机会,任务1被"饿死"了(starve)。
在实际产品中,我们不会让一个任务一直运行,而是使用"事件驱动"的方法让它运行:
任务要等待某个事件,事件发生后它才能运行
在等待事件过程中,它不消耗CPU资源
在等待事件的过程中,这个任务就处于阻塞状态(Blocked)
在阻塞状态的任务,它可以等待两种类型的事件:
时间相关的事件
可以等待一段时间:我等2分钟
也可以一直等待,直到某个绝对时间:我等到下午3点
同步事件:这事件由别的任务,或者是中断程序产生
例子1:任务A等待任务B给它发送数据
例子2:任务A等待用户按下按键
同步事件的来源有很多(这些概念在后面会细讲):
队列(queue)
二进制信号量(binary semaphores)
计数信号量(counting semaphores)
互斥量(mutexes)
递归互斥量、递归锁(recursive mutexes)
事件组(event groups)
任务通知(task notifications)
在等待一个同步事件时,可以加上超时时间。比如等待队里数据,超时时间设为10ms:
10ms之内有数据到来:成功返回
10ms到了,还是没有数据:超时返回

2.暂停状态(Suspended)

在日常生活的例子中,母亲正在电脑前跟同事沟通,母亲可以暂停:
好烦啊,我暂停一会
领导说:你暂停一下
FreeRTOS中的任务也可以进入暂停状态,唯一的方法是通过vTaskSuspend函数。函数原型如下:

void vTaskSuspend( TaskHandle_t xTaskToSuspend );//参数为要暂停任务的句柄,如果为NULL,表示暂停自己。

参数为要暂停任务的句柄,如果为NULL,表示暂停自己。
要退出暂停状态,只能由别人来操作:
别的任务调用:vTaskResume
中断程序调用:xTaskResumeFromISR
实际开发中,暂停状态用得不多。

uint32_t count = 0;
TaskHandle_t mytaskHandle;
TaskHandle_t mytaskHandle2;
void Task(void *p)
{
	int32_t *i = (int*)p;
	while(1)
	{
		printf("Count:%d\r\n",*i);
	 (*i)++;
		
		vTaskDelay(pdMS_TO_TICKS(500));
	}
	
	vTaskDelete(NULL);
}

void Task2(void *p)
{
	uint8_t Priority = 1;
	while(1)
	{
		if(key_scan(0) == KEY0_PRES)
		{
			Priority++;
			vTaskResume(mytaskHandle);
		}
		
		vTaskDelay(20);
	}
	
	vTaskDelete(NULL);
}

void csdnTaskTest(void)
{
	xTaskCreate(Task,"MyTask",50,&count,1,&mytaskHandle);
	xTaskCreate(Task2,"MyTask2",50,&count,3,&mytaskHandle2);
	
	vTaskSuspend(mytaskHandle);

	vTaskStartScheduler();
	
	
}

在这个代码中,我们调用了vTaskSuspend(mytaskHandle);来暂停mytaskHandle,运行结果如下:
在这里插入图片描述
这边就没有任何打印了。

我们可以使用vTaskResume(TaskHandle_t xTaskToSuspend)来开启任务
然后我们点击key0就可以继续运行这个任务了。当我们按按键后就像下面
在这里插入图片描述

3.就绪状态(Ready)

这个任务完全准备好了,随时可以运行:只是还轮不到它。这时,它就处于就绪态(Ready)。

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人才程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值