Switch 使用回调函数控制LED灯 - FreeRTOS实例

本文将介绍如何使用Switch语句和回调函数实现灵活的LED灯控制,并在FreeRTOS系统上提供一个完整的代码示例。

代码示例

#include 'FreeRTOS.h'
#include 'task.h'
#include 'queue.h'

#define LED_TASK_PRIORITY     (configMAX_PRIORITIES - 1)
#define LED_TASK_STACK_SIZE   configMINIMAL_STACK_SIZE

// 定义指示灯类型的枚举
typedef enum {
    LED_TYPE_1,
    LED_TYPE_2,
    // 添加更多指示灯类型...
    LED_TYPE_COUNT
} LedType;

// 定义指示灯状态结构体
typedef struct {
    LedType type;
    int blinkStatus; // 0表示常灭,1表示常亮,2表示闪烁
} LedStatus;

// 定义指示灯控制回调函数类型
typedef void (*LedControlCallback)(int blinkStatus);

// 定义指示灯控制任务
void ledControlTask(void* pvParameters) {
    LedStatus ledStatus;

    while (1) {
        // 从队列中接收指示灯状态
        if (xQueueReceive(ledQueue, &ledStatus, portMAX_DELAY) == pdTRUE) {
            // 根据接收到的指示灯状态进行控制
            switch (ledStatus.type) {
                case LED_TYPE_1:
                    // 控制第一种类型的指示灯
                    ledType1Control(ledStatus.blinkStatus);
                    break;
                case LED_TYPE_2:
                    // 控制第二种类型的指示灯
                    ledType2Control(ledStatus.blinkStatus);
                    break;
                // 添加更多指示灯类型的控制...
            }
        }
    }
}

// 初始化指示灯控制任务
void ledControlTaskInit() {
    xTaskCreate(ledControlTask, 'LedControl', LED_TASK_STACK_SIZE, NULL, LED_TASK_PRIORITY, NULL);
}

// STM32 上发送指示灯状态的函数
void sendLedStatus(LedType type, int blinkStatus) {
    LedStatus ledStatus;
    ledStatus.type = type;
    ledStatus.blinkStatus = blinkStatus;
    xQueueSend(ledQueue, &ledStatus, 0);
}

// 回调函数实现指示灯1的控制
void ledType1Control(int blinkStatus) {
    // 执行指示灯1的控制逻辑
}

// 回调函数实现指示灯2的控制
void ledType2Control(int blinkStatus) {
    // 执行指示灯2的控制逻辑
}

// 在启动代码中调用此函数来初始化指示灯队列和任务
int main(void) {
    // 初始化其他硬件和 FreeRTOS...

    // 创建指示灯队列
    ledQueue = xQueueCreate(10, sizeof(LedStatus));

    // 初始化指示灯控制任务
    ledControlTaskInit();

    // 启动 FreeRTOS 调度器
    vTaskStartScheduler();

    // 此处不会执行,因为 FreeRTOS 的调度器已经在上一行启动
    while (1) {}

    return 0;
}

代码解析

  1. 定义枚举类型 LedType: 用于标识不同的LED灯类型,方便代码维护和扩展。
  2. 定义结构体 LedStatus: 用于存储LED灯的状态信息,包括灯的类型和闪烁状态。
  3. 定义回调函数类型 LedControlCallback: 规定了控制LED灯的回调函数的函数签名。
  4. 实现 ledControlTask: 该任务从队列中接收 LedStatus 结构体,并根据 LedType 调用相应的回调函数来控制LED灯。
  5. 实现回调函数: 根据实际硬件电路,编写 ledType1ControlledType2Control 等回调函数来控制不同类型的LED灯。

优势

  • 代码简洁易懂: 使用Switch语句和回调函数可以使代码结构更清晰,逻辑更易懂。
  • 易于扩展: 新增LED灯类型时,只需要添加对应的枚举值和回调函数即可,无需修改核心控制逻辑。
  • 提高可维护性: 将不同类型LED灯的控制逻辑封装在独立的回调函数中,方便代码维护和修改。

总结

本文介绍了如何使用Switch语句和回调函数实现灵活的LED灯控制方案,并提供了一个基于FreeRTOS的完整代码示例。该方案具有代码简洁、易于扩展和维护等优点,适用于各种需要控制LED灯的嵌入式系统应用。

Switch 使用回调函数控制LED灯 - FreeRTOS实例

原文地址: https://www.cveoy.top/t/topic/8wR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录