首页 > 其他分享 >【FreeRTOS】阻塞机制:任务调度的默契与优雅

【FreeRTOS】阻塞机制:任务调度的默契与优雅

时间:2023-12-07 17:01:30浏览次数:26  
标签:任务调度 FreeRTOS 阻塞 TaskA 任务 机制 默契 等待

在实时操作系统(RTOS)的领域中,任务的协同合作和优雅调度是确保系统稳定性和高效性的关键因素之一。FreeRTOS作为一款广泛应用的RTOS,其阻塞机制提供了一种有力的工具,用于实现任务之间的协作与调度。本文将深入探讨FreeRTOS中的阻塞机制,介绍其概念、用法,并通过详细的代码演示来展示任务如何通过阻塞机制实现协同工作。

什么是阻塞机制?

在FreeRTOS中,阻塞机制是一种任务调度的手段,通过让任务在特定条件下暂时停滞,等待条件满足后再继续执行,从而实现任务之间的同步和协作。阻塞可以发生在不同的场景,比如等待一段时间、等待某个事件的发生、等待消息队列的消息等。

代码演示:任务的阻塞与唤醒

为了更好地理解FreeRTOS中的阻塞机制,我们将创建两个简单的任务,一个任务阻塞自己等待一定时间后被唤醒,另一个任务负责在一定时间后唤醒第一个任务。

#include <FreeRTOS.h>
#include <task.h>
#include <stdio.h>

TaskHandle_t TaskA_Handle; //句柄

void TaskA(void *params) {
    while (1) {
        printf("TaskA: Blocking for 5 seconds...\n");
        vTaskDelay(5000 / portTICK_PERIOD_MS);  // 阻塞自己等待5秒

        printf("TaskA: Woke up, doing some work...\n");
        // 执行任务A的工作...
    }
}

void TaskB(void *params) {
    while (1) {
        vTaskDelay(10000 / portTICK_PERIOD_MS);  // 10秒后唤醒任务A
        printf("TaskB: Waking up TaskA...\n");
        vTaskResume(TaskA_Handle);  // 唤醒任务A
    }
}

int main() {
    xTaskCreate(TaskA, "TaskA", configMINIMAL_STACK_SIZE, NULL, 1, &TaskA_Handle);
    xTaskCreate(TaskB, "TaskB", configMINIMAL_STACK_SIZE, NULL, 2, NULL);

    vTaskStartScheduler();

    return 0;
}

在这个例子中,TaskA会在启动后每隔5秒阻塞自己,而TaskB则在启动后每隔10秒唤醒一次TaskA。这样,我们就演示了任务之间通过阻塞机制的简单协作。

阻塞的类型:多样化应对任务需求

FreeRTOS提供了多种阻塞机制,根据不同的需求可以选择合适的类型。以下是一些常见的阻塞类型:

  1. 延时阻塞: 任务在一段时间内暂时停滞,等待后继续执行。
  2. 事件阻塞: 任务等待某个事件的发生,通过事件标志组进行同步。
  3. 消息队列阻塞: 任务等待从消息队列中接收到消息,以便进行后续处理。
  4. 互斥量阻塞: 任务等待获取互斥量,确保对共享资源的独占访问。

阻塞机制的优势

使用FreeRTOS中的阻塞机制有诸多优势:

  1. 任务同步: 通过阻塞机制,任务可以有序地等待和唤醒,实现同步操作。
  2. 低功耗: 阻塞机制可以让任务在不需要执行时进入休眠状态,降低功耗。
  3. 精细控制: 阻塞机制提供了多种类型,可以根据任务需求选择合适的方式。
  4. 避免忙等待: 替代了忙等待的方式,减少了系统资源的浪费。

总结

通过本文的介绍和代码演示,我们深入了解了FreeRTOS中阻塞机制的概念和使用方法。阻塞机制作为任务调度中的重要手段,为任务提供了一种有序、协同的工作方式。

希望本文能够帮助读者更好地理解FreeRTOS中阻塞机制的作用和优势。在RTOS的领域,让阻塞成为任务优雅协作的默契,共同构建一个高效、稳定的系统。

标签:任务调度,FreeRTOS,阻塞,TaskA,任务,机制,默契,等待
From: https://blog.51cto.com/u_16192077/8724957

