返璞归真还是拥抱现代?——嵌入式研发中的“裸机开发”与RTOS全景解析

一、“裸机开发”到底是什么?

1.1 定义与本质

裸机开发(Bare Metal Programming)是嵌入式系统开发中最基础、最直接的方式,指在没有操作系统或任何运行时环境支持下,直接对硬件资源进行编程。在这种模式下,开发者需要从系统上电复位后的第一条指令开始,完全掌控整个系统的运行流程。

核心特征包括:

  • 无任务调度机制:没有操作系统内核负责进程/线程的调度和切换

  • 无动态内存管理:通常使用静态内存分配,或在简单情况下手动管理内存

  • 中断驱动与轮询结合:通过中断响应外部事件,通过主循环轮询处理常规任务

  • 直接硬件操作:通过读写寄存器直接控制外设,不经过抽象层

  • 完全手动资源管理:包括堆栈设置、中断向量表配置、时钟初始化等

1.2 裸机开发适用场景

  1. 超低功耗设备

    • 电池供电的物联网传感器节点

    • 可穿戴健康监测设备

    • 长期休眠仅定期唤醒的监控设备

  2. 硬实时性要求系统

    • 工业电机控制系统(需要微秒级响应)

    • 数字电源管理

    • 汽车电子控制单元(ECU)中的关键安全功能

  3. 成本敏感型产品

    • 消费电子中的小家电控制板

    • 大批量生产的简单控制器

    • Flash/RAM资源极其有限的MCU(如<16KB Flash,<2KB RAM)

  4. 功能单一的系统

    • LED照明控制器

    • 简单的温湿度显示器

    • 基础的数据采集模块

  5. 教学与原型验证

    • 嵌入式入门教学

    • 硬件功能验证

    • 最小系统搭建

1.3 裸机开发的技术架构

典型的裸机系统架构通常包含以下层次:

c

/* 裸机系统典型层次结构示例 */
// 1. 启动文件(启动代码)
//    - 设置堆栈指针
//    - 初始化.data段(已初始化全局变量)
//    - 清零.bss段(未初始化全局变量)
//    - 调用main函数

// 2. 硬件抽象层(HAL)或直接寄存器操作
//    - 时钟系统初始化
//    - GPIO配置
//    - 中断控制器配置
//    - 外设驱动(UART、SPI、I2C、ADC等)

// 3. 中间件(可选)
//    - 简单调度器
//    - 事件驱动框架
//    - 协议栈简化实现

// 4. 应用层
//    - 主循环(super loop)
//    - 中断服务程序(ISR)
//    - 状态机实现

二、裸机开发的典型例子与实践

2.1 LED流水灯进阶实现

让我们扩展简单的LED流水灯,添加更多功能和更好的代码结构:

c

/**
 * @file    led_controller.c
 * @brief   基于状态机的多功能LED控制器
 * @version 1.0
 * @date    2024-01-15
 */

#include "gd32f30x.h"
#include <stdint.h>
#include <stdbool.h>

/* LED模式定义 */
typedef enum {
    LED_MODE_OFF = 0,
    LED_MODE_ON,
    LED_MODE_BLINK_SLOW,    /* 慢闪: 1Hz */
    LED_MODE_BLINK_FAST,    /* 快闪: 4Hz */
    LED_MODE_BREATH,        /* 呼吸灯效果 */
    LED_MODE_WATER_FLOW,    /* 流水灯效果(多LED) */
    LED_MODE_PATTERN        /* 自定义模式 */
} LedMode_t;

/* LED控制器结构体 */
typedef struct {
    uint32_t gpio_port;
    uint16_t gpio_pin;
    LedMode_t mode;
    uint32_t period_ms;      /* 闪烁周期 */
    uint32_t duty_cycle;     /* 占空比 (0-100) */
    uint32_t last_toggle_time;
    bool current_state;
    uint8_t brightness;      /* 用于呼吸灯效果的亮度值 */
    bool brightness_increasing;
} LedController_t;

/* 系统时间戳(需由SysTick中断更新) */
volatile uint32_t system_tick_ms = 0;

/* LED控制器实例 */
static LedController_t leds[] = {
    {GPIOC, GPIO_PIN_13, LED_MODE_BLINK_SLOW, 1000, 50, 0, false, 0, true},
    {GPIOC, GPIO_PIN_14, LED_MODE_BLINK_FAST, 250, 50, 0, false, 0, true},
    {GPIOC, GPIO_PIN_15, LED_MODE_BREATH, 20, 50, 0, false, 0, true},
};

#define LED_COUNT (sizeof(leds) / sizeof(leds[0]))

/* 延时函数(基于SysTick) */
void delay_ms(uint32_t ms) {
    uint32_t start_tick = system_tick_ms;
    while ((system_tick_ms - start_tick) < ms) {
        /* 等待 */
    }
}

/* SysTick中断服务程序 */
void SysTick_Handler(void) {
    system_tick_ms++;
}

/* PWM模拟函数(用于呼吸灯效果) */
static void pwm_set_led(LedController_t *led, uint8_t brightness) {
    /* 简单PWM实现 - 实际中可能需要硬件PWM或更精确的定时器 */
    static uint8_t pwm_counter = 0;
    
    if (brightness > pwm_counter) {
        gpio_bit_set(led->gpio_port, led->gpio_pin);
    } else {
        gpio_bit_reset(led->gpio_port, led->gpio_pin);
    }
    
    pwm_counter++;
    if (pwm_counter >= 100) {
        pwm_counter = 0;
    }
}

/* LED初始化 */
void led_init(void) {
    /* 使能GPIOC时钟 */
    rcu_periph_clock_enable(RCU_GPIOC);
    
    /* 配置LED引脚为推挽输出 */
    gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, 
              GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
    
    /* 初始关闭所有LED */
    gpio_bit_reset(GPIOC, GPIO_PIN_13);
    gpio_bit_reset(GPIOC, GPIO_PIN_14);
    gpio_bit_reset(GPIOC, GPIO_PIN_15);
}

/* LED模式设置 */
void led_set_mode(uint8_t led_index, LedMode_t mode) {
    if (led_index >= LED_COUNT) return;
    
    leds[led_index].mode = mode;
    leds[led_index].last_toggle_time = system_tick_ms;
    
    switch (mode) {
        case LED_MODE_OFF:
            gpio_bit_reset(leds[led_index].gpio_port, 
                          leds[led_index].gpio_pin);
            break;
        case LED_MODE_ON:
            gpio_bit_set(leds[led_index].gpio_port, 
                        leds[led_index].gpio_pin);
            break;
        default:
            /* 其他模式在update函数中处理 */
            break;
    }
}

/* LED更新函数 - 在主循环中周期性调用 */
void led_update(void) {
    for (uint8_t i = 0; i < LED_COUNT; i++) {
        LedController_t *led = &leds[i];
        uint32_t current_time = system_tick_ms;
        uint32_t elapsed = current_time - led->last_toggle_time;
        
        switch (led->mode) {
            case LED_MODE_BLINK_SLOW:
            case LED_MODE_BLINK_FAST:
                if (elapsed >= led->period_ms) {
                    /* 切换LED状态 */
                    if (led->current_state) {
                        gpio_bit_reset(led->gpio_port, led->gpio_pin);
                    } else {
                        gpio_bit_set(led->gpio_port, led->gpio_pin);
                    }
                    led->current_state = !led->current_state;
                    led->last_toggle_time = current_time;
                }
                break;
                
            case LED_MODE_BREATH:
                /* 呼吸灯效果 */
                if (elapsed >= 20) { /* 每20ms更新一次 */
                    if (led->brightness_increasing) {
                        led->brightness++;
                        if (led->brightness >= 100) {
                            led->brightness = 100;
                            led->brightness_increasing = false;
                        }
                    } else {
                        led->brightness--;
                        if (led->brightness <= 0) {
                            led->brightness = 0;
                            led->brightness_increasing = true;
                        }
                    }
                    pwm_set_led(led, led->brightness);
                    led->last_toggle_time = current_time;
                }
                break;
                
            case LED_MODE_WATER_FLOW:
                /* 流水灯效果 - 依次点亮LED */
                if (elapsed >= 100) {
                    static uint8_t current_led = 0;
                    
                    /* 关闭所有LED */
                    for (uint8_t j = 0; j < LED_COUNT; j++) {
                        gpio_bit_reset(leds[j].gpio_port, leds[j].gpio_pin);
                    }
                    
                    /* 点亮当前LED */
                    gpio_bit_set(leds[current_led].gpio_port, 
                                leds[current_led].gpio_pin);
                    
                    current_led = (current_led + 1) % LED_COUNT;
                    led->last_toggle_time = current_time;
                }
                break;
                
            default:
                /* 其他模式不处理 */
                break;
        }
    }
}

/* 系统时钟初始化 */
void system_clock_init(void) {
    /* 配置系统时钟为108MHz(根据实际MCU调整) */
    rcu_deinit();
    
    /* 使能外部高速晶振 */
    rcu_osci_on(RCU_HXTAL);
    rcu_osci_stab_wait(RCU_HXTAL);
    
    /* 配置AHB、APB1、APB2分频 */
    rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1);
    rcu_apb1_clock_config(RCU_APB1_CKAHB_DIV2);
    rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);
    
    /* 配置PLL */
    rcu_pll_config(RCU_PLLSRC_HXTAL, 25, 432);
    rcu_osci_on(RCU_PLL_CK);
    rcu_osci_stab_wait(RCU_PLL_CK);
    
    /* 选择PLL作为系统时钟 */
    rcu_system_clock_source_config(RCU_CKSYSSRC_PLL);
    while (rcu_system_clock_source_get() != RCU_SCSS_PLL);
    
    /* 配置SysTick为1ms中断 */
    SysTick_Config(108000); /* 108MHz / 1000 = 108000 */
}

/* 主函数 */
int main(void) {
    /* 系统初始化 */
    system_clock_init();
    led_init();
    
    /* 设置不同LED的初始模式 */
    led_set_mode(0, LED_MODE_BLINK_SLOW);
    led_set_mode(1, LED_MODE_BLINK_FAST);
    led_set_mode(2, LED_MODE_BREATH);
    
    /* 主循环 */
    while (1) {
        /* 更新LED状态 */
        led_update();
        
        /* 其他任务可以在这里添加 */
        // process_buttons();
        // read_sensors();
        // update_display();
        
        /* 简单延时或进入低功耗模式 */
        // delay_ms(1); /* 或者使用__WFI()进入睡眠 */
    }
    
    return 0;
}

2.2 按键检测与蜂鸣器报警系统

下面是一个完整的按键检测与蜂鸣器报警系统,包含消抖、长短按识别和多种报警模式:

c

/**
 * @file    button_buzzer_system.c
 * @brief   按键检测与蜂鸣器报警系统
 * @version 2.0
 * @date    2024-01-15
 */

#include "gd32f30x.h"
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

/* 按键状态定义 */
typedef enum {
    BUTTON_STATE_IDLE = 0,
    BUTTON_STATE_PRESSED,
    BUTTON_STATE_RELEASED,
    BUTTON_STATE_LONG_PRESS,
    BUTTON_STATE_DOUBLE_CLICK
} ButtonState_t;

/* 按键事件定义 */
typedef enum {
    BUTTON_EVENT_NONE = 0,
    BUTTON_EVENT_PRESS,
    BUTTON_EVENT_RELEASE,
    BUTTON_EVENT_SHORT_PRESS,    /* 短按 (<500ms) */
    BUTTON_EVENT_LONG_PRESS,     /* 长按 (>=500ms) */
    BUTTON_EVENT_DOUBLE_CLICK    /* 双击 */
} ButtonEvent_t;

/* 报警模式定义 */
typedef enum {
    ALARM_MODE_OFF = 0,
    ALARM_MODE_CONTINUOUS,      /* 持续报警 */
    ALARM_MODE_INTERMITTENT,    /* 间歇报警 */
    ALARM_MODE_BEEP_ONCE,       /* 单次鸣叫 */
    ALARM_MODE_SOS              /* SOS摩尔斯码 */
} AlarmMode_t;

/* 按键配置结构体 */
typedef struct {
    uint32_t gpio_port;
    uint16_t gpio_pin;
    bool active_low;           /* true: 低电平有效; false: 高电平有效 */
    
    ButtonState_t state;
    ButtonEvent_t event;
    
    uint32_t press_time;
    uint32_t release_time;
    uint32_t last_press_time;
    
    uint8_t press_count;
    uint32_t last_event_time;
    
    bool need_debounce;
    uint32_t debounce_start_time;
} Button_t;

/* 蜂鸣器配置结构体 */
typedef struct {
    uint32_t gpio_port;
    uint16_t gpio_pin;
    bool active_high;          /* true: 高电平驱动; false: 低电平驱动 */
    
    AlarmMode_t mode;
    uint32_t period_ms;
    uint32_t duty_cycle;       /* 占空比 (0-100) */
    
    bool enabled;
    uint32_t start_time;
    uint32_t beep_count;
    uint32_t total_beeps;
} Buzzer_t;

/* 系统时间戳 */
volatile uint32_t system_tick_ms = 0;

/* 按键实例 */
static Button_t buttons[] = {
    {
        .gpio_port = GPIOA,
        .gpio_pin = GPIO_PIN_0,
        .active_low = true,
        .state = BUTTON_STATE_IDLE,
        .event = BUTTON_EVENT_NONE,
        .press_time = 0,
        .release_time = 0,
        .last_press_time = 0,
        .press_count = 0,
        .last_event_time = 0,
        .need_debounce = false,
        .debounce_start_time = 0
    },
    /* 可以添加更多按键 */
};

