#include <driver/gpio.h>
#include <esp_log.h>
#include <esp_system.h>
#include <freertos/FreeRTOS.h>
#include <freertos/queue.h>
#include <freertos/task.h>
#define LED_PIN GPIO_NUM_21
QueueHandle_t buffer; // Objeto da queue
void task1(void *pvParams)
{
uint32_t snd = 0;
while (1) {
// Se menor ou igual a 10
if (++snd <= 10) {
// Envia a variavel para queue
xQueueSend(buffer, &snd, pdMS_TO_TICKS(0));
} else {
// Se nao, espera 5 segundos para testar o timeout da outra tarefa
vTaskDelay(pdMS_TO_TICKS(4500));
snd = 0;
}
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void task2(void *pvParams)
{
uint32_t rcv = 0;
while (1) {
// Se recebeu o valor dentro de 1seg (timeout), mostrara na tela
if (xQueueReceive(buffer, &rcv, pdMS_TO_TICKS(1000)) == true) {
ESP_LOGE("Queue", "Item recebido: %u", rcv); // Mostra o valor recebido na tela
} else {
ESP_LOGE("Queue", "Item não recebido, timeout expirou!"); // Se o timeout expirou, mostra erro
}
}
}
void task3(void *pvParams)
{
gpio_pad_select_gpio(LED_PIN);
gpio_set_direction (LED_PIN, GPIO_MODE_OUTPUT);
while (1) {
gpio_set_level(LED_PIN, 0);
vTaskDelay(500 / portTICK_RATE_MS);
gpio_set_level(LED_PIN, 1);
vTaskDelay(500 / portTICK_RATE_MS);
}
}
void app_main()
{
TaskHandle_t xHandle = NULL;
buffer = xQueueCreate(10, sizeof(uint32_t)); // Cria a queue *buffer* com 10 slots de 4 Bytes
xTaskCreate(task1, "task1", 2048, NULL, 3, xHandle); // Cria tarefa que escreve valores na queue
xTaskCreate(task2, "task2", 2048, NULL, 2, xHandle); // Cria tarefa que le valores da queue
xTaskCreate(task3, "task3", 2048, NULL, 1, xHandle); // Cria tarefa para piscar o led
}
Loading
franzininho-wifi
franzininho-wifi