avatar

松果工作室

欢迎光临

  • 首页
  • freeRTOS
  • ESP
  • 开发手册
  • 快速笔记
  • 个人收藏
  • 工具
Home 消息队列(Queue)
文章

消息队列(Queue)

Posted 2023-11-19 Updated 2023-11- 19
By YCP
6~7 min read

这就是个往别的 Task 发送数据的,可以是任何数据。

使用流程

  • 创建队列存数据
  • Task1:发数据到队列
  • Task2:等队列有数据,阻塞状态

特殊情况

条件:队列大小为 5。
Task1:每隔 1 秒往队列发送数据。
Task2:每隔 10 秒接收一次数据。

到了第 6 秒,队列已满。
会发生:
Task1 由于发送不了数据被阻塞,直到第 10 秒 Task2 接收到一个数据,Task1 才能往队列塞一个数据。

代码示例

由于是队列,所以满足先进先出的原则。

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
     
QueueHandle_t xQueue;

void vTask1(void *pvParameters) {
    int item = 0;
    while (1) {
        item++;
        xQueueSend(xQueue, &item, portMAX_DELAY);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void vTask2(void *pvParameters) {
    int received_item;
    while (1) {
        if (xQueueReceive(xQueue, &received_item, portMAX_DELAY) == pdTRUE) {
            printf("接收到的元素是%d\r\n", received_item);
        }
    }
}

void app_main() {
    xQueue = xQueueCreate(5, sizeof(int));

    xTaskCreate(vTask1, "Task1", 2048, NULL, 2, NULL);
    xTaskCreate(vTask2, "Task2", 2048, NULL, 2, NULL);
}
重学 freeRTOS
freeRTOS
License:  CC BY 4.0
Share

Further Reading

May 9, 2024

freeRTOS 高精度定时任务

vTaskDelayUntil()能精确地在每 50ms 调用这个函数 void TASKF(void *ptr) { TickType_t xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); while (1) { vTask

Dec 8, 2023

事件组(Event Group)

使用流程 创建事件组句柄 定义事件组标志位 Task1:事件组标志位置 1 Task2:创建等待事件组事件;检测事件组标志位是否置 1 注意事项 待补充,纯属一个 Flag。 代码示例 #include <FreeRTOS.h> #include <task.h> #

Dec 7, 2023

软件定时器(Software Timer)

使用流程 创建定时器句柄 启动定时器 注意事项 启动定时器后,延时一个周期再执行定时器回调,不会立刻执行。因此,当定时器句柄中的 pdTure 改成 pdFalse,这就是个延时任务。 延时任务执行一次之后,如果再次执行xTimerStart,会再次执行一次延时任务。 代码示例 #include "

OLDER

二进制信号量(Semaphore)

NEWER

类和对象

Recently Updated

  • ESP32(八) 简单的webserver
  • ESP32(七) NVS
  • ESP32(四) STA & AP
  • 多级菜单
  • ESP32(五) ESP32 OTA

Trending Tags

WCH Linux Elec freeRTOS STM ESP Flutter Others SwiftUI

Contents

©2025 松果工作室. Some rights reserved.

Using the Halo theme Chirpy