/* 蜂鸣器实例 */
static Buzzer_t buzzer = {
    .gpio_port = GPIOB,
    .gpio_pin = GPIO_PIN_0,
    .active_high = true,
    .mode = ALARM_MODE_OFF,
    .period_ms = 100,
    .duty_cycle = 50,
    .enabled = false,
    .start_time = 0,
    .beep_count = 0,
    .total_beeps = 0
};

/* 系统状态 */
typedef struct {
    bool alarm_triggered;
    uint32_t alarm_start_time;
    uint8_t alarm_severity;    /* 0-10, 0=无报警,10=严重报警 */
    char alarm_message[32];
} SystemState_t;

static SystemState_t system_state = {
    .alarm_triggered = false,
    .alarm_start_time = 0,
    .alarm_severity = 0,
    .alarm_message = {0}
};

#define BUTTON_COUNT (sizeof(buttons) / sizeof(buttons[0]))
#define DEBOUNCE_TIME_MS 20
#define LONG_PRESS_TIME_MS 500
#define DOUBLE_CLICK_INTERVAL_MS 300

/* SysTick中断服务程序 */
void SysTick_Handler(void) {
    system_tick_ms++;
}

/* 读取按键物理状态 */
static bool button_read_physical(uint8_t index) {
    if (index >= BUTTON_COUNT) return false;
    
    Button_t *btn = &buttons[index];
    bool pin_state = gpio_input_bit_get(btn->gpio_port, btn->gpio_pin);
    
    /* 根据active_low转换逻辑状态 */
    if (btn->active_low) {
        return (pin_state == RESET);  /* 低电平表示按下 */
    } else {
        return (pin_state == SET);    /* 高电平表示按下 */
    }
}

/* 按键初始化 */
void button_init(void) {
    rcu_periph_clock_enable(RCU_GPIOA);
    
    /* 配置按键引脚为上拉输入 */
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
}

/* 按键状态机更新 */
void button_update(uint8_t index) {
    if (index >= BUTTON_COUNT) return;
    
    Button_t *btn = &buttons[index];
    bool current_pressed = button_read_physical(index);
    uint32_t current_time = system_tick_ms;
    
    switch (btn->state) {
        case BUTTON_STATE_IDLE:
            if (current_pressed) {
                /* 检测到按下,开始消抖 */
                btn->state = BUTTON_STATE_PRESSED;
                btn->debounce_start_time = current_time;
                btn->need_debounce = true;
            }
            break;
            
        case BUTTON_STATE_PRESSED:
            if (btn->need_debounce) {
                /* 消抖等待 */
                if ((current_time - btn->debounce_start_time) >= DEBOUNCE_TIME_MS) {
                    btn->need_debounce = false;
                    btn->press_time = current_time;
                    
                    /* 检查是否为双击 */
                    if ((current_time - btn->last_press_time) < DOUBLE_CLICK_INTERVAL_MS) {
                        btn->press_count++;
                        if (btn->press_count >= 2) {
                            btn->event = BUTTON_EVENT_DOUBLE_CLICK;
                            btn->press_count = 0;
                        }
                    } else {
                        btn->press_count = 1;
                    }
                    btn->last_press_time = current_time;
                }
            } else {
                /* 消抖完成,检测是否长按 */
                if (!current_pressed) {
                    /* 按键释放 */
                    btn->state = BUTTON_STATE_RELEASED;
                    btn->release_time = current_time;
                } else if ((current_time - btn->press_time) >= LONG_PRESS_TIME_MS) {
                    /* 长按检测 */
                    btn->event = BUTTON_EVENT_LONG_PRESS;
                    btn->state = BUTTON_STATE_IDLE;
                    btn->press_count = 0;
                }
            }
            break;
            
        case BUTTON_STATE_RELEASED:
            /* 处理释放事件 */
            if ((current_time - btn->press_time) < LONG_PRESS_TIME_MS) {
                /* 短按 */
                if (btn->press_count == 1) {
                    btn->event = BUTTON_EVENT_SHORT_PRESS;
                }
            }
            btn->state = BUTTON_STATE_IDLE;
            break;
            
        default:
            btn->state = BUTTON_STATE_IDLE;
            break;
    }
}

/* 获取按键事件 */
ButtonEvent_t button_get_event(uint8_t index) {
    if (index >= BUTTON_COUNT) return BUTTON_EVENT_NONE;
    
    Button_t *btn = &buttons[index];
    ButtonEvent_t event = btn->event;
    btn->event = BUTTON_EVENT_NONE;  /* 清除事件 */
    
    return event;
}

/* 蜂鸣器初始化 */
void buzzer_init(void) {
    rcu_periph_clock_enable(RCU_GPIOB);
    
    /* 配置蜂鸣器引脚为推挽输出 */
    gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
    
    /* 初始关闭蜂鸣器 */
    buzzer_set_state(false);
}

/* 设置蜂鸣器开关状态 */
void buzzer_set_state(bool on) {
    if (on) {
        if (buzzer.active_high) {
            gpio_bit_set(buzzer.gpio_port, buzzer.gpio_pin);
        } else {
            gpio_bit_reset(buzzer.gpio_port, buzzer.gpio_pin);
        }
    } else {
        if (buzzer.active_high) {
            gpio_bit_reset(buzzer.gpio_port, buzzer.gpio_pin);
        } else {
            gpio_bit_set(buzzer.gpio_port, buzzer.gpio_pin);
        }
    }
    buzzer.enabled = on;
}

/* 设置报警模式 */
void alarm_set_mode(AlarmMode_t mode) {
    buzzer.mode = mode;
    buzzer.start_time = system_tick_ms;
    buzzer.beep_count = 0;
    
    switch (mode) {
        case ALARM_MODE_SOS:
            buzzer.total_beeps = 0;  /* SOS模式下动态控制 */
            break;
        case ALARM_MODE_BEEP_ONCE:
            buzzer.total_beeps = 1;
            break;
        default:
            buzzer.total_beeps = 0;  /* 持续报警 */
            break;
    }
}

/* 蜂鸣器报警状态机 */
void buzzer_update(void) {
    if (buzzer.mode == ALARM_MODE_OFF) {
        buzzer_set_state(false);
        return;
    }
    
    uint32_t current_time = system_tick_ms;
    uint32_t elapsed = current_time - buzzer.start_time;
    
    switch (buzzer.mode) {
        case ALARM_MODE_CONTINUOUS:
            /* 持续鸣叫 */
            buzzer_set_state(true);
            break;
            
        case ALARM_MODE_INTERMITTENT:
            /* 间歇鸣叫:响0.5秒,停0.5秒 */
            if ((elapsed / 500) % 2 == 0) {
                buzzer_set_state(true);
            } else {
                buzzer_set_state(false);
            }
            break;
            
        case ALARM_MODE_BEEP_ONCE:
            /* 单次鸣叫:响0.2秒 */
            if (buzzer.beep_count == 0) {
                if (elapsed < 200) {
                    buzzer_set_state(true);
                } else {
                    buzzer_set_state(false);
                    buzzer.beep_count = 1;
                    buzzer.mode = ALARM_MODE_OFF;
                }
            }
            break;
            
        case ALARM_MODE_SOS:
            /* SOS摩尔斯码:... --- ... */
            {
                static const uint8_t sos_pattern[] = {
                    1, 1, 1,    /* S: 三短 */
                    0, 0, 0,    /* 间隔 */
                    0, 0, 0,    /* O: 三长 */
                    0, 0, 0,    /* 间隔 */
                    1, 1, 1     /* S: 三短 */
                };
                
                uint32_t cycle_time = elapsed % 4000;  /* 4秒一个完整周期 */
                uint32_t slot = cycle_time / 250;      /* 每个时隙250ms */
                
                if (slot < sizeof(sos_pattern)) {
                    if (sos_pattern[slot]) {
                        buzzer_set_state(true);  /* 鸣叫 */
                    } else {
                        buzzer_set_state(false); /* 静音 */
                    }
                } else {
                    buzzer_set_state(false);
                }
            }
            break;
            
        default:
            buzzer_set_state(false);
            break;
    }
}

/* 系统报警管理 */
void alarm_trigger(uint8_t severity, const char *message) {
    system_state.alarm_triggered = true;
    system_state.alarm_start_time = system_tick_ms;
    system_state.alarm_severity = severity;
    strncpy(system_state.alarm_message, message, 
            sizeof(system_state.alarm_message) - 1);
    
    /* 根据严重程度设置报警模式 */
    if (severity >= 8) {
        alarm_set_mode(ALARM_MODE_CONTINUOUS);
    } else if (severity >= 5) {
        alarm_set_mode(ALARM_MODE_INTERMITTENT);
    } else {
        alarm_set_mode(ALARM_MODE_BEEP_ONCE);
    }
}

/* 清除报警 */
void alarm_clear(void) {
    system_state.alarm_triggered = false;
    system_state.alarm_severity = 0;
    system_state.alarm_message[0] = '\0';
    alarm_set_mode(ALARM_MODE_OFF);
}

/* 报警监控任务 */
void alarm_monitor(void) {
    if (system_state.alarm_triggered) {
        /* 报警持续30秒后自动清除(示例) */
        if ((system_tick_ms - system_state.alarm_start_time) > 30000) {
            alarm_clear();
        }
    }
}

/* 主函数 */
int main(void) {
    /* 系统时钟初始化(略) */
    /* SysTick配置(略) */
    
    /* 外设初始化 */
    button_init();
    buzzer_init();
    
    /* 初始状态 */
    alarm_clear();
    
    /* 主循环 */
    while (1) {
        /* 更新所有按键状态 */
        for (uint8_t i = 0; i < BUTTON_COUNT; i++) {
            button_update(i);
            
            /* 处理按键事件 */
            ButtonEvent_t event = button_get_event(i);
            if (event != BUTTON_EVENT_NONE) {
                switch (event) {
                    case BUTTON_EVENT_SHORT_PRESS:
                        /* 短按:触发测试报警 */
                        alarm_trigger(5, "Button Short Press");
                        break;
                        
                    case BUTTON_EVENT_LONG_PRESS:
                        /* 长按:清除报警 */
                        alarm_clear();
                        break;
                        
                    case BUTTON_EVENT_DOUBLE_CLICK:
                        /* 双击:切换报警模式 */
                        if (buzzer.mode == ALARM_MODE_OFF) {
                            alarm_trigger(3, "Test Alarm");
                        } else {
                            alarm_clear();
                        }
                        break;
                        
                    default:
                        break;
                }
            }
        }
        
        /* 更新蜂鸣器状态 */
        buzzer_update();
        
        /* 监控报警状态 */
        alarm_monitor();
        
        /* 其他任务... */
        // display_update();
        // sensor_read();
        // communication_process();
        
        /* 延时或进入低功耗 */
        delay_ms(10);
    }
    
    return 0;
}

2.3 串口通信完整实现

下面是一个完整的串口通信模块,包含环形缓冲区、命令解析和DMA传输:

c

/**
 * @file    uart_communication.c
 * @brief   串口通信完整实现(带DMA和协议解析)
 * @version 3.0
 * @date    2024-01-15
 */

#include "gd32f30x.h"
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdarg.h>

/* 串口配置 */
#define UART_PORT USART0
#define UART_BAUDRATE 115200
#define UART_RX_DMA_CHANNEL DMA_CH0
#define UART_TX_DMA_CHANNEL DMA_CH1

/* 缓冲区大小 */
#define RX_BUFFER_SIZE 256
#define TX_BUFFER_SIZE 256
#define CMD_BUFFER_SIZE 64
#define MAX_CMD_ARGS 8

/* 环形缓冲区结构体 */
typedef struct {
    uint8_t buffer[RX_BUFFER_SIZE];
    uint16_t head;      /* 写指针 */
    uint16_t tail;      /* 读指针 */
    uint16_t count;     /* 数据个数 */
} RingBuffer_t;

/* 命令结构体 */
typedef struct {
    const char *name;
    void (*handler)(int argc, char *argv[]);
    const char *description;
} Command_t;

/* 系统时间戳 */
volatile uint32_t system_tick_ms = 0;

/* 串口全局变量 */
static RingBuffer_t rx_buffer = {0};
static RingBuffer_t tx_buffer = {0};
static bool tx_busy = false;

/* 命令解析相关 */
static char cmd_buffer[CMD_BUFFER_SIZE];
static uint16_t cmd_index = 0;
static bool cmd_ready = false;

/* 自定义命令表 */
static Command_t command_table[] = {
    {"help", cmd_help, "显示所有可用命令"},
    {"led", cmd_led, "控制LED: led <id> <on/off/state>"},
    {"alarm", cmd_alarm, "报警控制: alarm <on/off/test>"},
    {"param", cmd_param, "参数设置: param <name> <value>"},
    {"status", cmd_status, "显示系统状态"},
    {"reset", cmd_reset, "系统复位"},
    {"info", cmd_info, "显示系统信息"},
    {"debug", cmd_debug, "调试命令: debug <level>"}
};

#define COMMAND_COUNT (sizeof(command_table) / sizeof(command_table[0]))

/* 环形缓冲区操作 */
static bool ring_buffer_push(RingBuffer_t *rb, uint8_t data) {
    if (rb->count >= RX_BUFFER_SIZE) {
        return false;  /* 缓冲区满 */
    }
    
    rb->buffer[rb->head] = data;
    rb->head = (rb->head + 1) % RX_BUFFER_SIZE;
    rb->count++;
    return true;
}

static bool ring_buffer_pop(RingBuffer_t *rb, uint8_t *data) {
    if (rb->count == 0) {
        return false;  /* 缓冲区空 */
    }
    
    *data = rb->buffer[rb->tail];
    rb->tail = (rb->tail + 1) % RX_BUFFER_SIZE;
    rb->count--;
    return true;
}

static uint16_t ring_buffer_available(RingBuffer_t *rb) {
    return rb->count;
}

