ESP32C3学习笔记:freeRTOS

1、任务创建和销毁

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"

/**
 * @brief 
 * task函数
 * @param pvParameter 
 */
void my_task(void *pvParameter)
{
    while (1)
    {
        printf("Hello world!\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    //自己删除自己
    //  vTaskDelete(NULL);
}

void app_main(void)
{
    TaskHandle_t xHandle = NULL;
    // 1、task 2、名称  3、栈大小 4、参数  5、优先级 6、句柄
    xTaskCreate(my_task, "my_task", 2048, NULL, 5, &xHandle);
    // printf("Hello world!\n");
    vTaskDelay(5000 / portTICK_PERIOD_MS);
    //销毁task
    if (xHandle != NULL)
    {
        vTaskDelete(xHandle);
    }
}

2、参数传递

/**
 * @brief
 * task函数
 * @param pvParameter
 */
void my_task(void *pvParameter)
{
    int *pInt;
    pInt = (int *)pvParameter;
    printf("Hello world! param = %d\n", *pInt);
    vTaskDelay(1000 / portTICK_PERIOD_MS);
    // 自己删除自己
    vTaskDelete(NULL);
}

int testNum = 10;
void app_main(void)
{
    // 1、task 2、名称  3、栈大小 4、参数  5、优先级 6、句柄
    xTaskCreate(my_task, "my_task", 2048, (void *)&testNum, 5, NULL);
}

3、优先级

最大定义值为24

取优先级别

修改优先级别

4、任务挂起和恢复

任务的状态:

suspended:挂起
blocked:阻塞态

挂起函数

5、task系统

必须要配置开启,才能使用上面的方法

6、task堆栈的设置

    // 1、task 2、名称  3、栈大小 4、参数  5、优先级 6、句柄
    xTaskCreate(my_task, "my_task", 2048, (void *)&testNum, 5, NULL);

获取这个值的数据,根据情况调整创建时候的堆栈大小

返回的数字越小,越接近堆栈溢出

7、看门狗

1、中断看门狗

2、任务看门狗

idle task 需要5秒执行一次,不然会重启  idle task优先级为0

程序里面有死循环,不能使idle的任务执行,那就会触发看门狗,进行重启。

esp_task_wdt_add(NULL)
//喂狗
esp_task_wdt_reset()

8、queue

队列传递数据

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"

#include "freertos/queue.h"

typedef struct
{
    uint8_t id;
    uint8_t data;
} xStruct;

QueueHandle_t handle = NULL;

/**
 * @brief
 * task函数
 * @param pvParameter
 */
void send_task(void *pvParameter)
{
    xStruct xUSB = {0, 56};
    BaseType_t xStatus;
    while (1)
    {
        // 发送数据到队列中
        xStatus = xQueueSend(handle, &xUSB, 0);
        if (xStatus == pdPASS)
        {
            printf("send success %d\n", xUSB.id);
        }
        else
        {
            printf("send fail %d\n", xUSB.id);
        }
        xUSB.id++;
        if (xUSB.id == 8)
        {
            xUSB.id = 1;
        }
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void receive_task(void *pvParameter)
{
    xStruct xUSB = {0, 0};
    BaseType_t xStatus;
    while (1)
    {
        if (uxQueueMessagesWaiting(handle) > 0)
        {
            xStatus = xQueueReceive(handle, &xUSB, 0);
            if (xStatus == pdPASS)
            {
                printf("get data success %d\n", xUSB.id);
            }
            else
            {
                printf("get data fail\n");
            }
        }
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void app_main(void)
{
    // 创建队列
    handle = xQueueCreate(10, sizeof(xStruct));
    if (handle != NULL)
    {
        printf("queue create success\n");
        // 1、task 2、名称  3、栈大小 4、参数  5、优先级 6、句柄
        xTaskCreate(send_task, "send_task", 1024 * 5, NULL, 1, NULL);
        xTaskCreate(receive_task, "receive_task", 1024 * 5, NULL, 1, NULL);
    }
    else
    {
        printf("queue create fail\n");
    }
}

9、队列集合(queue set)

10、队列邮箱 queue mailbox

发送方写数据,接收方只能读取数据,不能删除数据。

11、软件定时器

pdTRUE:循环调用

pdFALSE:只执行一次

获取timer的名称:

获取timer的id:

重启timer:

改变定时器的运行周期:

12、二进制信号量

控制任务优先级

获取信号量

13、技术型信号量

14、互斥量(和二进制信号量相似)

优先级别

15、递归互斥量

获取递归锁句柄

获取递归信号量

释放信号量

每次使用资源的时候上锁

16、事件组-EVENT-GROUP-WAIT

创建事件组

查看是否被设置,设置后进行下一步操作

设置位数据

17、事件组的同步-EVENT-GROUP-SYN

三个task同时到达后,一起运行

18、任务的通知

19、通知传递数据

20、流数据缓冲区

传输流数据-视频数据

创建、发送和接收 重要

21、确定stream buffer的大小

22、message buffer(和stream差不多)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值