嵌入式单线程编程模型的整理
一、核心分类与定义
嵌入式单线程编程模型基于驱动方式分为轮询驱动、事件驱动及混合驱动,适用于裸机系统或操作系统中的单线程环境,核心区别在于上层与下层的交互方式(主动询问 / 被动通知)。
二、轮询驱动(Polling-driven)
- 核心逻辑:上层主动询问下层(硬件 / 组件)状态(同步调用,call 模式),需周期性检查状态。
- 分类及特点:
繁忙等待轮询
- 最简单实现:发起请求后,通过
while
循环持续检查状态直至完成。 - 缺点:CPU 空转,时钟与电量浪费严重,无并发能力。
low_level_request(); while(!low_level_is_done()); // 持续阻塞直至完成
- 最简单实现:发起请求后,通过
休眠轮询
- 对繁忙等待的优化:轮询间隙休眠(如利用硬件低功耗模式),降低功耗。
- 特点:保持简单性,仍为单任务阻塞模式,无并发。
low_level_request(); while(!low_level_is_done()) {sleep_for_moment(); // 休眠减少空转 }
并发轮询
- 多外设并行处理:通过状态机管理多个独立任务,主循环依次轮询各任务状态,完成后触发后续操作。
- 特点:支持并发,提高效率,但需维护状态机,复杂度略高。
a_request(); b_request(); c_request(); // 同时发起多请求 while(1) {if(a_done()) a_next(); // 轮询A并处理if(b_done()) b_next(); // 轮询B并处理if(c_done()) c_next(); // 轮询C并处理 }
休眠并发轮询
- 并发轮询的优化:所有任务轮询后休眠,进一步降低功耗。
- 特点:兼顾并发与低功耗,需硬件支持唤醒机制(如 Cortex-M 的 SEVONPEND)。
三、事件驱动(Event-driven)
- 核心逻辑:下层完成操作后主动通知上层(异步回调,callback 模式),无需轮询,依赖中断或状态触发。
- 分类及特点:
基于事件调度器的回调
- 引入事件队列:中断服务例程(ISR)将回调函数压入队列,主循环从队列中取出并执行回调。
- 特点:解耦硬件中断与业务逻辑,支持多事件并发,复杂度最高。
void a_isr() { event_queue_push(a_callback); } // ISR压入回调 int main() {a_request(a_callback); // 注册回调while(1) {if(queue_not_empty()) {cb = queue_pop(); cb(); // 执行回调}} }
各管各的回调
- 无事件队列:组件完成操作后直接调用注册的回调函数(如 lwIP)。
- 特点:无需依赖调度器,实现简单,适用于轻量场景。
int main() {a_request(a_callback); // 注册回调while(1) {a_process(); // 处理请求,完成后直接调用a_callback} }
混合回调
- 部分组件用事件调度器,部分直接回调,灵活适配不同场景。
四、混合驱动(Polling + Event)
- 核心逻辑:结合轮询与事件驱动的优势,不同组件或层次采用不同模型(如底层轮询、上层事件)。
- 示例:某系统中,外设 A 用直接回调,外设 B 用事件队列,外设 C 用并发轮询。
int main() {a_request(a_callback); b_request(b_callback); c_request();while(1) {a_process(); // A直接回调if(queue_not_empty()) { cb = queue_pop(); cb(); } // B事件调度if(c_done()) c_next(); // C并发轮询}
}
五、关键对比与总结
模型 | 难易度 | 空闲休眠 | 并发能力 | 能效比 | 同步 / 异步 |
---|---|---|---|---|---|
繁忙等待轮询 | 最简单 | 否 | 无 | 最低 | 同步阻塞 |
休眠轮询 | 较简单 | 是 | 无 | 较低 | 同步阻塞 |
并发轮询 | 较复杂 | 否 | 有 | 较低 | 同步非阻塞 |
休眠并发轮询 | 较复杂 | 是 | 有 | 较高 | 同步非阻塞 |
事件调度器回调 | 最复杂 | 是 | 有 | 高 | 异步 |
各管各的回调 | 较复杂 | 是 | 有 | 高 | 异步 |
- 核心结论:
- 轮询驱动适合简单场景,同步性强但效率较低;
- 事件驱动适合复杂并发场景,异步性强且能效高;
- 混合驱动为实际工程中最常用方式,兼顾灵活性与效率。
- 中断是硬件级事件,是事件驱动的重要触发源。