/* 串口初始化 */
void uart_init(void) {
    /* 使能时钟 */
    rcu_periph_clock_enable(RCU_USART0);
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_DMA0);
    
    /* 配置GPIO */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);  /* TX */
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); /* RX */
    
    /* 配置串口 */
    usart_deinit(UART_PORT);
    usart_baudrate_set(UART_PORT, UART_BAUDRATE);
    usart_word_length_set(UART_PORT, USART_WL_8BIT);
    usart_stop_bit_set(UART_PORT, USART_STB_1BIT);
    usart_parity_config(UART_PORT, USART_PM_NONE);
    usart_hardware_flow_rts_config(UART_PORT, USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(UART_PORT, USART_CTS_DISABLE);
    usart_receive_config(UART_PORT, USART_RECEIVE_ENABLE);
    usart_transmit_config(UART_PORT, USART_TRANSMIT_ENABLE);
    
    /* 使能接收中断 */
    usart_interrupt_enable(UART_PORT, USART_INT_RBNE);
    
    /* 配置DMA用于发送 */
    dma_deinit(DMA0, UART_TX_DMA_CHANNEL);
    dma_init_struct dma_init;
    
    dma_struct_para_init(&dma_init);
    dma_init.direction = DMA_MEMORY_TO_PERIPHERAL;
    dma_init.memory_addr = (uint32_t)tx_buffer.buffer;
    dma_init.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_init.memory_width = DMA_MEMORY_WIDTH_8BIT;
    dma_init.number = 0;
    dma_init.periph_addr = (uint32_t)&USART_DATA(UART_PORT);
    dma_init.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_init.periph_width = DMA_PERIPH_WIDTH_8BIT;
    dma_init.priority = DMA_PRIORITY_HIGH;
    dma_init.dma_mode = DMA_NORMAL_MODE;  /* 普通模式,非循环 */
    
    dma_init(DMA0, UART_TX_DMA_CHANNEL, &dma_init);
    
    /* 使能DMA发送完成中断 */
    dma_interrupt_enable(DMA0, UART_TX_DMA_CHANNEL, DMA_INT_FTF);
    
    /* 使能USART DMA发送 */
    usart_dma_transmit_config(UART_PORT, USART_DENT_ENABLE);
    
    /* 配置NVIC */
    nvic_irq_enable(USART0_IRQn, 0, 0);
    nvic_irq_enable(DMA0_Channel1_IRQn, 1, 0);
    
    /* 使能串口 */
    usart_enable(UART_PORT);
}

/* 串口中断服务程序 */
void USART0_IRQHandler(void) {
    if (usart_interrupt_flag_get(UART_PORT, USART_INT_FLAG_RBNE) != RESET) {
        uint8_t data = usart_data_receive(UART_PORT);
        
        /* 将数据存入接收缓冲区 */
        ring_buffer_push(&rx_buffer, data);
        
        /* 如果是换行符,表示命令结束 */
        if (data == '\n' || data == '\r') {
            if (cmd_index > 0) {
                cmd_buffer[cmd_index] = '\0';
                cmd_ready = true;
                cmd_index = 0;
            }
        } else if (cmd_index < (CMD_BUFFER_SIZE - 1)) {
            cmd_buffer[cmd_index++] = data;
        }
        
        usart_interrupt_flag_clear(UART_PORT, USART_INT_FLAG_RBNE);
    }
}

/* DMA发送完成中断 */
void DMA0_Channel1_IRQHandler(void) {
    if (dma_interrupt_flag_get(DMA0, UART_TX_DMA_CHANNEL, DMA_INT_FLAG_FTF) != RESET) {
        dma_interrupt_flag_clear(DMA0, UART_TX_DMA_CHANNEL, DMA_INT_FLAG_FTF);
        
        /* 发送完成,可以开始下一次发送 */
        tx_busy = false;
        uart_tx_process();  /* 检查是否有更多数据要发送 */
    }
}

/* 发送单个字符 */
void uart_send_char(char c) {
    while (tx_busy) {
        /* 等待DMA空闲 */
    }
    
    tx_buffer.buffer[0] = c;
    dma_transfer_number_config(DMA0, UART_TX_DMA_CHANNEL, 1);
    dma_memory_address_config(DMA0, UART_TX_DMA_CHANNEL, (uint32_t)tx_buffer.buffer);
    dma_channel_enable(DMA0, UART_TX_DMA_CHANNEL);
    tx_busy = true;
}

/* 发送字符串 */
void uart_send_string(const char *str) {
    uint16_t len = strlen(str);
    
    if (len == 0) return;
    
    while (tx_busy) {
        /* 等待DMA空闲 */
    }
    
    /* 复制数据到发送缓冲区 */
    memcpy(tx_buffer.buffer, str, len);
    
    dma_transfer_number_config(DMA0, UART_TX_DMA_CHANNEL, len);
    dma_memory_address_config(DMA0, UART_TX_DMA_CHANNEL, (uint32_t)tx_buffer.buffer);
    dma_channel_enable(DMA0, UART_TX_DMA_CHANNEL);
    tx_busy = true;
}

/* 格式化打印 */
void uart_printf(const char *fmt, ...) {
    char buffer[128];
    va_list args;
    
    va_start(args, fmt);
    vsnprintf(buffer, sizeof(buffer), fmt, args);
    va_end(args);
    
    uart_send_string(buffer);
}

/* 处理发送队列 */
void uart_tx_process(void) {
    /* 如果有数据在发送缓冲区等待且DMA空闲 */
    if (!tx_busy && ring_buffer_available(&tx_buffer) > 0) {
        uint8_t data;
        uint16_t i = 0;
        
        /* 从环形缓冲区读取数据到DMA缓冲区 */
        while (ring_buffer_pop(&tx_buffer, &data) && i < TX_BUFFER_SIZE) {
            tx_buffer.buffer[i++] = data;
        }
        
        if (i > 0) {
            dma_transfer_number_config(DMA0, UART_TX_DMA_CHANNEL, i);
            dma_memory_address_config(DMA0, UART_TX_DMA_CHANNEL, 
                                     (uint32_t)tx_buffer.buffer);
            dma_channel_enable(DMA0, UART_TX_DMA_CHANNEL);
            tx_busy = true;
        }
    }
}

/* 命令解析 */
static void parse_and_execute_command(const char *cmd_line) {
    char *argv[MAX_CMD_ARGS];
    int argc = 0;
    
    /* 复制命令字符串用于分割 */
    char cmd_copy[CMD_BUFFER_SIZE];
    strncpy(cmd_copy, cmd_line, CMD_BUFFER_SIZE - 1);
    cmd_copy[CMD_BUFFER_SIZE - 1] = '\0';
    
    /* 分割参数 */
    char *token = strtok(cmd_copy, " \t\n\r");
    while (token != NULL && argc < MAX_CMD_ARGS) {
        argv[argc++] = token;
        token = strtok(NULL, " \t\n\r");
    }
    
    if (argc == 0) {
        return;
    }
    
    /* 查找命令并执行 */
    for (uint16_t i = 0; i < COMMAND_COUNT; i++) {
        if (strcmp(argv[0], command_table[i].name) == 0) {
            command_table[i].handler(argc, argv);
            return;
        }
    }
    
    /* 命令未找到 */
    uart_printf("Unknown command: %s\r\n", argv[0]);
    uart_printf("Type 'help' for available commands\r\n");
}

/* 命令处理函数实现 */
void cmd_help(int argc, char *argv[]) {
    uart_printf("Available commands:\r\n");
    uart_printf("===================\r\n");
    
    for (uint16_t i = 0; i < COMMAND_COUNT; i++) {
        uart_printf("%-10s - %s\r\n", 
                    command_table[i].name, 
                    command_table[i].description);
    }
}

void cmd_led(int argc, char *argv[]) {
    if (argc < 3) {
        uart_printf("Usage: led <id> <on/off/state>\r\n");
        return;
    }
    
    uint8_t led_id = atoi(argv[1]);
    const char *action = argv[2];
    
    /* 这里调用实际的LED控制函数 */
    uart_printf("LED %d: %s\r\n", led_id, action);
}

void cmd_alarm(int argc, char *argv[]) {
    if (argc < 2) {
        uart_printf("Usage: alarm <on/off/test>\r\n");
        return;
    }
    
    const char *action = argv[1];
    
    if (strcmp(action, "on") == 0) {
        uart_printf("Alarm activated\r\n");
    } else if (strcmp(action, "off") == 0) {
        uart_printf("Alarm deactivated\r\n");
    } else if (strcmp(action, "test") == 0) {
        uart_printf("Test alarm triggered\r\n");
    } else {
        uart_printf("Invalid action\r\n");
    }
}

void cmd_param(int argc, char *argv[]) {
    if (argc < 3) {
        uart_printf("Usage: param <name> <value>\r\n");
        return;
    }
    
    const char *name = argv[1];
    const char *value = argv[2];
    
    uart_printf("Parameter '%s' set to '%s'\r\n", name, value);
}

void cmd_status(int argc, char *argv[]) {
    uart_printf("System Status:\r\n");
    uart_printf("  Uptime: %lu ms\r\n", system_tick_ms);
    uart_printf("  RX buffer: %d/%d\r\n", 
                ring_buffer_available(&rx_buffer), RX_BUFFER_SIZE);
    uart_printf("  TX buffer: %d/%d\r\n", 
                ring_buffer_available(&tx_buffer), TX_BUFFER_SIZE);
    uart_printf("  DMA busy: %s\r\n", tx_busy ? "Yes" : "No");
}

void cmd_reset(int argc, char *argv[]) {
    uart_printf("System resetting...\r\n");
    /* 实际复位代码 */
    NVIC_SystemReset();
}

void cmd_info(int argc, char *argv[]) {
    uart_printf("System Information:\r\n");
    uart_printf("  MCU: GD32F303\r\n");
    uart_printf("  Clock: 108 MHz\r\n");
    uart_printf("  Flash: 256 KB\r\n");
    uart_printf("  RAM: 48 KB\r\n");
    uart_printf("  UART: %d bps\r\n", UART_BAUDRATE);
}

void cmd_debug(int argc, char *argv[]) {
    if (argc < 2) {
        uart_printf("Usage: debug <level>\r\n");
        uart_printf("Levels: 0=off, 1=error, 2=warning, 3=info, 4=debug\r\n");
        return;
    }
    
    uint8_t level = atoi(argv[1]);
    uart_printf("Debug level set to %d\r\n", level);
}

/* 串口任务处理 */
void uart_task(void) {
    /* 处理接收到的数据 */
    uint8_t data;
    while (ring_buffer_pop(&rx_buffer, &data)) {
        /* 这里可以添加其他处理逻辑 */
        // process_received_byte(data);
    }
    
    /* 处理命令 */
    if (cmd_ready) {
        parse_and_execute_command(cmd_buffer);
        cmd_ready = false;
    }
    
    /* 处理发送 */
    uart_tx_process();
}

/* 主函数 */
int main(void) {
    /* 系统初始化 */
    system_clock_init();
    
    /* 串口初始化 */
    uart_init();
    
    /* 发送欢迎信息 */
    uart_printf("\r\n");
    uart_printf("=====================================\r\n");
    uart_printf("   Embedded System CLI v1.0\r\n");
    uart_printf("   Type 'help' for commands\r\n");
    uart_printf("=====================================\r\n");
    uart_printf("> ");
    
    /* 主循环 */
    while (1) {
        /* 串口任务 */
        uart_task();
        
        /* 其他任务 */
        // led_task();
        // sensor_task();
        // alarm_task();
        
        /* 简单延时 */
        delay_ms(1);
    }
    
    return 0;
}

2.4 复杂状态机系统设计

对于更复杂的系统,需要设计更完善的状态机框架:

c

/**
 * @file    state_machine_framework.c
 * @brief   复杂状态机框架实现
 * @version 4.0
 * @date    2024-01-15
 */

#include <stdint.h>
#include <stdbool.h>
#include <string.h>

/* 事件定义 */
typedef enum {
    EVENT_NONE = 0,
    EVENT_POWER_ON,
    EVENT_POWER_OFF,
    EVENT_BUTTON_PRESS,
    EVENT_BUTTON_RELEASE,
    EVENT_TIMER_EXPIRED,
    EVENT_SENSOR_DATA_READY,
    EVENT_COMMAND_RECEIVED,
    EVENT_ERROR_DETECTED,
    EVENT_WARNING_CLEARED,
    EVENT_MAX
} SystemEvent_t;

/* 状态定义 */
typedef enum {
    STATE_INIT = 0,
    STATE_IDLE,
    STATE_RUNNING,
    STATE_CONFIG,
    STATE_CALIBRATION,
    STATE_ERROR,
    STATE_SHUTDOWN,
    STATE_MAX
} SystemState_t;

/* 事件回调函数类型 */
typedef bool (*EventCallback_t)(SystemEvent_t event, void *data);

/* 状态转换表项 */
typedef struct {
    SystemState_t current_state;
    SystemEvent_t event;
    SystemState_t next_state;
    EventCallback_t guard;      /* 条件检查 */
    EventCallback_t action;     /* 状态转换动作 */
} StateTransition_t;

/* 状态机上下文 */
typedef struct {
    SystemState_t current_state;
    SystemState_t previous_state;
    uint32_t state_entry_time;
    uint32_t state_duration;
    
    /* 事件队列 */
    SystemEvent_t event_queue[16];
    uint8_t event_queue_head;
    uint8_t event_queue_tail;
    uint8_t event_queue_count;
    
    /* 状态统计 */
    uint32_t state_visit_count[STATE_MAX];
    uint32_t total_transitions;
    
    /* 用户数据 */
    void *user_data;
} StateMachine_t;

/* 全局状态机实例 */
static StateMachine_t main_state_machine;

/* 状态进入/退出回调 */
static void (*state_entry_callbacks[STATE_MAX])(void *data);
static void (*state_exit_callbacks[STATE_MAX])(void *data);