相关文章

  • 【实战技能】 单步运行源码分析,一期视频整明白FreeRTOS内核源码框架和运行机制,RTOS Tr
    从源码的角度来看,OS内核源码就是通过各种链表组装起来的,FreeRTOS就是下面几个链表组成的。FreeRTOS的调度,任务切换就是倒腾这几个链表。而其它的几款OS是一个链表就一撸到底了,FreeRTOS是搞了好几个。所以视频里面就重点介绍下这个,其它的支持的也做个拓展说明。搞清楚这几个链表也......
  • FreeRTOS深入教程(中断管理)
    (文章目录)前言本篇文章来分析FreeRTOS中的中断,中断在FreeRTOS中也是非常重要的,那么这篇文章将带大家来学习一下FreeRTOS中的中断处理以及涉及到的API等。一、为什么要为中断设计一套API1.实时性要求:中断服务程序通常用于响应实时事件,例如硬件中断、定时器中断等。为了满足实......
  • FreeRTOS--信号量
    示例源码基于FreeRTOSV9.0.0信号量1.概述消息队列用于传输多个数据,但是有时候只需要传递状态,这个状态值需要用一个数值表示,在这种情况下我们只需要维护一个数值,使用信号量效率更高、更节省内存。信号量用来表示资源的个数,它是特殊的队列实现,队列数据项为空。对于二值信号量......
  • FreeRTOS--邮箱
    示例源码基于FreeRTOSV9.0.0邮箱1.概述一种特殊的队列,队列深度只有1,写数据的时候是覆盖写,读数据的时候,读完不会把数据从队列删除;写数据的时候永远是成功的,读数据的时候仅第一次队列无数据时会阻塞或失败,当队列有数据后,读都会是成功的;2.接口API//写队列#definexQueueOv......
  • FreeRTOS--队列集
    示例源码基于FreeRTOSV9.0.0队列集1.概述队列集的本质也是队列,只不过里面存放的是“队列句柄”。当任务需要及时读取多个队列时,可以使用队列集。它类似于posix的多路复用思想。可以将想要监听消息的队列放入队列集中,当其中有队列有数据达到时,队列集的接口会返回可读的队列句......
  • FreeRTOS--队列
    示例源码基于FreeRTOSV9.0.0队列1.概述FreeRTOS的队列,支持任务与任务间的通信,以及任务与中断间的通信。它是FreeRTOS系统中主要的任务间通信方式。队列内的消息,是通过拷贝方式传递,而非指针。队列除了基本的先进先出特性,也支持往队列首部写入数据。FreeRTOS基于队列进行扩......
  • FreeRTOS--链表
    示例源码基于FreeRTOSV9.0.0链表1概述链表一般可分为单向链表、双向链表、环形链表。FreeRTOS采用的是环形双向链表设计;单向链表只有后继节点,双向链表有后继和前驱节点;链表的目的是把元素串联,其设计方式一般有两种:将元素放置在链表结构体中;将链表结构体放置在元素中;方......
  • FreeRTOS--内存管理
    示例源码基于FreeRTOSV9.0.0内存管理1概述FreeRTOS有自己的一套内存管理机制,而非直接使用malloc和free等C库函数。malloc和free由于实现复杂,代码量大,运行时间不确定,存在内存碎片,非线程安全等问题,不适用于资源紧缺的FreeRTOS系统;FreeRTOS实现了5种内存管理方式,实际使用时......
  • FreeRTOS入门教程(任务通知)
    (文章目录)前言本篇文章将带大家学习任务通知的概念和使用方法。一、什么是任务通知FreeRTOS中的任务通知(TaskNotification)是一种轻量级的同步机制,允许一个任务通知另一个任务已发生的事件或条件。这对于多任务系统中的协作和同步非常有用。以下是有关FreeRTOS任务通知的详细......
  • 了解 ESP32 FreeRTOS:初学者指南
    原文:https://www.cnblogs.com/intomcu/p/17297020.html了解ESP32FreeRTOS:初学者指南ESP32FreeRTOS是什么?如何使用FreeRTOS?哪些常用的函数?xTaskCreate()vTaskDelete()vTaskDelay()xTicksToDelay()xSemaphoreCreateBinary()xSemaphoreGive()xSemaphore:要释放的信......