rate limit most parameter_update subscriptions

- parameter updates can be quite expensive because they trigger nearly all modules to reload all of their parameters immediately
 - limit modules from updating faster than once per second
This commit is contained in:
Daniel Agar
2021-01-10 21:09:15 -05:00
committed by GitHub
parent 70e503cb91
commit 967d35a6b6
73 changed files with 212 additions and 122 deletions
+2 -2
View File
@@ -574,7 +574,7 @@ void DShot::Run()
}
}
if (_param_sub.updated()) {
if (_parameter_update_sub.updated()) {
update_params();
}
@@ -603,7 +603,7 @@ void DShot::Run()
void DShot::update_params()
{
parameter_update_s pupdate;
_param_sub.update(&pupdate);
_parameter_update_sub.copy(&pupdate);
updateParams();
+1 -1
View File
@@ -223,7 +223,7 @@ private:
Mode _mode{MODE_NONE};
uORB::Subscription _param_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
DEFINE_PARAMETERS(
(ParamInt<px4::params::DSHOT_CONFIG>) _param_dshot_config,
+4 -2
View File
@@ -46,12 +46,14 @@
#include <px4_platform_common/module.h>
#include <px4_platform_common/module_params.h>
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionInterval.hpp>
#include <uORB/topics/parameter_update.h>
#include <uORB/topics/sensor_accel.h>
#include <mathlib/mathlib.h>
using namespace time_literals;
#define CONTROLLER_PERIOD_DEFAULT 100000
/**
@@ -174,7 +176,7 @@ private:
float _integrator_value = 0.0f;
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
float _proportional_value = 0.0f;
+5 -2
View File
@@ -49,8 +49,11 @@
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/module.h>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionInterval.hpp>
#include <uORB/topics/parameter_update.h>
using namespace time_literals;
#define ADDR 0x55 /**< I2C adress of TCA62724FMG */
#define SUB_ADDR_START 0x01 /**< write everything (with auto-increment) */
#define SUB_ADDR_PWM0 0x81 /**< blue (without auto-increment) */
@@ -61,6 +64,7 @@
#define SETTING_NOT_POWERSAVE 0x01 /**< power-save mode not off */
#define SETTING_ENABLE 0x02 /**< on */
class RGBLED : public device::I2C, public I2CSPIDriver<RGBLED>
{
public:
@@ -88,11 +92,10 @@ private:
uint8_t _b{0};
bool _leds_enabled{true};
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
LedController _led_controller;
int send_led_enable(bool enable);
int send_led_rgb();
int get(bool &on, bool &powersave, uint8_t &r, uint8_t &g, uint8_t &b);
@@ -47,9 +47,10 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/module.h>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionInterval.hpp>
#include <uORB/topics/parameter_update.h>
using namespace time_literals;
#define ADDR 0x39 /**< I2C adress of NCP5623C */
@@ -89,7 +90,7 @@ private:
volatile bool _should_run{true};
bool _leds_enabled{true};
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
LedController _led_controller;
+4 -1
View File
@@ -43,6 +43,7 @@
#include <px4_platform_common/posix.h>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionInterval.hpp>
#include <uORB/topics/actuator_controls.h>
#include <uORB/topics/actuator_outputs.h>
#include <uORB/topics/actuator_armed.h>
@@ -63,6 +64,8 @@
#include "ocpoc_mmap.h"
#include "bbblue_pwm_rc.h"
using namespace time_literals;
namespace linux_pwm_out
{
static px4_task_t _task_handle = -1;
@@ -260,7 +263,7 @@ void task_main(int argc, char *argv[])
Mixer::Airmode airmode = Mixer::Airmode::disabled;
update_params(airmode);
uORB::Subscription parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval parameter_update_sub{ORB_ID(parameter_update), 1_s};
int rc_channels_sub = -1;
+2 -1
View File
@@ -53,6 +53,7 @@
#define PCA9685_DEFAULT_ADDRESS (0x40)
using namespace drv_pca9685_pwm;
using namespace time_literals;
class PCA9685Wrapper : public cdev::CDev, public ModuleBase<PCA9685Wrapper>, public OutputModuleInterface
{
@@ -112,7 +113,7 @@ protected:
PCA9685 *pca9685 = nullptr; // driver handle.
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)}; // param handle
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
MixingOutput _mixing_output{PCA9685_PWM_CHANNEL_COUNT, *this, MixingOutput::SchedulingPolicy::Disabled, true};
};
+2 -2
View File
@@ -45,8 +45,8 @@
#include <lib/perf/perf_counter.h>
#include <battery/battery.h>
#include <drivers/drv_hrt.h>
#include <uORB/uORB.h>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionInterval.hpp>
#include <uORB/topics/actuator_controls.h>
#include <uORB/topics/parameter_update.h>
#include <px4_platform_common/i2c_spi_buses.h>
@@ -207,7 +207,7 @@ private:
Battery _battery;
uORB::Subscription _actuators_sub{ORB_ID(actuator_controls_0)};
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
int read(uint8_t address, int16_t &data);
int write(uint8_t address, uint16_t data);
+2 -1
View File
@@ -89,6 +89,7 @@
#include <uORB/PublicationMulti.hpp>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionInterval.hpp>
#include <uORB/topics/actuator_controls.h>
#include <uORB/topics/battery_status.h>
#include <uORB/topics/power_monitor.h>
@@ -253,7 +254,7 @@ private:
perf_counter_t _comms_errors;
uORB::PublicationMulti<power_monitor_s> _pm_pub_topic{ORB_ID(power_monitor)};
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
power_monitor_s _pm_status{};
+1 -2
View File
@@ -169,8 +169,7 @@ private:
unsigned _current_update_rate{0};
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
unsigned _num_outputs{0};
int _class_instance{-1};
+3 -2
View File
@@ -44,6 +44,8 @@
#include <px4_platform_common/time.h>
#include <uORB/topics/parameter_update.h>
using namespace time_literals;
class PWMSim : public cdev::CDev, public ModuleBase<PWMSim>, public OutputModuleInterface
{
public:
@@ -76,7 +78,6 @@ private:
static constexpr uint16_t PWM_SIM_PWM_MAX_MAGIC = 2000;
MixingOutput _mixing_output{MAX_ACTUATORS, *this, MixingOutput::SchedulingPolicy::Auto, false, false};
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
};
+3 -2
View File
@@ -80,8 +80,8 @@
#include <uORB/Publication.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/Publication.hpp>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionInterval.hpp>
#include <uORB/topics/actuator_controls.h>
#include <uORB/topics/actuator_outputs.h>
#include <uORB/topics/actuator_armed.h>
@@ -241,9 +241,10 @@ private:
uORB::Subscription _t_actuator_controls_3{ORB_ID(actuator_controls_3)};; ///< actuator controls group 3 topic
uORB::Subscription _t_actuator_armed{ORB_ID(actuator_armed)}; ///< system armed control topic
uORB::Subscription _t_vehicle_control_mode{ORB_ID(vehicle_control_mode)}; ///< vehicle control mode topic
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)}; ///< parameter update topic
uORB::Subscription _t_vehicle_command{ORB_ID(vehicle_command)}; ///< vehicle command topic
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
hrt_abstime _last_status_publish{0};
bool _param_update_force; ///< force a parameter update
@@ -333,7 +333,7 @@ void task_main(int argc, char *argv[])
Mixer::Airmode airmode = Mixer::Airmode::disabled;
update_params(airmode);
uORB::Subscription parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval parameter_update_sub{ORB_ID(parameter_update), 1_s};
// Start disarmed
_armed.armed = false;
+4 -1
View File
@@ -48,6 +48,7 @@
#include <perf/perf_counter.h>
#include <px4_platform_common/module_params.h>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionInterval.hpp>
#include <uORB/topics/actuator_controls.h>
#include <uORB/topics/actuator_outputs.h>
#include <uORB/topics/actuator_armed.h>
@@ -78,6 +79,8 @@
# define TAP_ESC_CTRL_UORB_UPDATE_INTERVAL 2 // [ms] min: 2, max: 100
#endif
using namespace time_literals;
/*
* This driver connects to TAP ESCs via serial.
*/
@@ -115,7 +118,7 @@ private:
int _armed_sub = -1;
int _test_motor_sub = -1;
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
orb_advert_t _outputs_pub = nullptr;
actuator_outputs_s _outputs = {};
+4 -1
View File
@@ -68,8 +68,11 @@
#include <lib/perf/perf_counter.h>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionInterval.hpp>
#include <uORB/topics/parameter_update.h>
using namespace time_literals;
class UavcanNode;
/**
@@ -215,7 +218,7 @@ private:
bool _idle_throttle_when_armed{false};
int32_t _idle_throttle_when_armed_param{0};
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
perf_counter_t _cycle_perf;
perf_counter_t _interval_perf;
+3 -2
View File
@@ -65,7 +65,6 @@
#include <uavcan/equipment/power/BatteryInfo.hpp>
#include <uavcan/equipment/range_sensor/Measurement.hpp>
#include <lib/parameters/param.h>
#include <lib/perf/perf_counter.h>
@@ -79,6 +78,8 @@
#include <uORB/topics/sensor_mag.h>
#include <uORB/topics/vehicle_gps_position.h>
using namespace time_literals;
/**
* A UAVCAN node.
*/
@@ -179,7 +180,7 @@ private:
hrt_abstime _last_static_temperature_publish{0};
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
uORB::SubscriptionCallbackWorkItem _battery_status_sub{this, ORB_ID(battery_status)};
uORB::SubscriptionCallbackWorkItem _diff_pressure_sub{this, ORB_ID(differential_pressure)};