/* 状态转换表 */
static StateTransition_t transition_table[] = {
    /* 当前状态       事件                   下一状态       条件检查      转换动作 */
    {STATE_INIT,     EVENT_POWER_ON,         STATE_IDLE,    NULL,        NULL},
    {STATE_IDLE,     EVENT_BUTTON_PRESS,     STATE_RUNNING, NULL,        NULL},
    {STATE_RUNNING,  EVENT_BUTTON_PRESS,     STATE_IDLE,    NULL,        NULL},
    {STATE_RUNNING,  EVENT_ERROR_DETECTED,   STATE_ERROR,   NULL,        NULL},
    {STATE_ERROR,    EVENT_WARNING_CLEARED,  STATE_IDLE,    NULL,        NULL},
    {STATE_IDLE,     EVENT_COMMAND_RECEIVED, STATE_CONFIG,  NULL,        NULL},
    {STATE_CONFIG,   EVENT_TIMER_EXPIRED,    STATE_IDLE,    NULL,        NULL},
    /* 可以继续添加更多转换规则 */
};

#define TRANSITION_COUNT (sizeof(transition_table) / sizeof(transition_table[0]))

/* 状态机初始化 */
void state_machine_init(StateMachine_t *sm, SystemState_t initial_state, void *user_data) {
    memset(sm, 0, sizeof(StateMachine_t));
    sm->current_state = initial_state;
    sm->previous_state = initial_state;
    sm->state_entry_time = system_tick_ms;
    sm->user_data = user_data;
    
    /* 初始化事件队列 */
    sm->event_queue_head = 0;
    sm->event_queue_tail = 0;
    sm->event_queue_count = 0;
    
    /* 初始化统计信息 */
    for (int i = 0; i < STATE_MAX; i++) {
        sm->state_visit_count[i] = 0;
    }
    sm->total_transitions = 0;
}

/* 注册状态回调 */
void state_machine_register_callbacks(SystemState_t state, 
                                      void (*entry_cb)(void *), 
                                      void (*exit_cb)(void *)) {
    if (state < STATE_MAX) {
        state_entry_callbacks[state] = entry_cb;
        state_exit_callbacks[state] = exit_cb;
    }
}

/* 向状态机发送事件 */
bool state_machine_post_event(StateMachine_t *sm, SystemEvent_t event) {
    if (sm->event_queue_count >= 16) {
        return false;  /* 队列满 */
    }
    
    sm->event_queue[sm->event_queue_tail] = event;
    sm->event_queue_tail = (sm->event_queue_tail + 1) % 16;
    sm->event_queue_count++;
    
    return true;
}

/* 状态转换 */
static bool perform_state_transition(StateMachine_t *sm, 
                                     SystemState_t new_state) {
    if (new_state >= STATE_MAX) {
        return false;
    }
    
    /* 调用退出当前状态的回调 */
    if (state_exit_callbacks[sm->current_state] != NULL) {
        state_exit_callbacks[sm->current_state](sm->user_data);
    }
    
    /* 更新状态信息 */
    sm->previous_state = sm->current_state;
    sm->current_state = new_state;
    sm->state_entry_time = system_tick_ms;
    
    /* 更新统计 */
    sm->state_visit_count[new_state]++;
    sm->total_transitions++;
    
    /* 调用进入新状态的回调 */
    if (state_entry_callbacks[new_state] != NULL) {
        state_entry_callbacks[new_state](sm->user_data);
    }
    
    return true;
}

/* 状态机处理 */
void state_machine_process(StateMachine_t *sm) {
    /* 处理事件队列中的所有事件 */
    while (sm->event_queue_count > 0) {
        SystemEvent_t event = sm->event_queue[sm->event_queue_head];
        sm->event_queue_head = (sm->event_queue_head + 1) % 16;
        sm->event_queue_count--;
        
        /* 查找匹配的转换规则 */
        for (uint16_t i = 0; i < TRANSITION_COUNT; i++) {
            StateTransition_t *trans = &transition_table[i];
            
            if (trans->current_state == sm->current_state && 
                trans->event == event) {
                
                /* 检查条件(如果有) */
                bool can_transition = true;
                if (trans->guard != NULL) {
                    can_transition = trans->guard(event, sm->user_data);
                }
                
                /* 执行状态转换 */
                if (can_transition) {
                    /* 执行转换动作(如果有) */
                    if (trans->action != NULL) {
                        trans->action(event, sm->user_data);
                    }
                    
                    /* 执行状态转换 */
                    perform_state_transition(sm, trans->next_state);
                    break;  /* 一次只处理一个转换 */
                }
            }
        }
    }
    
    /* 更新状态持续时间 */
    sm->state_duration = system_tick_ms - sm->state_entry_time;
}

/* 获取当前状态 */
SystemState_t state_machine_get_current_state(StateMachine_t *sm) {
    return sm->current_state;
}

/* 获取状态持续时间 */
uint32_t state_machine_get_state_duration(StateMachine_t *sm) {
    return sm->state_duration;
}

/* 获取状态统计 */
void state_machine_get_statistics(StateMachine_t *sm, 
                                  uint32_t *visit_counts, 
                                  uint32_t *total_transitions) {
    if (visit_counts != NULL) {
        memcpy(visit_counts, sm->state_visit_count, 
               sizeof(uint32_t) * STATE_MAX);
    }
    
    if (total_transitions != NULL) {
        *total_transitions = sm->total_transitions;
    }
}

/* 示例:状态回调函数实现 */
static void state_init_entry(void *data) {
    uart_printf("Entering INIT state\r\n");
    /* 初始化硬件 */
    led_init();
    button_init();
    buzzer_init();
    uart_init();
}

static void state_init_exit(void *data) {
    uart_printf("Exiting INIT state\r\n");
}

static void state_idle_entry(void *data) {
    uart_printf("Entering IDLE state\r\n");
    /* 进入低功耗模式 */
    // enter_low_power_mode();
}

static void state_idle_exit(void *data) {
    uart_printf("Exiting IDLE state\r\n");
    /* 退出低功耗模式 */
    // exit_low_power_mode();
}

static void state_running_entry(void *data) {
    uart_printf("Entering RUNNING state\r\n");
    /* 启动传感器采集 */
    // start_sensor_acquisition();
}

static void state_running_exit(void *data) {
    uart_printf("Exiting RUNNING state\r\n");
    /* 停止传感器采集 */
    // stop_sensor_acquisition();
}

static void state_error_entry(void *data) {
    uart_printf("Entering ERROR state\r\n");
    /* 触发报警 */
    alarm_trigger(10, "System Error State");
}

static void state_error_exit(void *data) {
    uart_printf("Exiting ERROR state\r\n");
    /* 清除报警 */
    alarm_clear();
}

/* 示例:条件检查函数 */
static bool check_battery_level(SystemEvent_t event, void *data) {
    /* 检查电池电量是否足够 */
    // uint16_t voltage = read_battery_voltage();
    // return (voltage > 3500);  /* 3.5V以上才允许某些操作 */
    return true;  /* 简化示例 */
}

/* 示例:转换动作函数 */
static void log_transition(SystemEvent_t event, void *data) {
    const char *event_names[] = {
        "NONE", "POWER_ON", "POWER_OFF", "BUTTON_PRESS",
        "BUTTON_RELEASE", "TIMER_EXPIRED", "SENSOR_DATA_READY",
        "COMMAND_RECEIVED", "ERROR_DETECTED", "WARNING_CLEARED"
    };
    
    const char *state_names[] = {
        "INIT", "IDLE", "RUNNING", "CONFIG",
        "CALIBRATION", "ERROR", "SHUTDOWN"
    };
    
    StateMachine_t *sm = (StateMachine_t *)data;
    
    uart_printf("Transition: %s -> Event: %s\r\n",
                state_names[sm->current_state],
                event_names[event]);
}

/* 主应用程序 */
int main(void) {
    /* 系统初始化 */
    system_clock_init();
    
    /* 初始化状态机 */
    state_machine_init(&main_state_machine, STATE_INIT, NULL);
    
    /* 注册状态回调 */
    state_machine_register_callbacks(STATE_INIT, 
                                     state_init_entry, 
                                     state_init_exit);
    state_machine_register_callbacks(STATE_IDLE, 
                                     state_idle_entry, 
                                     state_idle_exit);
    state_machine_register_callbacks(STATE_RUNNING, 
                                     state_running_entry, 
                                     state_running_exit);
    state_machine_register_callbacks(STATE_ERROR, 
                                     state_error_entry, 
                                     state_error_exit);
    
    /* 发送初始事件 */
    state_machine_post_event(&main_state_machine, EVENT_POWER_ON);
    
    /* 主循环 */
    while (1) {
        /* 处理状态机 */
        state_machine_process(&main_state_machine);
        
        /* 模拟事件产生 */
        static uint32_t last_event_time = 0;
        if ((system_tick_ms - last_event_time) > 1000) {
            /* 每秒产生一个模拟事件 */
            state_machine_post_event(&main_state_machine, 
                                     EVENT_BUTTON_PRESS);
            last_event_time = system_tick_ms;
        }
        
        /* 根据当前状态执行相应的任务 */
        switch (state_machine_get_current_state(&main_state_machine)) {
            case STATE_IDLE:
                /* 空闲状态任务 */
                // check_for_events();
                break;
                
            case STATE_RUNNING:
                /* 运行状态任务 */
                // read_sensors();
                // process_data();
                // update_display();
                break;
                
            case STATE_ERROR:
                /* 错误状态处理 */
                // log_error();
                // attempt_recovery();
                break;
                
            default:
                break;
        }
        
        /* 延时 */
        delay_ms(10);
    }
    
    return 0;
}

三、与RTOS的深度对比

3.1 裸机开发全面分析

3.1.1 裸机开发的优势详解

a) 极致高效与资源利用率

c

/* 裸机系统内存使用示例 */
/* RTOS任务控制块 (Task Control Block) */
struct tcb {
    void *stack_pointer;      /* 4-8 bytes */
    uint32_t stack_size;      /* 4 bytes */
    uint8_t priority;         /* 1 byte */
    uint8_t state;            /* 1 byte */
    /* ... 其他字段 ... */
    /* 总计: 通常需要 32-64 bytes/任务 */
};

/* 裸机系统状态保存 */
struct baremetal_state {
    /* 通常只需要保存关键变量 */
    uint32_t sensor_data;     /* 4 bytes */
    uint8_t system_mode;      /* 1 byte */
    uint16_t error_code;      /* 2 bytes */
    /* 总计: < 16 bytes */
};

b) 实时性保证

c

/* 中断响应时间对比 */
/* 裸机中断响应流程:*/
/* 1. 硬件检测到中断 */
/* 2. 保存现场(自动) */
/* 3. 跳转到ISR(1-2个时钟周期) */
/* 4. 执行ISR */
/* 总延迟: 通常 < 10 个时钟周期 */

/* RTOS中断响应流程:*/
/* 1. 硬件检测到中断 */
/* 2. RTOS中断入口(保存额外上下文) */
/* 3. 可能触发任务切换 */
/* 4. 执行ISR */
/* 5. 可能再次触发任务切换 */
/* 总延迟: 通常 20-50 个时钟周期 */

c) 启动速度

c

/* 启动时间对比 */
/* 裸机启动代码 */
void Reset_Handler(void) {
    /* 1. 初始化堆栈指针 */
    /* 2. 初始化.data段(< 1ms) */
    /* 3. 清零.bss段(< 1ms) */
    /* 4. 调用main() */
    /* 总启动时间: 通常 < 2ms */
}

/* RTOS启动流程 */
void main(void) {
    /* 1. 硬件初始化(< 2ms) */
    /* 2. RTOS内核初始化(< 5ms) */
    /* 3. 创建任务(< 2ms/任务) */
    /* 4. 启动调度器(< 1ms) */
    /* 5. 开始执行任务 */
    /* 总启动时间: 通常 10-50ms */
}
3.1.2 裸机开发的劣势与挑战

a) 并发处理能力有限

c

/* 裸机伪并发实现示例 */
volatile bool uart_data_ready = false;
volatile bool adc_conversion_done = false;
volatile bool timer_expired = false;

void main(void) {
    while (1) {
        /* 轮询检查各个标志位 */
        if (uart_data_ready) {
            process_uart_data();
            uart_data_ready = false;
        }
        
        if (adc_conversion_done) {
            process_adc_data();
            adc_conversion_done = false;
        }
        
        if (timer_expired) {
            do_periodic_task();
            timer_expired = false;
        }
        
        /* 问题:
           1. 高优先级任务可能饿死低优先级任务
           2. 响应时间不可预测
           3. 难以保证实时性要求
        */
    }
}

b) 代码复杂度随功能增长

c

/* 功能扩展带来的复杂度 */
/* 版本1: 简单LED控制 */
void main_v1(void) {
    while (1) {
        toggle_led();
        delay_ms(500);
    }
}

/* 版本2: 添加按键和蜂鸣器 */
void main_v2(void) {
    while (1) {
        /* LED控制 */
        if (led_timer_expired) {
            toggle_led();
        }
        
        /* 按键处理 */
        if (button_pressed) {
            handle_button();
        }
        
        /* 蜂鸣器控制 */
        if (buzzer_active) {
            update_buzzer();
        }
        
        /* 开始变得混乱... */
    }
}

/* 版本3: 添加通信和传感器 */
void main_v3(void) {
    /* 多个定时器、中断、状态机交织在一起 */
    /* 代码迅速变得难以维护 */
}

3.2 RTOS核心优势分析

3.2.1 任务管理与调度

c

/* RTOS任务定义示例(以FreeRTOS为例) */
void vTask1(void *pvParameters) {
    while (1) {
        /* 任务1的代码 */
        process_sensor_data();
        vTaskDelay(pdMS_TO_TICKS(100));  /* 每100ms执行一次 */
    }
}

