Switch 使用回调函数控制LED灯 - FreeRTOS实例
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;
}
代码解析
- 定义枚举类型
LedType: 用于标识不同的LED灯类型,方便代码维护和扩展。 - 定义结构体
LedStatus: 用于存储LED灯的状态信息,包括灯的类型和闪烁状态。 - 定义回调函数类型
LedControlCallback: 规定了控制LED灯的回调函数的函数签名。 - 实现
ledControlTask: 该任务从队列中接收LedStatus结构体,并根据LedType调用相应的回调函数来控制LED灯。 - 实现回调函数: 根据实际硬件电路,编写
ledType1Control和ledType2Control等回调函数来控制不同类型的LED灯。
优势
- 代码简洁易懂: 使用Switch语句和回调函数可以使代码结构更清晰,逻辑更易懂。
- 易于扩展: 新增LED灯类型时,只需要添加对应的枚举值和回调函数即可,无需修改核心控制逻辑。
- 提高可维护性: 将不同类型LED灯的控制逻辑封装在独立的回调函数中,方便代码维护和修改。
总结
本文介绍了如何使用Switch语句和回调函数实现灵活的LED灯控制方案,并提供了一个基于FreeRTOS的完整代码示例。该方案具有代码简洁、易于扩展和维护等优点,适用于各种需要控制LED灯的嵌入式系统应用。
原文地址: https://www.cveoy.top/t/topic/8wR 著作权归作者所有。请勿转载和采集!