ESP32-S开发 之 FreeRTOS Task

本文基于ESP32-S开发 之 PlatformIO

本文的主线 简介 => 创建/阻塞 => 挂起/恢复 => 问题

简介

Each task executes within its own context with no coincidental dependency on other tasks within the system or the RTOS scheduler itself. Only one task within the application can be executing at any point in time and the real time RTOS scheduler is responsible for deciding which task this should be

Valid task state transitions

创建/阻塞

1
vim src/main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <Arduino.h>

void vTask1(void *pvParameters);
void vTask2(void *pvParameters);

void setup() {
xTaskCreate(&vTask1, "Task 1", 1024, NULL, 1, NULL);
xTaskCreate(&vTask2, "Task 2", 1024, NULL, 1, NULL);
}

void loop() {
// implicit invocation of vTaskStartScheduler
}

void vTask1(void *pvParameters) {
for (;;) {
printf("Task 1\r\n");
vTaskDelay(pdMS_TO_TICKS(1000));
}
}

void vTask2(void *pvParameters) {
for (;;) {
printf("Task 2\r\n");
vTaskDelay(pdMS_TO_TICKS(1000));
}
}

esp32-s-freertos-task-01.png

挂起/恢复

1
vim main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <Arduino.h>

xTaskHandle xTask1Handle;
xTaskHandle xTask2Handle;

void vTask1(void *pvParameters);
void vTask2(void *pvParameters);

void setup() {
xTaskCreate(&vTask1, "Task 1", 2048, NULL, 1, &xTask1Handle);
xTaskCreate(&vTask2, "Task 2", 2048, NULL, 1, &xTask2Handle);
}

void loop() {
// implicit invocation of vTaskStartScheduler
}

void vTask1(void *pvParameters) {
portBASE_TYPE i = 0;

for (;;) {
printf("Task 1 i=%d\r\n", ++i);

if (i >= 2) {
vTaskSuspend(xTask1Handle);
}

vTaskDelay(pdMS_TO_TICKS(1000));
}
}

void vTask2(void *pvParameters) {
portBASE_TYPE i = 0;

for (;;) {
printf("Task 2 i=%d\r\n", ++i);

if (i >= 4) {
vTaskResume(xTask1Handle);
}

vTaskDelay(pdMS_TO_TICKS(1000));
}
}

esp32-s-freertos-task-02.png

问题

Suspend Task vs Block Task

参考