void vTask2(void *pvParameters) {
    while (1) {
        /* 任务2的代码 */
        handle_communication();
        /* 等待事件或消息 */
        xQueueReceive(xQueue, &data, portMAX_DELAY);
    }
}

void vTask3(void *pvParameters) {
    while (1) {
        /* 任务3的代码 */
        update_display();
        vTaskDelay(pdMS_TO_TICKS(500));  /* 每500ms执行一次 */
    }
}

/* 任务创建与调度 */
int main(void) {
    /* 创建任务 */
    xTaskCreate(vTask1, "SensorTask", 256, NULL, 2, NULL);
    xTaskCreate(vTask2, "CommTask", 512, NULL, 3, NULL);
    xTaskCreate(vTask3, "DisplayTask", 256, NULL, 1, NULL);
    
    /* 启动调度器 */
    vTaskStartScheduler();
    
    return 0;
}
3.2.2 同步与通信机制

c

/* RTOS同步机制示例 */
/* 1. 信号量 (Semaphore) */
SemaphoreHandle_t xSemaphore = NULL;

/* 任务间同步 */
void vProducerTask(void *pvParameters) {
    while (1) {
        /* 生产数据 */
        produce_data();
        /* 释放信号量 */
        xSemaphoreGive(xSemaphore);
        vTaskDelay(100);
    }
}

void vConsumerTask(void *pvParameters) {
    while (1) {
        /* 等待信号量 */
        if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
            /* 消费数据 */
            consume_data();
        }
    }
}

/* 2. 消息队列 (Message Queue) */
QueueHandle_t xQueue = NULL;

void vSenderTask(void *pvParameters) {
    int32_t data_to_send = 0;
    while (1) {
        /* 发送消息 */
        xQueueSend(xQueue, &data_to_send, 0);
        data_to_send++;
        vTaskDelay(100);
    }
}

void vReceiverTask(void *pvParameters) {
    int32_t received_data;
    while (1) {
        /* 接收消息 */
        if (xQueueReceive(xQueue, &received_data, portMAX_DELAY)) {
            process_received_data(received_data);
        }
    }
}

/* 3. 互斥锁 (Mutex) */
SemaphoreHandle_t xMutex = NULL;

void vTaskA(void *pvParameters) {
    while (1) {
        /* 获取互斥锁 */
        if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) {
            /* 访问共享资源 */
            access_shared_resource();
            /* 释放互斥锁 */
            xSemaphoreGive(xMutex);
        }
        vTaskDelay(10);
    }
}

3.3 实际项目对比案例

案例:智能温控系统

裸机实现:

c

/* smart_thermostat_baremetal.c */

/* 全局状态变量 */
typedef struct {
    float current_temp;
    float target_temp;
    bool heating_on;
    bool cooling_on;
    uint8_t fan_speed;
    uint32_t last_display_update;
    uint32_t last_sensor_read;
    uint32_t last_control_update;
    bool uart_command_pending;
    char uart_buffer[64];
} ThermostatState_t;

static ThermostatState_t thermostat;

int main(void) {
    /* 初始化 */
    system_init();
    sensor_init();
    display_init();
    uart_init();
    relay_init();
    
    /* 主循环 */
    while (1) {
        uint32_t current_time = get_system_tick();
        
        /* 1. 传感器读取(每100ms) */
        if ((current_time - thermostat.last_sensor_read) >= 100) {
            thermostat.current_temp = read_temperature();
            thermostat.last_sensor_read = current_time;
        }
        
        /* 2. 控制逻辑更新(每50ms) */
        if ((current_time - thermostat.last_control_update) >= 50) {
            update_control_logic();
            thermostat.last_control_update = current_time;
        }
        
        /* 3. 显示更新(每200ms) */
        if ((current_time - thermostat.last_display_update) >= 200) {
            update_display();
            thermostat.last_display_update = current_time;
        }
        
        /* 4. UART命令处理 */
        if (thermostat.uart_command_pending) {
            process_uart_command();
            thermostat.uart_command_pending = false;
        }
        
        /* 5. 按键处理(轮询) */
        if (check_button()) {
            handle_button_press();
        }
        
        /* 进入低功耗模式 */
        enter_idle_mode();
    }
    
    return 0;
}

/* 问题分析:
   1. 所有功能耦合在一起
   2. 定时精度依赖主循环执行速度
   3. 添加新功能需要修改主循环结构
   4. 调试困难,一个bug可能影响所有功能
*/

RTOS实现:

c

/* smart_thermostat_rtos.c */

/* 任务优先级定义 */
#define TASK_PRIORITY_SENSOR     4
#define TASK_PRIORITY_CONTROL    3
#define TASK_PRIORITY_DISPLAY    2
#define TASK_PRIORITY_COMM       5
#define TASK_PRIORITY_BUTTON     1

/* 共享资源保护 */
static SemaphoreHandle_t xTempMutex;
static float current_temperature = 0.0;
static float target_temperature = 22.0;

/* 传感器读取任务 */
void vSensorTask(void *pvParameters) {
    const TickType_t xFrequency = pdMS_TO_TICKS(100);
    TickType_t xLastWakeTime = xTaskGetTickCount();
    
    while (1) {
        /* 读取温度传感器 */
        float temp = read_temperature();
        
        /* 保护共享资源 */
        if (xSemaphoreTake(xTempMutex, portMAX_DELAY) == pdTRUE) {
            current_temperature = temp;
            xSemaphoreGive(xTempMutex);
        }
        
        /* 发送温度数据到控制任务 */
        xQueueSend(xTempQueue, &temp, 0);
        
        /* 精确延时100ms */
        vTaskDelayUntil(&xLastWakeTime, xFrequency);
    }
}

/* 控制任务 */
void vControlTask(void *pvParameters) {
    float temp;
    bool heating_on = false;
    bool cooling_on = false;
    
    while (1) {
        /* 等待温度数据 */
        if (xQueueReceive(xTempQueue, &temp, portMAX_DELAY)) {
            /* 控制逻辑 */
            if (temp < (target_temperature - 0.5)) {
                heating_on = true;
                cooling_on = false;
                set_heating(ON);
                set_cooling(OFF);
            } else if (temp > (target_temperature + 0.5)) {
                heating_on = false;
                cooling_on = true;
                set_heating(OFF);
                set_cooling(ON);
            } else {
                heating_on = false;
                cooling_on = false;
                set_heating(OFF);
                set_cooling(OFF);
            }
        }
    }
}

/* 显示任务 */
void vDisplayTask(void *pvParameters) {
    const TickType_t xFrequency = pdMS_TO_TICKS(200);
    TickType_t xLastWakeTime = xTaskGetTickCount();
    
    while (1) {
        float temp;
        
        /* 读取当前温度(保护共享资源) */
        if (xSemaphoreTake(xTempMutex, portMAX_DELAY) == pdTRUE) {
            temp = current_temperature;
            xSemaphoreGive(xTempMutex);
        }
        
        /* 更新显示 */
        update_display(temp, target_temperature);
        
        /* 精确延时200ms */
        vTaskDelayUntil(&xLastWakeTime, xFrequency);
    }
}

