#include "main.h"
#include "cmsis_os.h"
TaskHandle_t Task1Handle;
TaskHandle_t Task2Handle;
TaskHandle_t Task3Handle;
TaskHandle_t TaskTimerHandle;
TaskHandle_t TaskMutex1Handle;
TaskHandle_t TaskMutex2Handle;
SemaphoreHandle_t xMutex;
// ********************** TASK 1 **************************
void Task1(void *pvParameters) {
while (1) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // Upali LED na A1
osDelay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // Ugasi LED na A1
vTaskSuspend(NULL); // Suspenduje samog sebe
vTaskResume(Task2Handle); // Aktivira Task2
}
}
// ********************** TASK 2 **************************
void Task2(void *pvParameters) {
while (1) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
osDelay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
vTaskSuspend(NULL);
vTaskResume(Task3Handle);
}
}
// ********************** TASK 3 **************************
void Task3(void *pvParameters) {
while (1) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
osDelay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
vTaskSuspend(NULL);
vTaskResume(Task1Handle);
}
}
// ********************** TIMER INTERRUPT CALLBACK **************************
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM2) { // Ako je TIM2 aktivirao prekid
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
vTaskResumeFromISR(TaskTimerHandle);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
// ********************** TASK TIMER **************************
void TaskTimer(void *pvParameters) {
while (1) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
osDelay(3000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
osDelay(3000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
vTaskSuspend(NULL);
}
}
// ********************** TASK MUTEX 1 **************************
void TaskMutex1(void *pvParameters) {
while (1) {
if (xSemaphoreTake(xMutex, portMAX_DELAY)) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
osDelay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
xSemaphoreGive(xMutex);
}
osDelay(500);
}
}
// ********************** TASK MUTEX 2 **************************
void TaskMutex2(void *pvParameters) {
while (1) {
if (xSemaphoreTake(xMutex, portMAX_DELAY)) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
osDelay(200);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
xSemaphoreGive(xMutex);
}
osDelay(200);
}
}
// ********************** SETUP **************************
void MX_FREERTOS_Init(void) {
xMutex = xSemaphoreCreateMutex();
xTaskCreate(Task1, "Task1", 128, NULL, 3, &Task1Handle);
xTaskCreate(Task2, "Task2", 128, NULL, 1, &Task2Handle);
xTaskCreate(Task3, "Task3", 128, NULL, 2, &Task3Handle);
xTaskCreate(TaskTimer, "TaskTimer", 128, NULL, 2, &TaskTimerHandle);
xTaskCreate(TaskMutex1, "TaskMutex1", 128, NULL, 2, &TaskMutex1Handle);
xTaskCreate(TaskMutex2, "TaskMutex2", 128, NULL, 2, &TaskMutex2Handle);
vTaskSuspend(Task2Handle);
vTaskSuspend(Task3Handle);
vTaskSuspend(TaskTimerHandle);
HAL_TIM_Base_Start_IT(&htim2);
}