/**************************************************************************** * Copyright (C) 2020 by Fabrice Muller * * * * This file is useful for ESP32 Design course. * * * ****************************************************************************/ /** * @file lab3-1_main.c * @author Fabrice Muller * @date 20 Oct. 2020 * @brief File containing the lab3-1 of Part 3. * * @see https://github.com/fmuller-pns/esp32-vscode-project-template */ #include #include #include #include #include #include "esp_log.h" /* FreeRTOS.org includes. */ #include "freertos/FreeRTOSConfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" #include "my_helper_fct.h" static const char* TAG = "SEM"; /* Application constants */ #define STACK_SIZE 4096 #define TABLE_SIZE 400 /* Task Priority */ const uint32_t TIMER_TASK_PRIORITY = 5; const uint32_t INC_TABLE_TASK_PRIORITY = 4; const uint32_t DEC_TABLE_TASK_PRIORITY = 4; /* Communications */ SemaphoreHandle_t xSemClk; /* Tasks */ void vTaskTimer(void *pvParameters); void vTaskIncTable(void *pvParameters); void vTaskDecTable(void *pvParameters); /* Datas */ int Table[TABLE_SIZE]; /* Main function */ void app_main(void) { /* Init Table */ memset(Table, 0, TABLE_SIZE*sizeof(int)); /* Create semaphore */ xSemClk = xSemaphoreCreateBinary(); if (xSemClk == NULL) { ESP_LOGE(TAG, "Error xSemClk cannot be created"); vTaskDelete(NULL); } /* Stop scheduler */ vTaskSuspendAll(); /* Create Tasks */ xTaskCreatePinnedToCore(vTaskTimer,"Timer", STACK_SIZE, NULL, TIMER_TASK_PRIORITY, NULL,CORE_0) ; /* Continue scheduler */ xTaskResumeAll(); /* to ensure its exit is clean */ vTaskDelete(NULL); } /*-----------------------------------------------------------*/ void vTaskTimer(void *pvParameters) { TickType_t xLastWakeTime =xTaskGetTickCount(); for(;;){ vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(250UL)); COMPUTE_IN_TIME_MS(20); DISPLAY("Task Timer : give sem Clk"); xSemaphoreGive(xSemClk); } } void vTaskIncTable(void *pvParameters) { int index; int NbActivations = 0; uint32_t constNumber = ((uint32_t *)pvParameters); for(;;){ //Wait on clk xSemaphoreTake(xSemClk, portMAX_DELAY); DISPLAY ("TASK IncTable is running"); if (NbActivations ==0) { DISPLAY ("TASK IncTable is starting computation"); for (index = 0 ; index < TABLE_SIZE; index++) Table[index] = Table[index] + constNumber; COMPUTE_IN_TIME_MS(50); NbActivations = 4; } else { NbActivations = NbActivations - 1; } } } void vTaskDecTable(void *pvParameters) { int index; for(;;){ for (index = 0 ; index < TABLE_SIZE; index++) Table[index] = Table[index] + 1; COMPUTE_IN_TIME_MS(50); } }