/* 通信任务 */
void vCommTask(void *pvParameters) {
    char cmd_buffer[64];
    
    while (1) {
        /* 处理UART命令 */
        if (receive_uart_command(cmd_buffer, sizeof(cmd_buffer))) {
            process_command(cmd_buffer);
        }
        
        /* 处理网络请求 */
        handle_network_requests();
        
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

/* 按钮处理任务 */
void vButtonTask(void *pvParameters) {
    while (1) {
        /* 等待按钮事件 */
        wait_for_button_event();
        
        /* 处理按钮按下 */
        handle_button_action();
    }
}

/* 优点分析:
   1. 功能模块化,职责清晰
   2. 各任务独立运行,互不影响
   3. 精确的定时控制
   4. 易于扩展新功能
   5. 更好的错误隔离
*/

四、裸机开发的进阶模式

4.1 合作式调度器实现

对于复杂度介于纯裸机和RTOS之间的系统,可以实现一个简单的合作式调度器:

c

/**
 * @file    cooperative_scheduler.c
 * @brief   合作式调度器实现
 * @version 5.0
 * @date    2024-01-15
 */

#include <stdint.h>
#include <stdbool.h>
#include <string.h>

/* 任务函数指针类型 */
typedef void (*TaskFunction_t)(void);

/* 任务状态 */
typedef enum {
    TASK_STATE_SUSPENDED = 0,
    TASK_STATE_READY,
    TASK_STATE_RUNNING,
    TASK_STATE_WAITING
} TaskState_t;

/* 任务控制块 */
typedef struct {
    TaskFunction_t function;      /* 任务函数 */
    const char *name;             /* 任务名称 */
    uint32_t period_ms;           /* 执行周期(0表示非周期性) */
    uint32_t delay_ms;            /* 延时计数器 */
    uint32_t run_time;            /* 运行时间统计 */
    uint32_t run_count;           /* 运行次数统计 */
    uint8_t priority;             /* 优先级(0-255,0最高) */
    TaskState_t state;            /* 任务状态 */
    bool one_shot;                /* 是否只运行一次 */
} Task_t;

/* 调度器配置 */
#define MAX_TASKS 16
#define TICK_INTERVAL_MS 1

/* 全局变量 */
static Task_t task_table[MAX_TASKS];
static uint8_t task_count = 0;
static volatile uint32_t system_tick = 0;
static uint32_t idle_time = 0;
static uint32_t last_idle_check = 0;

/* SysTick中断服务程序 */
void SysTick_Handler(void) {
    system_tick++;
}

/* 调度器初始化 */
void scheduler_init(void) {
    memset(task_table, 0, sizeof(task_table));
    task_count = 0;
    idle_time = 0;
    last_idle_check = system_tick;
    
    /* 配置SysTick为1ms中断 */
    SysTick_Config(SystemCoreClock / 1000);
}

/* 添加任务 */
bool scheduler_add_task(TaskFunction_t func, 
                        const char *name, 
                        uint32_t period_ms, 
                        uint8_t priority, 
                        bool one_shot) {
    if (task_count >= MAX_TASKS || func == NULL) {
        return false;
    }
    
    Task_t *task = &task_table[task_count];
    task->function = func;
    task->name = name;
    task->period_ms = period_ms;
    task->delay_ms = period_ms;  /* 初始延时一个周期 */
    task->priority = priority;
    task->state = TASK_STATE_READY;
    task->one_shot = one_shot;
    task->run_time = 0;
    task->run_count = 0;
    
    task_count++;
    return true;
}

/* 挂起任务 */
bool scheduler_suspend_task(const char *name) {
    for (uint8_t i = 0; i < task_count; i++) {
        if (strcmp(task_table[i].name, name) == 0) {
            task_table[i].state = TASK_STATE_SUSPENDED;
            return true;
        }
    }
    return false;
}

/* 恢复任务 */
bool scheduler_resume_task(const char *name) {
    for (uint8_t i = 0; i < task_count; i++) {
        if (strcmp(task_table[i].name, name) == 0) {
            task_table[i].state = TASK_STATE_READY;
            task_table[i].delay_ms = task_table[i].period_ms;
            return true;
        }
    }
    return false;
}

/* 删除任务 */
bool scheduler_remove_task(const char *name) {
    for (uint8_t i = 0; i < task_count; i++) {
        if (strcmp(task_table[i].name, name) == 0) {
            /* 将后面的任务前移 */
            for (uint8_t j = i; j < task_count - 1; j++) {
                task_table[j] = task_table[j + 1];
            }
            task_count--;
            return true;
        }
    }
    return false;
}

/* 获取系统负载 */
uint32_t scheduler_get_cpu_load(void) {
    if (system_tick - last_idle_check == 0) {
        return 0;
    }
    
    uint32_t idle_percentage = (idle_time * 100) / 
                              (system_tick - last_idle_check);
    last_idle_check = system_tick;
    idle_time = 0;
    
    return 100 - idle_percentage;
}

/* 调度器执行 */
void scheduler_run(void) {
    uint32_t start_time, end_time;
    bool task_executed;
    
    while (1) {
        task_executed = false;
        
        /* 检查并执行就绪的任务 */
        for (uint8_t i = 0; i < task_count; i++) {
            Task_t *task = &task_table[i];
            
            if (task->state == TASK_STATE_READY) {
                if (task->delay_ms == 0) {
                    /* 记录开始时间 */
                    start_time = system_tick;
                    
                    /* 执行任务 */
                    task->state = TASK_STATE_RUNNING;
                    task->function();
                    task->state = TASK_STATE_READY;
                    
                    /* 记录结束时间并统计 */
                    end_time = system_tick;
                    task->run_time += (end_time - start_time);
                    task->run_count++;
                    
                    /* 重置延时计数器 */
                    task->delay_ms = task->period_ms;
                    
                    /* 如果是单次任务,则挂起 */
                    if (task->one_shot) {
                        task->state = TASK_STATE_SUSPENDED;
                    }
                    
                    task_executed = true;
                    break;  /* 合作式调度,一次只执行一个任务 */
                }
            }
        }
        
        /* 更新所有任务的延时计数器 */
        for (uint8_t i = 0; i < task_count; i++) {
            if (task_table[i].state == TASK_STATE_READY) {
                if (task_table[i].delay_ms > 0) {
                    task_table[i].delay_ms--;
                }
            }
        }
        
        /* 如果没有任务执行,增加空闲时间 */
        if (!task_executed) {
            idle_time++;
        }
        
        /* 短暂延时,防止过于频繁循环 */
        // delay_us(10);
    }
}

/* 获取任务信息 */
void scheduler_get_task_info(uint8_t index, 
                             char *name, 
                             uint32_t *run_time, 
                             uint32_t *run_count, 
                             TaskState_t *state) {
    if (index >= task_count) return;
    
    Task_t *task = &task_table[index];
    
    if (name != NULL) {
        strncpy(name, task->name, 15);
        name[15] = '\0';
    }
    
    if (run_time != NULL) {
        *run_time = task->run_time;
    }
    
    if (run_count != NULL) {
        *run_count = task->run_count;
    }
    
    if (state != NULL) {
        *state = task->state;
    }
}

/* 示例任务函数 */
void task_led_blink(void) {
    static bool led_state = false;
    
    if (led_state) {
        led_off();
    } else {
        led_on();
    }
    led_state = !led_state;
}

void task_sensor_read(void) {
    float temperature = read_temperature();
    float humidity = read_humidity();
    
    /* 处理传感器数据 */
    process_sensor_data(temperature, humidity);
}

void task_display_update(void) {
    update_display();
}

void task_uart_process(void) {
    process_uart_data();
}

/* 主函数示例 */
int main(void) {
    /* 系统初始化 */
    system_clock_init();
    led_init();
    sensor_init();
    display_init();
    uart_init();
    
    /* 调度器初始化 */
    scheduler_init();
    
    /* 添加任务 */
    scheduler_add_task(task_led_blink, "LED", 500, 10, false);
    scheduler_add_task(task_sensor_read, "Sensor", 100, 5, false);
    scheduler_add_task(task_display_update, "Display", 200, 8, false);
    scheduler_add_task(task_uart_process, "UART", 10, 3, false);
    
    /* 启动调度器 */
    scheduler_run();
    
    return 0;
}

4.2 事件驱动框架

对于更复杂的应用,可以实现一个事件驱动框架:

c

/**
 * @file    event_driven_framework.c
 * @brief   事件驱动框架实现
 * @version 6.0
 * @date    2024-01-15
 */

#include <stdint.h>
#include <stdbool.h>
#include <string.h>

/* 事件类型定义 */
typedef enum {
    EVENT_SYSTEM_START = 0,
    EVENT_SYSTEM_TICK,
    EVENT_BUTTON_PRESS,
    EVENT_BUTTON_RELEASE,
    EVENT_UART_RX,
    EVENT_UART_TX_DONE,
    EVENT_ADC_CONVERSION_DONE,
    EVENT_TIMER_EXPIRED,
    EVENT_SENSOR_DATA_READY,
    EVENT_DISPLAY_UPDATE,
    EVENT_ALARM_TRIGGER,
    EVENT_ALARM_CLEAR,
    EVENT_POWER_LOW,
    EVENT_POWER_CRITICAL,
    EVENT_MAX
} EventType_t;

/* 事件结构体 */
typedef struct {
    EventType_t type;
    uint32_t timestamp;
    uint16_t data_size;
    void *data;
    uint8_t priority;  /* 0-255,0最高 */
} Event_t;

/* 事件处理器函数指针类型 */
typedef void (*EventHandler_t)(Event_t *event);

/* 事件处理注册表项 */
typedef struct {
    EventType_t event_type;
    EventHandler_t handler;
    uint8_t priority;
} EventHandlerEntry_t;

/* 事件队列 */
#define EVENT_QUEUE_SIZE 32

typedef struct {
    Event_t events[EVENT_QUEUE_SIZE];
    uint8_t head;
    uint8_t tail;
    uint8_t count;
    bool overflow;
} EventQueue_t;

/* 全局变量 */
static EventQueue_t event_queue;
static EventHandlerEntry_t handler_table[EVENT_MAX][8];  /* 每个事件最多8个处理器 */
static uint8_t handler_count[EVENT_MAX] = {0};

/* 事件队列初始化 */
void event_queue_init(EventQueue_t *queue) {
    memset(queue, 0, sizeof(EventQueue_t));
}

/* 发布事件 */
bool event_publish(EventType_t type, void *data, uint16_t data_size, uint8_t priority) {
    if (event_queue.count >= EVENT_QUEUE_SIZE) {
        event_queue.overflow = true;
        return false;
    }
    
    Event_t *event = &event_queue.events[event_queue.tail];
    event->type = type;
    event->timestamp = system_tick_ms;
    event->data = data;
    event->data_size = data_size;
    event->priority = priority;
    
    event_queue.tail = (event_queue.tail + 1) % EVENT_QUEUE_SIZE;
    event_queue.count++;
    
    return true;
}

/* 获取下一个事件 */
bool event_get_next(Event_t **event) {
    if (event_queue.count == 0) {
        return false;
    }
    
    /* 查找最高优先级的事件 */
    uint8_t highest_prio = 255;
    uint8_t highest_idx = event_queue.head;
    uint8_t idx = event_queue.head;
    
    for (uint8_t i = 0; i < event_queue.count; i++) {
        if (event_queue.events[idx].priority < highest_prio) {
            highest_prio = event_queue.events[idx].priority;
            highest_idx = idx;
        }
        idx = (idx + 1) % EVENT_QUEUE_SIZE;
    }
    
    /* 如果最高优先级的事件不在头部,需要移动 */
    if (highest_idx != event_queue.head) {
        Event_t temp = event_queue.events[highest_idx];
        
        /* 将事件向前移动 */
        for (uint8_t i = highest_idx; i != event_queue.head; ) {
            uint8_t prev = (i == 0) ? EVENT_QUEUE_SIZE - 1 : i - 1;
            event_queue.events[i] = event_queue.events[prev];
            i = prev;
        }
        
        event_queue.events[event_queue.head] = temp;
    }
    
    *event = &event_queue.events[event_queue.head];
    return true;
}

/* 移除已处理的事件 */
void event_remove_processed(void) {
    if (event_queue.count > 0) {
        event_queue.head = (event_queue.head + 1) % EVENT_QUEUE_SIZE;
        event_queue.count--;
    }
}

/* 注册事件处理器 */
bool event_register_handler(EventType_t type, EventHandler_t handler, uint8_t priority) {
    if (handler_count[type] >= 8) {
        return false;  /* 处理器已满 */
    }
    
    uint8_t idx = handler_count[type];
    handler_table[type][idx].event_type = type;
    handler_table[type][idx].handler = handler;
    handler_table[type][idx].priority = priority;
    
    handler_count[type]++;
    
    /* 按优先级排序 */
    for (uint8_t i = 0; i < handler_count[type] - 1; i++) {
        for (uint8_t j = i + 1; j < handler_count[type]; j++) {
            if (handler_table[type][i].priority > handler_table[type][j].priority) {
                EventHandlerEntry_t temp = handler_table[type][i];
                handler_table[type][i] = handler_table[type][j];
                handler_table[type][j] = temp;
            }
        }
    }
    
    return true;
}

/* 处理事件 */
void event_process(void) {
    Event_t *event;
    
    while (event_get_next(&event)) {
        /* 调用所有注册的处理器 */
        for (uint8_t i = 0; i < handler_count[event->type]; i++) {
            if (handler_table[event->type][i].handler != NULL) {
                handler_table[event->type][i].handler(event);
            }
        }
        
        /* 移除已处理的事件 */
        event_remove_processed();
    }
}

/* 示例事件处理器 */
void system_tick_handler(Event_t *event) {
    static uint32_t last_stat_print = 0;
    
    /* 每秒打印一次统计信息 */
    if (system_tick_ms - last_stat_print >= 1000) {
        uart_printf("Event queue: %d/%d (overflow: %s)\r\n",
                   event_queue.count, EVENT_QUEUE_SIZE,
                   event_queue.overflow ? "YES" : "NO");
        last_stat_print = system_tick_ms;
    }
}

void button_press_handler(Event_t *event) {
    ButtonEventData_t *data = (ButtonEventData_t *)event->data;
    uart_printf("Button %d pressed at %lu\r\n", 
               data->button_id, event->timestamp);
    
    /* 触发LED闪烁 */
    Event_t led_event = {
        .type = EVENT_ALARM_TRIGGER,
        .timestamp = system_tick_ms,
        .priority = 10
    };
    event_publish(EVENT_ALARM_TRIGGER, NULL, 0, 10);
}

void uart_rx_handler(Event_t *event) {
    UartData_t *data = (UartData_t *)event->data;
    
    /* 处理接收到的数据 */
    if (data->size > 0) {
        process_uart_command(data->buffer, data->size);
    }
}

void alarm_handler(Event_t *event) {
    if (event->type == EVENT_ALARM_TRIGGER) {
        /* 触发报警 */
        buzzer_on();
        led_blink_fast();
    } else if (event->type == EVENT_ALARM_CLEAR) {
        /* 清除报警 */
        buzzer_off();
        led_off();
    }
}

/* 事件产生器(模拟) */
void event_generator(void) {
    static uint32_t last_system_tick = 0;
    static uint32_t last_button_check = 0;
    static uint32_t last_sensor_read = 0;
    
    uint32_t current_time = system_tick_ms;
    
    /* 系统滴答事件(每10ms) */
    if (current_time - last_system_tick >= 10) {
        event_publish(EVENT_SYSTEM_TICK, NULL, 0, 255);
        last_system_tick = current_time;
    }
    
    /* 按钮检测事件(每50ms) */
    if (current_time - last_button_check >= 50) {
        ButtonEventData_t button_data;
        if (check_button_press(&button_data)) {
            event_publish(EVENT_BUTTON_PRESS, &button_data, 
                         sizeof(button_data), 5);
        }
        last_button_check = current_time;
    }
    
    /* 传感器读取事件(每100ms) */
    if (current_time - last_sensor_read >= 100) {
        SensorData_t sensor_data = read_sensors();
        event_publish(EVENT_SENSOR_DATA_READY, &sensor_data,
                     sizeof(sensor_data), 20);
        last_sensor_read = current_time;
    }
}

/* 主函数 */
int main(void) {
    /* 系统初始化 */
    system_clock_init();
    uart_init();
    button_init();
    sensor_init();
    led_init();
    buzzer_init();
    
    /* 事件系统初始化 */
    event_queue_init(&event_queue);
    
    /* 注册事件处理器 */
    event_register_handler(EVENT_SYSTEM_TICK, system_tick_handler, 255);
    event_register_handler(EVENT_BUTTON_PRESS, button_press_handler, 5);
    event_register_handler(EVENT_UART_RX, uart_rx_handler, 10);
    event_register_handler(EVENT_ALARM_TRIGGER, alarm_handler, 3);
    event_register_handler(EVENT_ALARM_CLEAR, alarm_handler, 3);
    event_register_handler(EVENT_SENSOR_DATA_READY, sensor_data_handler, 15);
    
    /* 发布系统启动事件 */
    event_publish(EVENT_SYSTEM_START, NULL, 0, 0);
    
    /* 主循环 */
    while (1) {
        /* 产生事件 */
        event_generator();
        
        /* 处理事件 */
        event_process();
        
        /* 空闲时进入低功耗模式 */
        if (event_queue.count == 0) {
            enter_idle_mode();
        }
        
        /* 短暂延时 */
        delay_us(100);
    }
    
    return 0;
}

五、选择指南与最佳实践

5.1 详细选择决策树

c

/* 选择决策流程图 */
/*
                    ┌─────────────────┐
                    │   新项目评估     │
                    └────────┬────────┘
                             │
                   ┌─────────▼─────────┐
                   │ 需求分析和约束评估 │
                   └─────────┬─────────┘
                             │
        ┌────────────────────┴────────────────────┐
        │                                         │
┌───────▼──────────┐                    ┌────────▼────────┐
│   资源约束分析    │                    │  功能需求分析   │
│                  │                    │                │
│ Flash < 16KB?    │                    │ 需要多任务并发?  │
│ RAM < 2KB?       │                    │ 复杂协议栈支持?  │
│ 成本极其敏感?    │                    │ 团队协作开发?   │
│ 功耗要求极严?    │                    │ 长期维护需求?   │
└───────┬──────────┘                    └────────┬────────┘
        │                                         │
        └────────────────────┬────────────────────┘
                             │
                   ┌─────────▼─────────┐
                   │   技术方案决策    │
                   └─────────┬─────────┘
                             │
        ┌────────────────────┴────────────────────┐
        │                                         │
┌───────▼──────────┐                    ┌────────▼────────┐
│  选择裸机开发    │                    │  选择RTOS开发   │
│                  │                    │                │
│ ● 简单调度器     │                    │ ● FreeRTOS     │
│ ● 事件驱动框架   │                    │ ● RT-Thread    │
│ ● 状态机系统     │                    │ ● Zephyr       │
│ ● 合作式调度     │                    │ ● μC/OS        │
└──────────────────┘                    └─────────────────┘
*/

/* 详细评估表 */
typedef struct {
    /* 项目约束 */
    uint32_t flash_size_kb;
    uint32_t ram_size_kb;
    uint32_t mcu_frequency_mhz;
    float unit_cost_target;
    float power_consumption_target;  /* mA */
    uint32_t development_time_weeks;
    uint16_t expected_units;
    
    /* 功能需求 */
    bool require_multitasking;
    bool require_networking;
    bool require_file_system;
    bool require_gui;
    bool require_complex_math;
    bool require_real_time_response;  /* us级响应 */
    uint8_t concurrent_operations;    /* 并发操作数量 */
    uint8_t team_size;
    
    /* 维护需求 */
    bool long_term_support;
    bool need_third_party_libs;
    bool need_security_features;
    bool need_over_the_air_update;
    
    /* 得分计算 */
    uint16_t baremetal_score;
    uint16_t rtos_score;
} ProjectEvaluation_t;

/* 评分函数 */
void evaluate_project(ProjectEvaluation_t *eval) {
    uint16_t baremetal = 0;
    uint16_t rtos = 0;
    
    /* 资源约束评分 */
    if (eval->flash_size_kb < 16) baremetal += 30;
    if (eval->flash_size_kb >= 64) rtos += 20;
    
    if (eval->ram_size_kb < 2) baremetal += 30;
    if (eval->ram_size_kb >= 8) rtos += 20;
    
    if (eval->unit_cost_target < 1.0) baremetal += 20;
    
    /* 功能需求评分 */
    if (eval->require_multitasking) rtos += 40;
    else baremetal += 20;
    
    if (eval->require_networking) rtos += 30;
    
    if (eval->require_file_system) rtos += 20;
    
    if (eval->require_real_time_response) {
        if (eval->concurrent_operations <= 2) baremetal += 30;
        else rtos += 20;  /* RTOS有更好的实时性保证 */
    }
    
    if (eval->concurrent_operations > 3) rtos += 30;
    
    /* 维护需求评分 */
    if (eval->team_size > 3) rtos += 20;
    
    if (eval->long_term_support) rtos += 20;
    
    if (eval->need_third_party_libs) rtos += 30;
    
    eval->baremetal_score = baremetal;
    eval->rtos_score = rtos;
}

/* 决策函数 */
const char *make_decision(ProjectEvaluation_t *eval) {
    evaluate_project(eval);
    
    uint16_t diff = (eval->rtos_score > eval->baremetal_score) ? 
                   (eval->rtos_score - eval->baremetal_score) :
                   (eval->baremetal_score - eval->rtos_score);
    
    if (diff < 20) {
        return "HARD: 两者均可,建议基于团队经验选择";
    } else if (eval->rtos_score > eval->baremetal_score) {
        if (eval->flash_size_kb < 32) {
            return "RTOS: 推荐使用轻量级RTOS如FreeRTOS或RT-Thread Nano";
        } else {
            return "RTOS: 推荐使用功能丰富的RTOS如RT-Thread或Zephyr";
        }
    } else {
        if (eval->concurrent_operations > 1) {
            return "BareMetal: 推荐使用事件驱动框架或合作式调度器";
        } else {
            return "BareMetal: 推荐使用简单状态机或超级循环";
        }
    }
}

5.2 混合架构设计

在某些情况下,可以采用混合架构,在裸机基础上集成部分RTOS特性:

c

/**
 * @file    hybrid_architecture.c
 * @brief   裸机与RTOS混合架构
 * @version 7.0
 * @date    2024-01-15
 */

#include <stdint.h>
#include <stdbool.h>

/* 配置选项 */
#define USE_MINIMAL_RTOS_FEATURES  1
#define USE_EVENT_DRIVEN_ARCH      1
#define USE_COOPERATIVE_SCHEDULER  1

/* 最小化RTOS特性(仅实现核心功能) */
#if USE_MINIMAL_RTOS_FEATURES

/* 任务句柄 */
typedef void *TaskHandle_t;

/* 延时函数 */
void os_delay(uint32_t ms) {
    uint32_t target = system_tick_ms + ms;
    while (system_tick_ms < target) {
        /* 可以在这里进行任务切换 */
        os_yield();
    }
}

/* 任务切换 */
void os_yield(void) {
    /* 简单的合作式任务切换 */
    /* 实际实现需要保存/恢复上下文 */
}

/* 临界区保护 */
uint32_t os_enter_critical(void) {
    /* 禁止中断 */
    uint32_t primask = __get_PRIMASK();
    __disable_irq();
    return primask;
}

void os_exit_critical(uint32_t primask) {
    /* 恢复中断状态 */
    __set_PRIMASK(primask);
}

#endif /* USE_MINIMAL_RTOS_FEATURES */

/* 事件驱动架构 */
#if USE_EVENT_DRIVEN_ARCH

/* 简化的事件系统 */
typedef struct {
    uint8_t type;
    void *data;
    uint16_t size;
} Event_t;

#define MAX_EVENTS 16

static Event_t event_queue[MAX_EVENTS];
static uint8_t event_head = 0;
static uint8_t event_tail = 0;
static uint8_t event_count = 0;

bool event_post(uint8_t type, void *data, uint16_t size) {
    if (event_count >= MAX_EVENTS) return false;
    
    Event_t *event = &event_queue[event_tail];
    event->type = type;
    event->data = data;
    event->size = size;
    
    event_tail = (event_tail + 1) % MAX_EVENTS;
    event_count++;
    
    return true;
}

bool event_process(void) {
    if (event_count == 0) return false;
    
    Event_t *event = &event_queue[event_head];
    
    /* 调用事件处理器 */
    switch (event->type) {
        case EVENT_TYPE_UART_RX:
            handle_uart_event(event->data, event->size);
            break;
        case EVENT_TYPE_ADC_DONE:
            handle_adc_event(event->data, event->size);
            break;
        case EVENT_TYPE_TIMER:
            handle_timer_event(event->data, event->size);
            break;
        default:
            break;
    }
    
    event_head = (event_head + 1) % MAX_EVENTS;
    event_count--;
    
    return true;
}

#endif /* USE_EVENT_DRIVEN_ARCH */

/* 合作式调度器 */
#if USE_COOPERATIVE_SCHEDULER

typedef void (*TaskFunc_t)(void);

typedef struct {
    TaskFunc_t function;
    const char *name;
    uint32_t interval_ms;
    uint32_t last_run;
    uint32_t run_time_us;
    uint32_t run_count;
    uint8_t priority;
} SchedulerTask_t;

#define MAX_TASKS 8

static SchedulerTask_t tasks[MAX_TASKS];
static uint8_t task_count = 0;

bool scheduler_add_task(TaskFunc_t func, const char *name, 
                       uint32_t interval_ms, uint8_t priority) {
    if (task_count >= MAX_TASKS) return false;
    
    SchedulerTask_t *task = &tasks[task_count];
    task->function = func;
    task->name = name;
    task->interval_ms = interval_ms;
    task->last_run = 0;
    task->priority = priority;
    task->run_time_us = 0;
    task->run_count = 0;
    
    task_count++;
    return true;
}

void scheduler_run(void) {
    uint32_t current_time = system_tick_ms;
    uint32_t start_time, end_time;
    
    /* 按优先级排序(简化实现) */
    for (uint8_t i = 0; i < task_count - 1; i++) {
        for (uint8_t j = i + 1; j < task_count; j++) {
            if (tasks[i].priority > tasks[j].priority) {
                SchedulerTask_t temp = tasks[i];
                tasks[i] = tasks[j];
                tasks[j] = temp;
            }
        }
    }
    
    /* 执行任务 */
    for (uint8_t i = 0; i < task_count; i++) {
        SchedulerTask_t *task = &tasks[i];
        
        if ((current_time - task->last_run) >= task->interval_ms) {
            start_time = get_microseconds();
            
            task->function();
            
            end_time = get_microseconds();
            task->run_time_us += (end_time - start_time);
            task->run_count++;
            task->last_run = current_time;
        }
    }
}

#endif /* USE_COOPERATIVE_SCHEDULER */

/* 主应用程序 */
int main(void) {
    /* 硬件初始化 */
    system_clock_init();
    peripherals_init();
    
    /* 调度器初始化 */
    #if USE_COOPERATIVE_SCHEDULER
    scheduler_add_task(task_led, "LED", 500, 10);
    scheduler_add_task(task_sensor, "Sensor", 100, 5);
    scheduler_add_task(task_display, "Display", 200, 8);
    scheduler_add_task(task_uart, "UART", 10, 3);
    #endif
    
    /* 主循环 */
    while (1) {
        #if USE_EVENT_DRIVEN_ARCH
        /* 处理事件 */
        while (event_process()) {
            /* 处理所有待处理事件 */
        }
        #endif
        
        #if USE_COOPERATIVE_SCHEDULER
        /* 运行调度器 */
        scheduler_run();
        #else
        /* 传统超级循环 */
        task_led();
        task_sensor();
        task_display();
        task_uart();
        #endif
        
        /* 低功耗处理 */
        if (idle_condition()) {
            enter_low_power_mode();
        }
        
        /* 短暂延时 */
        delay_us(100);
    }
    
    return 0;
}

5.3 性能优化技巧

5.3.1 内存优化

c

/* 内存优化技巧 */

/* 1. 使用位域节省空间 */
typedef struct {
    uint8_t led_state : 1;      /* 1位 */
    uint8_t button_pressed : 1; /* 1位 */
    uint8_t alarm_active : 1;   /* 1位 */
    uint8_t sensor_ready : 1;   /* 1位 */
    uint8_t uart_busy : 1;      /* 1位 */
    uint8_t reserved : 3;       /* 3位保留 */
} SystemFlags_t;                /* 总共1字节 */

/* 2. 使用联合体节省内存 */
typedef union {
    struct {
        uint8_t temperature;
        uint8_t humidity;
        uint16_t pressure;
        uint32_t timestamp;
    } data;
    
    uint8_t raw[8];  /* 原始字节访问 */
} SensorData_t;

/* 3. 内存池管理 */
#define MEM_POOL_SIZE 1024
#define BLOCK_SIZE 32
#define BLOCK_COUNT (MEM_POOL_SIZE / BLOCK_SIZE)

typedef struct {
    uint8_t pool[MEM_POOL_SIZE];
    uint8_t bitmap[BLOCK_COUNT / 8];  /* 位图管理 */
} MemoryPool_t;

void *mem_pool_alloc(MemoryPool_t *pool) {
    for (uint16_t i = 0; i < BLOCK_COUNT; i++) {
        uint8_t byte_idx = i / 8;
        uint8_t bit_idx = i % 8;
        
        if (!(pool->bitmap[byte_idx] & (1 << bit_idx))) {
            pool->bitmap[byte_idx] |= (1 << bit_idx);
            return &pool->pool[i * BLOCK_SIZE];
        }
    }
    return NULL;
}

void mem_pool_free(MemoryPool_t *pool, void *ptr) {
    uint32_t offset = (uint8_t *)ptr - pool->pool;
    uint16_t block_idx = offset / BLOCK_SIZE;
    
    uint8_t byte_idx = block_idx / 8;
    uint8_t bit_idx = block_idx % 8;
    
    pool->bitmap[byte_idx] &= ~(1 << bit_idx);
}

/* 4. 栈使用优化 */
/* - 减少函数调用深度 */
/* - 使用静态局部变量减少栈分配 */
/* - 避免大数组作为局部变量 */
5.3.2 执行效率优化

c

/* 执行效率优化 */

/* 1. 使用查表代替计算 */
const uint16_t sine_table[256] = {
    2048, 2073, 2098, 2123, 2148, 2174, 2199, 2224,
    /* ... 完整正弦表 ... */
};

uint16_t fast_sin(uint8_t angle) {
    return sine_table[angle];  /* 快速正弦计算 */
}

/* 2. 循环展开 */
void process_data_fast(uint8_t *data, uint32_t len) {
    uint32_t i;
    
    /* 每次处理4个字节 */
    for (i = 0; i < len - 3; i += 4) {
        data[i] = process_byte(data[i]);
        data[i+1] = process_byte(data[i+1]);
        data[i+2] = process_byte(data[i+2]);
        data[i+3] = process_byte(data[i+3]);
    }
    
    /* 处理剩余字节 */
    for (; i < len; i++) {
        data[i] = process_byte(data[i]);
    }
}

/* 3. 使用内联函数 */
static inline uint32_t calculate_checksum(const uint8_t *data, uint32_t len) {
    uint32_t sum = 0;
    for (uint32_t i = 0; i < len; i++) {
        sum += data[i];
    }
    return sum;
}

/* 4. 中断优化 */
void optimized_isr(void) {
    /* 快速进出中断 */
    __disable_irq();
    
    /* 只做必要的处理 */
    volatile uint32_t status = read_status_register();
    
    if (status & STATUS_FLAG) {
        /* 设置标志,在主循环中处理 */
        event_flag = true;
    }
    
    __enable_irq();
}

/* 5. DMA优化 */
void dma_transfer_optimized(void *src, void *dst, uint32_t size) {
    /* 配置DMA */
    dma_config_t config = {
        .src_addr = (uint32_t)src,
        .dst_addr = (uint32_t)dst,
        .size = size,
        .mode = DMA_MODE_NORMAL,
        .irq_enable = true
    };
    
    dma_start(&config);
    
    /* 等待DMA完成(非阻塞) */
    while (!dma_transfer_complete()) {
        /* 可以在这里做其他事情 */
        process_background_tasks();
    }
}

六、实战项目案例

6.1 智能家居控制器(裸机实现)

c

/**
 * @file    smart_home_controller.c
 * @brief   智能家居控制器(裸机实现)
 * @version 8.0
 * @date    2024-01-15
 */

#include <stdint.h>
#include <stdbool.h>
#include <string.h>

/* 系统配置 */
#define SYSTEM_TICK_HZ     1000    /* 系统时钟频率 */
#define MAX_DEVICES        8       /* 最大设备数量 */
#define MAX_SCHEDULES      16      /* 最大定时任务 */
#define TEMP_HYSTERESIS    0.5f    /* 温度迟滞 */

/* 设备类型 */
typedef enum {
    DEVICE_TYPE_LIGHT = 0,
    DEVICE_TYPE_OUTLET,
    DEVICE_TYPE_THERMOSTAT,
    DEVICE_TYPE_CURTAIN,
    DEVICE_TYPE_SECURITY
} DeviceType_t;

/* 设备状态 */
typedef enum {
    DEVICE_STATE_OFF = 0,
    DEVICE_STATE_ON,
    DEVICE_STATE_AUTO,
    DEVICE_STATE_ERROR
} DeviceState_t;

/* 定时任务 */
typedef struct {
    uint8_t device_id;
    uint32_t schedule_time;      /* 计划时间(分钟从0点开始) */
    DeviceState_t target_state;
    bool enabled;
    uint8_t days_of_week;        /* 位掩码:0=周日,1=周一... */
} Schedule_t;

/* 设备控制 */
typedef struct {
    DeviceType_t type;
    DeviceState_t state;
    DeviceState_t auto_state;    /* 自动模式下的目标状态 */
    float current_value;         /* 当前值(温度、亮度等) */
    float target_value;          /* 目标值 */
    uint32_t last_update;
    uint8_t gpio_pin;
    const char *name;
} Device_t;

/* 系统状态 */
typedef struct {
    Device_t devices[MAX_DEVICES];
    Schedule_t schedules[MAX_SCHEDULES];
    uint8_t device_count;
    uint8_t schedule_count;
    
    /* 环境参数 */
    float indoor_temperature;
    float outdoor_temperature;
    float humidity;
    uint16_t light_level;
    
    /* 系统状态 */
    bool system_armed;           /* 安防系统布防 */
    uint8_t error_code;
    uint32_t uptime_minutes;
    uint32_t last_sync_time;
    
    /* 通信 */
    bool wifi_connected;
    bool mqtt_connected;
    char last_command[64];
} System_t;

static System_t system_state;
static volatile uint32_t system_tick_ms = 0;

/* SysTick中断 */
void SysTick_Handler(void) {
    system_tick_ms++;
}

/* 设备管理 */
uint8_t device_add(DeviceType_t type, const char *name, uint8_t gpio_pin) {
    if (system_state.device_count >= MAX_DEVICES) {
        return 0xFF;  /* 错误:设备已满 */
    }
    
    Device_t *device = &system_state.devices[system_state.device_count];
    device->type = type;
    device->state = DEVICE_STATE_OFF;
    device->auto_state = DEVICE_STATE_OFF;
    device->current_value = 0.0f;
    device->target_value = 0.0f;
    device->last_update = system_tick_ms;
    device->gpio_pin = gpio_pin;
    device->name = name;
    
    /* 初始化GPIO */
    gpio_init(device->gpio_pin, GPIO_MODE_OUTPUT);
    gpio_write(device->gpio_pin, 0);  /* 初始关闭 */
    
    return system_state.device_count++;  /* 返回设备ID */
}

bool device_control(uint8_t device_id, DeviceState_t state, float value) {
    if (device_id >= system_state.device_count) {
        return false;
    }
    
    Device_t *device = &system_state.devices[device_id];
    device->state = state;
    device->target_value = value;
    device->last_update = system_tick_ms;
    
    switch (state) {
        case DEVICE_STATE_ON:
            gpio_write(device->gpio_pin, 1);
            device->current_value = value;
            break;
            
        case DEVICE_STATE_OFF:
            gpio_write(device->gpio_pin, 0);
            device->current_value = 0.0f;
            break;
            
        case DEVICE_STATE_AUTO:
            /* 自动模式,根据目标值控制 */
            device_auto_control(device_id);
            break;
            
        default:
            return false;
    }
    
    return true;
}

/* 设备自动控制 */
void device_auto_control(uint8_t device_id) {
    Device_t *device = &system_state.devices[device_id];
    
    switch (device->type) {
        case DEVICE_TYPE_THERMOSTAT:
            /* 温控器自动控制 */
            if (system_state.indoor_temperature < 
                (device->target_value - TEMP_HYSTERESIS)) {
                gpio_write(device->gpio_pin, 1);  /* 加热 */
                device->current_value = 100.0f;    /* 100%功率 */
            } else if (system_state.indoor_temperature > 
                      (device->target_value + TEMP_HYSTERESIS)) {
                gpio_write(device->gpio_pin, 0);  /* 关闭加热 */
                device->current_value = 0.0f;
            }
            break;
            
        case DEVICE_TYPE_LIGHT:
            /* 灯光自动控制 */
            if (system_state.light_level < device->target_value) {
                gpio_write(device->gpio_pin, 1);  /* 打开灯光 */
                device->current_value = 100.0f;
            } else {
                gpio_write(device->gpio_pin, 0);  /* 关闭灯光 */
                device->current_value = 0.0f;
            }
            break;
            
        default:
            /* 其他设备保持当前状态 */
            break;
    }
}

/* 定时任务管理 */
uint8_t schedule_add(uint8_t device_id, uint32_t time_minutes, 
                    DeviceState_t target_state, uint8_t days_mask) {
    if (system_state.schedule_count >= MAX_SCHEDULES) {
        return 0xFF;
    }
    
    Schedule_t *schedule = &system_state.schedules[system_state.schedule_count];
    schedule->device_id = device_id;
    schedule->schedule_time = time_minutes;
    schedule->target_state = target_state;
    schedule->days_of_week = days_mask;
    schedule->enabled = true;
    
    return system_state.schedule_count++;
}

/* 定时任务检查 */
void schedule_check(void) {
    static uint32_t last_check_minute = 0;
    uint32_t current_minute = system_state.uptime_minutes % (24 * 60);
    
    if (current_minute == last_check_minute) {
        return;  /* 同一分钟不重复检查 */
    }
    
    last_check_minute = current_minute;
    uint8_t day_of_week = (system_state.uptime_minutes / (24 * 60)) % 7;
    
    for (uint8_t i = 0; i < system_state.schedule_count; i++) {
        Schedule_t *schedule = &system_state.schedules[i];
        
        if (!schedule->enabled) continue;
        
        /* 检查时间匹配 */
        if (schedule->schedule_time == current_minute) {
            /* 检查星期匹配 */
            if (schedule->days_of_week & (1 << day_of_week)) {
                /* 执行定时任务 */
                device_control(schedule->device_id, 
                              schedule->target_state, 0);
                
                uart_printf("Schedule executed: Device %d -> State %d\r\n",
                           schedule->device_id, schedule->target_state);
            }
        }
    }
}

/* 传感器读取 */
void sensor_update(void) {
    static uint32_t last_sensor_update = 0;
    
    /* 每5秒更新一次传感器数据 */
    if (system_tick_ms - last_sensor_update < 5000) {
        return;
    }
    
    last_sensor_update = system_tick_ms;
    
    /* 读取温度传感器(模拟) */
    system_state.indoor_temperature = read_temperature_sensor();
    
    /* 读取光敏传感器 */
    system_state.light_level = read_light_sensor();
    
    /* 读取湿度传感器 */
    system_state.humidity = read_humidity_sensor();
    
    /* 自动控制设备 */
    for (uint8_t i = 0; i < system_state.device_count; i++) {
        if (system_state.devices[i].state == DEVICE_STATE_AUTO) {
            device_auto_control(i);
        }
    }
}

/* 通信处理 */
void communication_process(void) {
    static uint8_t rx_buffer[128];
    static uint16_t rx_index = 0;
    
    /* 处理UART接收 */
    while (uart_available()) {
        uint8_t data = uart_read();
        
        if (data == '\n' || data == '\r') {
            if (rx_index > 0) {
                rx_buffer[rx_index] = '\0';
                process_command((char *)rx_buffer);
                rx_index = 0;
            }
        } else if (rx_index < sizeof(rx_buffer) - 1) {
            rx_buffer[rx_index++] = data;
        }
    }
    
    /* 处理网络通信 */
    if (system_state.wifi_connected) {
        mqtt_process();
        http_process();
    }
}

/* 命令处理 */
void process_command(const char *command) {
    char cmd[32];
    uint8_t device_id;
    float value;
    
    strncpy(system_state.last_command, command, 
            sizeof(system_state.last_command) - 1);
    
    if (sscanf(command, "%31s %hhu %f", cmd, &device_id, &value) >= 2) {
        if (strcmp(cmd, "on") == 0) {
            device_control(device_id, DEVICE_STATE_ON, value);
            uart_printf("Device %d turned ON\r\n", device_id);
        } else if (strcmp(cmd, "off") == 0) {
            device_control(device_id, DEVICE_STATE_OFF, 0);
            uart_printf("Device %d turned OFF\r\n", device_id);
        } else if (strcmp(cmd, "auto") == 0) {
            device_control(device_id, DEVICE_STATE_AUTO, value);
            uart_printf("Device %d set to AUTO (target: %.1f)\r\n", 
                       device_id, value);
        } else if (strcmp(cmd, "temp") == 0) {
            system_state.indoor_temperature = value;
            uart_printf("Temperature set to %.1f\r\n", value);
        } else {
            uart_printf("Unknown command: %s\r\n", cmd);
        }
    } else if (strcmp(command, "status") == 0) {
        display_status();
    } else if (strcmp(command, "help") == 0) {
        display_help();
    } else {
        uart_printf("Invalid command format\r\n");
    }
}

/* 状态显示 */
void display_status(void) {
    uart_printf("\r\n=== Smart Home Status ===\r\n");
    uart_printf("Uptime: %lu minutes\r\n", system_state.uptime_minutes);
    uart_printf("Indoor Temp: %.1f°C\r\n", system_state.indoor_temperature);
    uart_printf("Humidity: %.1f%%\r\n", system_state.humidity);
    uart_printf("Light Level: %d lux\r\n", system_state.light_level);
    uart_printf("Devices: %d/%d\r\n", system_state.device_count, MAX_DEVICES);
    uart_printf("Schedules: %d/%d\r\n", system_state.schedule_count, MAX_SCHEDULES);
    uart_printf("WiFi: %s\r\n", system_state.wifi_connected ? "Connected" : "Disconnected");
    uart_printf("MQTT: %s\r\n", system_state.mqtt_connected ? "Connected" : "Disconnected");
    
    uart_printf("\r\nDevice List:\r\n");
    for (uint8_t i = 0; i < system_state.device_count; i++) {
        Device_t *device = &system_state.devices[i];
        const char *state_str;
        
        switch (device->state) {
            case DEVICE_STATE_ON: state_str = "ON"; break;
            case DEVICE_STATE_OFF: state_str = "OFF"; break;
            case DEVICE_STATE_AUTO: state_str = "AUTO"; break;
            default: state_str = "ERROR"; break;
        }
        
        uart_printf("  %d. %s: %s (%.1f)\r\n", 
                   i, device->name, state_str, device->current_value);
    }
}

/* 主循环 */
int main(void) {
    /* 系统初始化 */
    system_clock_init();
    uart_init(115200);
    gpio_init_all();
    adc_init();
    i2c_init();
    
    /* 初始化系统状态 */
    memset(&system_state, 0, sizeof(system_state));
    
    /* 添加设备 */
    device_add(DEVICE_TYPE_LIGHT, "Living Room Light", GPIO_PIN_5);
    device_add(DEVICE_TYPE_OUTLET, "TV Outlet", GPIO_PIN_6);
    device_add(DEVICE_TYPE_THERMOSTAT, "Heater", GPIO_PIN_7);
    device_add(DEVICE_TYPE_LIGHT, "Bedroom Light", GPIO_PIN_8);
    
    /* 添加定时任务 */
    schedule_add(0, 7 * 60, DEVICE_STATE_ON, 0x7F);   /* 每天7:00开灯 */
    schedule_add(0, 23 * 60, DEVICE_STATE_OFF, 0x7F); /* 每天23:00关灯 */
    schedule_add(2, 6 * 60, DEVICE_STATE_ON, 0x3E);   /* 工作日6:00开暖气 */
    
    /* 欢迎信息 */
    uart_printf("\r\nSmart Home Controller v1.0\r\n");
    uart_printf("Type 'help' for commands\r\n");
    
    /* 主循环 */
    while (1) {
        /* 更新系统时间 */
        static uint32_t last_minute_update = 0;
        if (system_tick_ms - last_minute_update >= 60000) {
            system_state.uptime_minutes++;
            last_minute_update = system_tick_ms;
        }
        
        /* 传感器更新 */
        sensor_update();
        
        /* 定时任务检查 */
        schedule_check();
        
        /* 通信处理 */
        communication_process();
        
        /* 系统监控 */
        system_monitor();
        
        /* 空闲时进入低功耗模式 */
        if (system_idle()) {
            enter_sleep_mode();
        }
        
        /* 短暂延时 */
        delay_ms(10);
    }
    
    return 0;
}

七、总结与展望

7.1 裸机开发的未来

尽管RTOS在复杂系统中越来越流行,但裸机开发在以下领域仍具有不可替代的优势:

  1. 超低功耗设备:物联网边缘节点、可穿戴设备

  2. 安全关键系统:汽车电子、医疗设备(需要认证)

  3. 成本敏感产品:消费电子、小家电

  4. 极简应用:传感器接口、简单控制器

7.2 发展趋势

  1. 混合架构兴起:裸机+微内核的混合方案

  2. 工具链完善:更好的裸机开发框架和调试工具

  3. 硬件加速:专用硬件处理原本需要RTOS的功能

  4. AI集成:边缘AI计算与裸机系统的结合

7.3 学习建议

  1. 初学者:从裸机开始,理解底层原理

  2. 中级工程师:掌握状态机和事件驱动框架

  3. 高级工程师:深入理解RTOS,掌握混合架构设计

  4. 专家级:能够根据项目需求设计定制化的系统架构

7.4 最终建议

选择裸机还是RTOS,不应是信仰之争,而应是基于实际需求的理性选择:

  • 选择裸机:当你需要极致性能、最低功耗、最小成本时

  • 选择RTOS:当你需要复杂功能、团队协作、长期维护时

  • 选择混合:当你需要在资源受限下实现复杂功能时

记住,最好的工具是能够解决实际问题的工具。无论是裸机的简洁高效,还是RTOS的强大功能,都是嵌入式工程师工具箱中的重要武器。掌握两者,并能在适当的时候选择适当的技术,才是真正的专家之道。


致读者
嵌入式开发的世界丰富多彩,既有裸机开发的返璞归真之美,也有RTOS的现代工程之力。希望本文能为你提供有价值的参考,在你的嵌入式开发旅程中有所帮助。无论选择哪条道路,都愿你在这条充满挑战与乐趣的道路上越走越远,创造出让世界变得更美好的产品。

编码快乐! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小范好好学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值