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、流数据缓冲区
传输流数据-视频数据