#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/semphr.h>
int sum = 0;
int count = 0;
int taskCount = 0;
SemaphoreHandle_t xMutex;
// Task generate untuk membuat nilai genap dan update sum dan count
void vTaskGenerate(void *pvParameters) {
int number = *(int *)pvParameters; // Membuat bilangan genap
Serial.print("Core: ");
Serial.print(xPortGetCoreID());
Serial.print(" | Task: ");
Serial.print(pcTaskGetTaskName(NULL));
Serial.print("-");
Serial.print(taskCount);
Serial.print(" |Count: ");
Serial.print(count);
Serial.print(" | Sum: ");
Serial.print(sum);
Serial.print(" | Generated number: ");
Serial.println(number);
// Mutex untuk mengakses shared variable
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) {
sum += number;
count++;
xSemaphoreGive(xMutex); // Melepas mutex setelah update shared variable
}
vTaskDelete(NULL); // Menghapus Task setelah selesai
}
// Task user input untuk mengatur input serial
void vTaskUserInput(void *pvParameters) {
while (1) {
if (Serial.available()) {
// Menunggu input dari serial
Serial.println("\nEnter how many even numbers to generate:");
int numEven = Serial.parseInt(); // Mengambil input dari user
if (numEven > 0) {
Serial.print("Generating ");
Serial.print(numEven);
Serial.println(" even numbers starting from 2...");
taskCount = 0;
// Membuat tasks to untuk membuat angka genap dari dua
for (int i = 0; i < numEven; i++) {
int evenNumber = 2 + i * 2;
xTaskCreatePinnedToCore(vTaskGenerate, "GenerateTask", 1024, (void *)&evenNumber, 2, NULL, 0);
taskCount++;
// digitalWrite(LED_BUILTIN, HIGH); // ini sbnernya biar keliatan aja tdi
// vTaskDelay(100 / portTICK_PERIOD_MS);
// digitalWrite(LED_BUILTIN, LOW);
vTaskDelay(100 / portTICK_PERIOD_MS); // Delay untuk menghindari race pada pembuatan task
}
// Menunggu untuk semua task selesai
vTaskDelay(1000 / portTICK_PERIOD_MS);
// Print serial
Serial.print("Total tasks created: ");
Serial.println(taskCount);
Serial.print("Core used for task creation: ");
Serial.println(xPortGetCoreID());
Serial.print("Total even numbers generated: ");
Serial.println(count);
Serial.print("Sum of even numbers: ");
Serial.println(sum);
// Reset untuk input selanjutnya
sum = 0;
count = 0;
}
}
vTaskDelay(1000 / portTICK_PERIOD_MS); // Delay untuk serial input
}
}
void setup() {
// Memulai serial dengan baudrate segitu
Serial.begin(115200);
delay(1000); // Delay untuk inisialisasi serial
// Pembuatan mutex
xMutex = xSemaphoreCreateMutex();
if (xMutex != NULL) {
// Membuat task user input
xTaskCreatePinnedToCore(vTaskUserInput, "UserInputTask", 1024, NULL, 1, NULL, 0);
}else{
Serial.println("Failed to create mutex");
}
}
void loop() {}