使用函数指针数组优化switch语句
使用函数指针数组优化switch语句
如果你想优化 switch 语句,可以考虑使用函数指针数组来实现。
以下是使用函数指针数组优化 switch 语句的代码示例:
#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 (*LedControlFunction)(int blinkStatus);
// 定义指示灯控制函数数组
LedControlFunction ledControlFunctions[LED_TYPE_COUNT] = {
ledType1Control,
ledType2Control,
// 添加更多指示灯类型的控制函数...
};
// 定义指示灯控制任务
void ledControlTask(void* pvParameters) {
LedStatus ledStatus;
while (1) {
// 从队列中接收指示灯状态
if (xQueueReceive(ledQueue, &ledStatus, portMAX_DELAY) == pdTRUE) {
// 根据接收到的指示灯状态进行控制
if (ledStatus.type < LED_TYPE_COUNT) {
// 调用对应的指示灯控制函数
LedControlFunction controlFunction = ledControlFunctions[ledStatus.type];
controlFunction(ledStatus.blinkStatus);
}
}
}
}
// 初始化指示灯控制任务
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;
}
在这个示例中,我们使用了一个函数指针数组 ledControlFunctions 来存储相应指示灯类型的控制函数。在 ledControlTask 中,我们根据接收到的指示灯类型直接通过函数指针数组调用相应类型的控制函数,避免了 switch 语句的使用。
你可以根据实际情况,将每个指示灯类型的控制函数添加到 ledControlFunctions 数组中,并在相应的控制函数中添加适当的控制代码。这样,你就可以通过函数指针数组实现更高效和可扩展的指示灯控制逻辑。
原文地址: https://www.cveoy.top/t/topic/8xy 著作权归作者所有。请勿转载和采集!