飞控中的参数管理系统
从一次炸机说起
去年夏天,我在调试一架四轴无人机时遇到了一个诡异的故障——飞机在悬停状态下突然失控,翻滚着砸向地面。事后分析黑匣子数据,发现PID参数在飞行过程中被意外修改了。排查了整整两天,最终定位到问题:一个串口中断服务函数里,某个指针越界写入了参数存储区。
那次之后,我彻底重写了飞控的参数管理系统。今天聊聊这个看似不起眼、实则决定飞控稳定性的核心模块。
参数管理到底管什么
飞控的参数五花八门:PID系数、传感器校准值、飞行模式配置、遥控器通道映射……少则几十个,多则上千个。这些参数有几个共同特点:
- 需要持久化存储——断电后不能丢
- 运行时可修改——地面站调参、空中动态调整
- 多任务并发访问——控制循环、通信线程、地面站都可能读写
- 版本兼容——固件升级后参数结构可能变化
我见过最糟糕的实现:直接把结构体指针强制转换成字节数组,用memcpy往Flash里写。这种写法在结构体成员顺序调整后,读出来的参数全是垃圾。
参数ID:给每个参数一个身份证
别用参数名做索引。字符串比较太慢,而且容易拼写错误。我习惯给每个参数分配一个16位整数ID,高位表示参数组,低位表示组内序号。