第三章:起搏器任务模型
好,咱们今天聊聊起搏器里的任务模型。说实话,这是整个系统设计的基石。你想想看,一个起搏器要同时干好几件事——感知心跳、发放脉冲、自我诊断、跟外界通信,还得省电。这么多活儿,怎么安排?
我个人习惯,先把任务分清楚。起搏器里典型的任务,我归纳为五类:感知任务、起搏任务、诊断任务、通信任务、低功耗管理任务。咱们一个一个说。
3.1 感知任务
感知任务,说白了就是「听心跳」。它负责实时监测心内电信号,判断有没有自主心跳。
这个任务优先级最高。为什么?因为一旦漏掉一次心跳,起搏器可能错误地发放脉冲,造成竞争心律。我在项目中遇到过,感知窗口设置得太窄,结果把正常P波给漏了,病人出现心悸。嗯,从那以后我特别强调感知窗口的余量。
关键参数:
- 感知灵敏度:通常0.5-2.5 mV,可程控
- 感知窗口:心房100-200ms,心室150-300ms
- 不应期:心房150-250ms,心室200-350ms
感知任务的执行周期,一般是8-16ms。太快了没必要,太慢了会丢事件。我建议用8ms周期,配合硬件比较器做第一级滤波。
3.2 起搏任务
起搏任务,就是「发脉冲」。当感知任务发现没有自主心跳,起搏任务就要上场了。
这个任务的时序要求极其严格。你想想看,脉冲宽度0.4-1.0ms,幅度0.5-5.0V,误差必须控制在±2%以内。我见过一个案例,脉冲宽度漂移了5%,结果夺获阈值升高,起搏失效。
注意:起搏任务不能跟感知任务同时执行。否则脉冲会烧坏感知放大器。硬件上必须有互锁机制,软件上也要做时序避让。
起搏任务的触发条件很简单:感知超时。比如VVI模式下,如果心室感知窗口内没有R波,就触发一次心室起搏。这个超时时间,就是起搏间期,通常600-1200ms。
3.3 诊断任务
诊断任务,我管它叫「自检员」。它负责检查电池电压、电极阻抗、起搏阈值、感知幅度等等。
这个任务不需要实时执行。一般每8小时或者24小时跑一次。但要注意,诊断任务执行时会占用系统总线,可能影响其他任务。我建议把诊断任务放在系统空闲时段,比如深夜。
| 诊断项目 | 周期 | 耗时 | 优先级 |
|---|---|---|---|
| 电池电压检测 | 1小时 | 10ms | 低 |
| 电极阻抗测量 | 24小时 | 50ms | 低 |
| 起搏阈值测试 | 1个月 | 2s | 极低 |
| 感知幅度测试 | 1个月 | 1s | 极低 |
诊断任务还有一个重要功能——记录事件日志。比如发生过多少次室速、多少次起搏失败。这些数据对医生调整参数很有帮助。
3.4 通信任务
通信任务,就是跟体外程控仪「聊天」。现在主流用的是MICS频段,402-405MHz。
这个任务比较特殊。它只在需要的时候才激活,平时处于休眠状态。通信时,功耗会飙升到10-20mA,是正常工作的100倍。所以通信时间要尽量短,我一般控制在100ms以内。
经验之谈:通信任务要设计超时保护。我曾经遇到过,程控仪断连后,通信任务一直占用CPU,导致起搏任务被饿死。后来加了看门狗定时器,5秒无响应就强制退出。
通信任务的优先级,我建议设为中等。比感知和起搏低,但比诊断和低功耗管理高。因为通信涉及病人安全参数调整,不能太慢。
3.5 低功耗管理任务
低功耗管理任务,我称之为「管家」。它负责控制系统的功耗状态。
起搏器大部分时间处于休眠状态。只有感知任务在运行,其他任务都挂着。低功耗管理任务会监控电池电量,动态调整工作模式。
举个例子:当电池电压低于2.5V时,系统进入省电模式。起搏脉冲幅度降低,诊断任务周期延长,通信功能关闭。这些策略,都是低功耗管理任务来执行的。
功耗状态表:
- 正常模式:功耗10-15μA,所有任务可用
- 省电模式:功耗5-8μA,关闭通信,降低起搏幅度
- 紧急模式:功耗3-5μA,仅保留基本起搏功能
- 寿命末期:功耗2-3μA,强制VVI模式,频率降至30bpm
低功耗管理任务的执行周期,一般是1秒。太频繁了浪费电,太慢了响应不及时。我习惯用1秒周期,配合中断唤醒。
3.6 任务优先级与调度策略
好了,五个任务都介绍完了。现在问题来了:怎么调度它们?
我推荐用固定优先级抢占式调度。优先级从高到低:
- 感知任务(最高)
- 起搏任务
- 通信任务
- 低功耗管理任务
- 诊断任务(最低)
为什么诊断任务优先级最低?因为它不涉及病人安全。就算延迟几分钟,甚至几小时,都没关系。但感知任务延迟1ms,可能就会出问题。
避坑指南:我曾经犯过一个错误——把通信任务优先级设得比起搏任务还高。结果通信时,起搏脉冲被延迟了3ms,导致夺获失败。从那以后,我坚持起搏任务必须高于通信任务。
调度周期方面,我建议用1ms的tick。感知任务每8个tick执行一次,起搏任务按需触发,通信任务每100个tick检查一次,低功耗管理每1000个tick执行一次,诊断任务每3600000个tick(1小时)执行一次。
嗯,任务模型就讲到这里。下一章咱们聊聊具体的时序分析,看看怎么保证这些任务都能按时完成。