mothercup/mcm-ddc-04/app/app_tasks.c
2026-09-01 20:06:25 +08:00

93 lines
2.1 KiB
C

/**
* @file app_tasks.c
* @brief FreeRTOS tasks: two LED blink tasks + one printf task,
* inter-task communication via a message queue.
*/
#include "app_tasks.h"
#include "bsp_led.h"
#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#define LED1_PERIOD_MS 500
#define LED2_PERIOD_MS 1000
#define LOG_QUEUE_LENGTH 10
#define LED_TASK_STACK 128 /* in words */
#define PRINT_TASK_STACK 256 /* printf needs more stack */
#define LED_TASK_PRIO 2
#define PRINT_TASK_PRIO 3
static QueueHandle_t s_logQueue = NULL;
/**
* @brief Toggle LED1(PB0) every 500 ms, post a log message each time.
*/
static void LedTask(void* argument)
{
LogMsg_t msg = {1, 0};
(void)argument;
for (;;)
{
bsp_led_toggle(LED1_PORT, LED1_PIN);
msg.led_id = 1;
msg.count++;
xQueueSend(s_logQueue, &msg, 0);
vTaskDelay(pdMS_TO_TICKS(LED1_PERIOD_MS));
}
}
/**
* @brief Toggle LED2(PA6) every 1000 ms, post a log message each time.
*/
static void LedTask2(void* argument)
{
LogMsg_t msg = {2, 0};
(void)argument;
for (;;)
{
bsp_led_toggle(LED2_PORT, LED2_PIN);
msg.led_id = 2;
msg.count++;
xQueueSend(s_logQueue, &msg, 0);
vTaskDelay(pdMS_TO_TICKS(LED2_PERIOD_MS));
}
}
/**
* @brief Block on the log queue and printf every received message.
*/
static void PrintTask(void* argument)
{
LogMsg_t msg;
(void)argument;
for (;;)
{
if (xQueueReceive(s_logQueue, &msg, portMAX_DELAY) == pdPASS)
{
printf("LED%u toggled, count = %lu\n", (unsigned int)msg.led_id, (unsigned long)msg.count);
}
}
}
/**
* @brief Create the log queue and all application tasks.
*/
void AppTasks_CreateAll(void)
{
s_logQueue = xQueueCreate(LOG_QUEUE_LENGTH, sizeof(LogMsg_t));
xTaskCreate(LedTask, "LED1", LED_TASK_STACK, NULL, LED_TASK_PRIO, NULL);
xTaskCreate(LedTask2, "LED2", LED_TASK_STACK, NULL, LED_TASK_PRIO, NULL);
xTaskCreate(PrintTask, "PRINT", PRINT_TASK_STACK, NULL, PRINT_TASK_PRIO, NULL);
}