基于ESP32-C3 FreeRTOS 学习 ----消息

本文介绍了一个FreeRTOS的示例,其中创建了两个发送任务和一个接收任务,所有任务共享同一个队列。发送任务1发送结构体数据,发送任务2发送字符串数据,而接收任务以高优先级运行,等待接收数据。实验结果显示,由于接收任务的优先级高于发送任务,它会在无数据时阻塞,允许低优先级任务执行,接收到数据后继续运行。
摘要由CSDN通过智能技术生成

多任务发送,一任务接收。

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
void sendtask1(void *pvParam);
void sendtask2(void *pvParam);
void rectask1(void *pvParam);
typedef struct iQueueStruct
{
    char id;
    uint16_t data;
} xStruct;

void sendtask1(void *pvParam)
{
    QueueHandle_t QHandle;
    QHandle = (QueueHandle_t)pvParam;
    BaseType_t xStatus;
    xStruct xdata = {0, 26};
    while (true)
    {
        xStatus = xQueueSend(QHandle, &xdata, 0);
        if (xStatus != pdPASS)
            printf("send fial!\n");
        else
            printf("data was sent!\n");
        xdata.id++;
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}
void sendtask2(void *pvParam)
{
    QueueHandle_t QHandle;
    QHandle = (QueueHandle_t)pvParam;
    BaseType_t xStatus;
    char *pStrTosend;
    int i = 0;
    pStrTosend = (char *)malloc(50);

    while (true)
    {
        i++;
        sprintf(pStrTosend, "it is good times%d\n", i);
        xStatus = xQueueSend(QHandle, &pStrTosend, 0);
        if (xStatus != pdPASS)
            printf("send fial!\n");
        else
            printf("data was sent!\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}
void rectask1(void *pvParam)
{
    QueueHandle_t QHandle;
    QHandle = (QueueHandle_t)pvParam;
    BaseType_t xStatus;
    xStruct xdata = {0, 0};
    char *RecTopStr;
    while (true)
    {
        xStatus = xQueueReceive(QHandle, &xdata, portMAX_DELAY); //添加阻塞,就不需要另外阻塞
        xStatus = xQueueReceive(QHandle, &RecTopStr, portMAX_DELAY);
        if (xStatus != pdPASS)
            printf("rec fail\n");
        else
            printf("rec id is %d,data is %d, pstr is %s\n", xdata.id, xdata.data, RecTopStr);
    }
}
void app_main(void)
{
    QueueHandle_t iQueueStatus;
    iQueueStatus = xQueueCreate(50, sizeof(int));
    if (iQueueStatus != NULL)
    {
        printf("Queue was created!");
        xTaskCreate(sendtask1, "task1", 1024 * 4, (void *)iQueueStatus, 1, NULL);
        xTaskCreate(sendtask2, "task2", 1024 * 4, (void *)iQueueStatus, 1, NULL);
        xTaskCreate(rectask1, "task3", 1024 * 4, (void *)iQueueStatus, 2, NULL);//接收的优先级要高于发送的优先级。
        /* code */
    }

    while (true)
    {
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

发送任务的优先级要低于接收任务的优先级。

因为接收任务优先级高,所以它在没有接收到数据的时候会一直在阻塞状态,让低优先级的任务先运行。接收到数据后会继续运行。所以我没有在接收函数中放置阻塞函数。

实验现象:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值