PARAM参数管理¶
定义参数¶
参数文件¶
参数定义文件是*_params.c
为后缀的C文件,并需要#include "param.h
。
#include "param.h"
// 定义一个float型param
/**
* Serial Configuration for MAVLink (instance 0)
*
* Configure on which serial port to run MAVLink.
*
*
* @value 0 Disabled
* @value 100 USB
* @value 101 TELEM 1
* @value 102 TELEM 2
* @value 104 TELEM/SERIAL 4
*
* @group MAVLink
* @reboot_required true
*/
PARAM_DEFINE_FALOT(name, default, flag)
# 定义一个INT32型param
PARAM_DEFINE_INT32(name, default, flag)
必要信息¶
飞控内部用于参数管理(查找、获取、设置、计算等)所必须的信息包括变量名、类型、取值和标志。
- name:必须,变量名,最大长度16个字符,不要双引号,宏展开会自动添加双引号
- type:必须,类型,支持
UIN8/INT8/UINT16/INT16/UINT32/INT32/FLOAT
- default:必须,默认值
- flag:必须,标志位,
bit0表示不允许用户修改,bit1表示修改需要重启,bit2表示解锁后不允许修改
通过PARAM_DEFINE_**(name, default, flag);
宏来定义一个参数,其语法格式为:
# 定义一个float型param
PARAM_DEFINE_FALOT(name, default, flag);
# 定义一个INT32型param
PARAM_DEFINE_INT32(name, default, flag);
可选信息¶
可选信息主要是用于地面站参数显示、设置等
- group
- category
- shortDesc
- longDesc
- board
- boolean
- @value value description,可选,允许值
// 表示允许取值0,1,2,3
@value 0 Disabled
@value 1 Joystick
@value 2 S.BUS
@value 3 DSM
- @bit,可选
- @min,可选,最小值
- @max,可选,最大值
- @increment,可选,修改步长
- @decimal
- @unit,可选,单位,允许以下取值:
'%', 'Hz', '1/s', 'mAh',
'rad', '%/rad', 'rad/s', 'rad/s^2', '%/rad/s', 'rad s^2/m', 'rad s/m',
'bit/s', 'B/s',
'deg', 'deg*1e7', 'deg/s',
'celcius', 'gauss', 'gauss/s', 'gauss^2',
'hPa', 'kg', 'kg/m^2', 'kg m^2',
'mm', 'm', 'm/s', 'm^2', 'm/s^2', 'm/s^3', 'm/s^2/sqrt(Hz)', 'm/s/rad',
'Ohm', 'V',
'us', 'ms', 's',
'S', 'A/%', '(m/s^2)^2', 'm/m', 'tan(rad)^2', '(m/s)^2', 'm/rad',
'm/s^3/sqrt(Hz)', 'm/s/sqrt(Hz)', 's/(1000*PWM)', '%m/s', 'min', 'us/C',
'N/(m/s)', 'Nm/rad', 'Nm/(rad/s)', 'Nm', 'N',
'normalized_thrust/s', 'normalized_thrust', 'norm', 'SD', ''
- @reboot_required true/false,可选,修改是否需要重启飞控
- volatile,可选,不允许用户修改
使用参数¶
查找参数¶
uint16_t param_find(const char* name)
获取参数¶
void param_get(uint16_t handle, void* value)
设置参数¶
void param_set(uint16_t handle, void* value)
基本原理¶
参数定义¶
#define PARAM_DEFINE_INT32(_name, _value, _flag) \
__attribute__(used) \ // 防止被优化
__attribute__(section("NextpilotParamTab")) \ // 指定section
param_info_t __param_info_##_name = { \
.name = #_name, \ // 变量名,全局唯一
.type = PARAM_TYPE_INT32, \ // 类型
.default_value = {.i32 = _value}, \ // 默认值
.airframe_value = {.i32 = _value}, \ // 机架取值
.current_value = {.i32 = _value}, \ // 当前值
.flag = _flag, \ // 标志位
.status = 0, \ // 状态位
}
参数存储¶
机架参数¶
由于NextPilot支持多机架切换,但是不同机架之间有些参数是不一致的,因此切换机架的时候需要将参数重置为当前机架的默认值。