裸机模拟多任务的核心是**协作式调度**:用一个主循环+任务状态机,按优先级或时间片轮流执行非阻塞任务。关键点:
1. **任务函数化**:每个任务写成`void task_x(void)`,内部用状态机或`switch-case`分段执行,避免长阻塞(如`delay`改为非阻塞计时)。
2. **调度器**:简单轮询或优先级数组,例如:
```c
void scheduler(void) {
while(1) {
task_led(); // 非阻塞
task_uart(); // 非阻塞
task_key(); // 非阻塞
}
}
```
3. **时间片**:用系统tick(如SysTick中断)递增全局`volatile uint32_t g_tick`,任务内比较时间戳实现延时。
4. **状态机示例**:
```c
void task_led(void) {
static uint8_t state=0;
static uint32_t last=g_tick;
if(g_tick-last>=500) {
last=g_tick;
state^=1;
GPIO_Toggle(LED);
}
}
```
实操建议:先画任务时序图,确保每个任务最坏执行时间远小于调度周期;用`volatile`保护共享变量;若任务多,可引入简单优先级数组或查表法。避免使用`while(1)`空转,所有等待改为状态查询。
mcuku 阿沐 · 2026-08-20