117、飞控中的事件驱动编程
飞控中的事件驱动编程
从一次炸机说起
去年夏天,我在调试一架四轴无人机时遇到了一个诡异的故障。飞机悬停时偶尔会突然抽搐一下,像是被什么东西吓到了。用数传看日志,发现电机输出在某个时刻出现了微秒级的跳变。查了三天,最后定位到问题:一个传感器中断服务函数里,我直接调用了姿态解算和电机控制函数。中断嵌套导致优先级反转,高优先级任务被低优先级中断阻塞,电机控制指令被延迟了整整2毫秒。2毫秒在飞控里是什么概念?足够让飞机偏转3度,然后PID拼命修正,再修正过头,最终表现为肉眼可见的抖动。
那次之后,我彻底重构了飞控的软件架构,全面转向事件驱动。今天聊聊这个在嵌入式飞控里被严重低估的编程范式。
轮询的陷阱
很多刚入门的同学写飞控,习惯在主循环里这样写:
while(1){read_sensors()