/main/main.c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_log.h"
// Тег для виведення логів (зручно для фільтрації в моніторі)
static const char *TAG = "MAIN_APP";
// Глобальний дескриптор черги
static QueueHandle_t my_queue = NULL;
// Задача, яка надсилає дані в чергу
void sender_task(void *pvParameters) {
int counter = 0;
while (1) {
counter++;
// Спроба надіслати дані. Чекаємо максимум portMAX_DELAY, якщо черга повна
if (xQueueSend(my_queue, &counter, 0) == pdPASS) {
ESP_LOGI(TAG, "Надіслано в чергу: %d", counter);
} else {
ESP_LOGE(TAG, "Помилка надсилання в чергу!");
}
// Затримка задачі на 500 мілісекунд
vTaskDelay(pdMS_TO_TICKS(500));
}
}
// Задача, яка приймає дані з черги
void receiver_task(void *pvParameters) {
int received_value = 0;
while (1) {
// Очікуємо на дані. Задача блокується і не споживає ресурси CPU, поки черга порожня
if (xQueueReceive(my_queue, &received_value, 5000) == pdPASS) {
ESP_LOGW(TAG, "---> Отримано з черги: %d", received_value);
}
// Затримка задачі на 500 мілісекунд
//vTaskDelay(pdMS_TO_TICKS(2000));
}
}
// Головна функція програми ESP-IDF
void app_main(void) {
ESP_LOGI(TAG, "Запуск програми...");
// 1. Створюємо чергу: ємність 5 елементів, розмір кожного — як у типу int
my_queue = xQueueCreate(1, sizeof(int));
// 2. Обов'язково перевіряємо, чи успішно виділено пам'ять під чергу
if (my_queue != NULL) {
ESP_LOGI(TAG, "Чергу успішно створено!");
// 3. Створюємо задачу-відправник
xTaskCreatePinnedToCore(
sender_task, // Функція задачі
"sender_task", // Текстова назва (для відладки)
2048, // Розмір стеку в байтах
NULL, // Параметри, що передаються в задачу
5, // Пріоритет задачі
NULL, // Дескриптор задачі (якщо не потрібен — NULL)
0 // Прив'язка до ядра CPU 0
);
// 4. Створюємо задачу-отримувач
xTaskCreatePinnedToCore(
receiver_task,
"receiver_task",
2048,
NULL,
10,
NULL,
1 // Прив'язка до ядра CPU 1 (паралельне виконання!)
);
} else {
ESP_LOGE(TAG, "Критична помилка: Недостатньо пам'яті для створення черги!");
}
}
/main/CMakeLists.txt
idf_component_register(
SRCS "main.c"
INCLUDE_DIRS "."
PRIV_REQUIRES driver esp_timer esp_driver_gpio esp_driver_spi esp_driver_i2c
)
CMakeLists.txt
# The following five lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.22)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
# "Trim" the build. Include the minimal set of components, main, and anything it depends on.
idf_build_set_property(MINIMAL_BUILD ON)
project(softAP)