【FreeRtos基础入门】任务状态

简介: 【FreeRtos基础入门】任务状态

前言


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,运行结果如下:

9b32b1fb180a45fb986aa2c8f1bd6d22.png

这边就没有任何打印了。

我们可以使用vTaskResume(TaskHandle_t xTaskToSuspend)来开启任务

然后我们点击key0就可以继续运行这个任务了。当我们按按键后就像下面

3bc95a7235584e5b9214fce9897d48e0.png


3.就绪状态(Ready)

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


总结


提示:这里对文章进行总结:

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

相关文章
|
API 调度
【FreeRTOS】软件定时器的使用
【FreeRTOS】软件定时器的使用
573 0
|
编译器 调度
FreeRTOS任务的创建(动态方法和静态方法)
FreeRTOS任务的创建(动态方法和静态方法)
2827 0
|
10月前
|
存储 监控 API
1688平台API接口实战:Python实现店铺全量商品数据抓取
本文介绍如何使用Python通过1688开放平台的API接口自动化抓取店铺所有商品数据。首先,开发者需在1688开放平台完成注册并获取App Key和App Secret,申请“商品信息查询”权限。接着,利用`alibaba.trade.product.search4trade`接口,构建请求参数、生成MD5签名,并通过分页机制获取全量商品数据。文中详细解析了响应结构、存储优化及常见问题处理方法,还提供了竞品监控、库存预警等应用场景示例和完整代码。
|
物联网 Linux 流计算
EasyLogger--不一样的打印输出
EasyLogger--不一样的打印输出
|
缓存 前端开发 JavaScript
优化前端性能的五种最佳实践
在现代 web 开发中,前端性能的优化是提高用户体验的关键。本文探讨了五种最佳实践来提升前端性能,包括代码分割、懒加载、压缩资源、优化渲染和使用缓存策略。这些方法不仅有助于减少加载时间,还能提高应用的响应速度和整体用户满意度。
|
调度
【RT-Thread】学习日记之系统节拍Tick
【RT-Thread】学习日记之系统节拍Tick
266 0
【冷门快捷键】设置VSCode终端大小最小化快捷键Alt+PageUp/PageDown、编辑代码窗口切换大小快捷键Alt+数字键盘“+”、Alt+数字键盘“-”、Alt+数字键盘“0”
【冷门快捷键】设置VSCode终端大小最小化快捷键Alt+PageUp/PageDown、编辑代码窗口切换大小快捷键Alt+数字键盘“+”、Alt+数字键盘“-”、Alt+数字键盘“0”