第二章 嵌入式系统基础:MCU选型与架构、RTOS在医疗贴片中的应用、低功耗设计原则
各位同学,大家好。这一章我们聊聊嵌入式系统的基础,但我会尽量讲得「接地气」一点。毕竟医疗贴片这东西,体积小、功耗敏感、安全要求高,选错一个MCU或者RTOS,后面可能全盘皆输。
2.1 MCU选型与架构:别只看主频
很多人选MCU,第一眼看主频。嗯,这其实是个坑。医疗贴片不是跑桌面应用,它要的是「刚刚好」的性能,加上极致的低功耗和安全性。
我个人习惯,先看这几个维度:
- 内核架构:ARM Cortex-M系列是主流,M0+适合超低功耗,M4/M7适合需要DSP或浮点运算的场景。RISC-V也在崛起,但生态还不够成熟,我建议谨慎。
- 存储资源:Flash和SRAM要够用,但别浪费。我在项目中遇到过,选了256KB Flash的芯片,结果固件只用了30KB,白白多花了成本。
- 外设集成:ADC、DAC、SPI、I2C、UART这些是标配。但医疗贴片往往需要内置运放或模拟前端,比如TI的AFE系列,能省掉很多外部器件。
- 安全特性:硬件加密引擎、安全启动、TrustZone(如果Cortex-M23/M33支持)。这些不是可选项,是必选项。你想想看,如果贴片被攻击,篡改给药剂量,后果是什么?
避坑指南:我曾经选了一款没有硬件加密的MCU,结果产品送审时被FDA要求增加安全芯片,整个方案重做,损失惨重。所以,安全特性要提前规划。
下面是一个简单的MCU选型对比表,供参考:
| 特性 | Cortex-M0+ | Cortex-M4 | Cortex-M33 |
|---|---|---|---|
| 典型主频 | 48 MHz | 100-200 MHz | 100-200 MHz |
| 功耗 | 极低 | 中等 | 低 |
| DSP/FPU | 无 | 有 | 有(可选) |
| 安全特性 | 基本 | 基本 | TrustZone + 硬件加密 |
| 适用场景 | 简单传感器采集 | 信号处理、算法 | 安全敏感型医疗设备 |
2.2 RTOS在医疗贴片中的应用:别为了用而用
RTOS(实时操作系统)在医疗贴片里到底要不要上?我的答案是:看任务复杂度。
如果只是单任务轮询,比如每隔1秒读一次温度,那裸机就够了。但一旦涉及多个传感器、无线通信、数据加密、电池管理……裸机就会变得非常痛苦。你想想看,要手动管理所有任务的时序,还要处理优先级反转,那代码写出来自己都怕。
我建议,当任务数超过3个,或者有严格实时性要求(比如心电信号采样必须精确到毫秒级),就上RTOS。
常用的RTOS有:
- FreeRTOS:开源、轻量、生态好。医疗贴片首选。
- Zephyr:支持更多安全特性,但资源占用稍大。
- RT-Thread:国产,中文文档友好,适合快速开发。
下面是一个FreeRTOS在医疗贴片中的典型任务划分示例:
// 伪代码:医疗贴片任务划分
void task_sensor(void *pvParameters) {
while(1) {
read_ecg(); // 读取心电数据
vTaskDelay(pdMS_TO_TICKS(10)); // 10ms周期
}
}
void task_encrypt(void *pvParameters) {
while(1) {
xQueueReceive(encrypt_queue, &data, portMAX_DELAY);
aes_encrypt(&data); // 硬件加密
xQueueSend(tx_queue, &data, 0);
}
}
void task_ble(void *pvParameters) {
while(1) {
xQueueReceive(tx_queue, &data, portMAX_DELAY);
ble_send(&data); // 蓝牙发送
}
}
void task_watchdog(void *pvParameters) {
while(1) {
vTaskDelay(pdMS_TO_TICKS(1000));
check_heartbeat(); // 检查各任务是否正常
}
}
小技巧:RTOS的任务栈大小要仔细算。我见过一个项目,因为栈分配太小,导致任务跑着跑着就崩了,查了三天才发现是栈溢出。建议每个任务至少分配512字节,复杂任务可以到1024字节。
2.3 低功耗设计原则:从硬件到软件,一个都不能少
医疗贴片通常靠纽扣电池供电,可能要用几个月甚至一年。低功耗不是「锦上添花」,而是「生死存亡」。说白了,功耗降不下来,产品就废了。
硬件层面:
- 选低功耗MCU:比如STM32L系列、EFM32系列,都有多种睡眠模式。
- 电源管理:用DC-DC转换器代替LDO,效率能高20%以上。
- 外设选型:传感器、无线芯片都要选低功耗型号。比如BLE芯片,nRF52840的功耗就比CC2640低不少。
软件层面:
- 事件驱动:别用轮询,用中断唤醒。MCU大部分时间处于睡眠模式,只有事件发生时才会唤醒。
- 动态频率调整:任务不忙时,降低主频。比如从48MHz降到16MHz,功耗能降一半。
- 关闭未用外设:不用的ADC、SPI、UART,记得在初始化后关闭时钟。我见过有人忘了关,白白多耗了2mA。
警告:低功耗设计时,别忘了唤醒时间。有些MCU从深度睡眠唤醒需要几百微秒,如果任务周期很短,反而更耗电。我曾经踩过这个坑,后来改用「浅睡眠+快速唤醒」模式才解决。
下面是一个典型的低功耗工作流程:
// 低功耗主循环示例
void main() {
// 初始化硬件
init_mcu();
init_sensors();
init_ble();
while(1) {
// 进入睡眠模式
enter_sleep_mode(); // 电流降至几微安
// 等待中断唤醒(比如定时器或传感器中断)
__WFI(); // Wait For Interrupt
// 唤醒后处理事件
process_event();
// 处理完继续睡
}
}
嗯,这里要注意:睡眠模式的选择。Cortex-M系列通常有:
- Sleep模式:CPU停止,外设继续工作。唤醒快,但功耗较高。
- Deep Sleep模式:CPU和外设都停止,只有RTC或特定唤醒源能唤醒。功耗极低,但唤醒慢。
- Standby模式:几乎全部关闭,只有备份寄存器保留。功耗最低,但唤醒后相当于复位。
我个人习惯,在医疗贴片里用Deep Sleep模式,配合RTC定时唤醒,既能保证低功耗,又能满足周期性数据采集的需求。
最后,总结一下这一章的核心:
- MCU选型要兼顾性能、功耗、安全,别只看主频。
- RTOS不是必须的,但任务复杂时能帮你省很多事。
- 低功耗要从硬件和软件两个层面同时入手,缺一不可。
下一章,我们会深入聊聊医疗贴片的传感器接口与信号调理,到时候见。