From aa2dd545cd1606ecc30c6053cdb1bc71be7a3b26 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 29 Jan 2020 13:16:09 +1100 Subject: [PATCH 1/8] AP_HAL: added pulse_input_enable() API this allows disabling pulse input at runtime to lower CPU load on IOMCU when decoding via a UART --- libraries/AP_HAL/RCInput.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/AP_HAL/RCInput.h b/libraries/AP_HAL/RCInput.h index 07554669b23c8..b4cd37d4365d2 100644 --- a/libraries/AP_HAL/RCInput.h +++ b/libraries/AP_HAL/RCInput.h @@ -49,4 +49,8 @@ class AP_HAL::RCInput { /* execute receiver bind */ virtual bool rc_bind(int dsmMode) { return false; } + + /* enable or disable pulse input for RC input. This is used to + reduce load when we are decoding R/C via a UART */ + virtual void pulse_input_enable(bool enable) { } }; From d4613818e48eb86b6d1723011daa6bf346938ab0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 29 Jan 2020 13:16:54 +1100 Subject: [PATCH 2/8] AP_RCProtocol: added multi-channel read() API and use pulse_input_enable() to disable pulse input when not needed --- libraries/AP_RCProtocol/AP_RCProtocol.cpp | 12 ++++++++++++ libraries/AP_RCProtocol/AP_RCProtocol.h | 1 + libraries/AP_RCProtocol/AP_RCProtocol_Backend.cpp | 8 ++++++++ libraries/AP_RCProtocol/AP_RCProtocol_Backend.h | 1 + 4 files changed, 22 insertions(+) diff --git a/libraries/AP_RCProtocol/AP_RCProtocol.cpp b/libraries/AP_RCProtocol/AP_RCProtocol.cpp index 210cb3b8feea6..035c5a1cb9d42 100644 --- a/libraries/AP_RCProtocol/AP_RCProtocol.cpp +++ b/libraries/AP_RCProtocol/AP_RCProtocol.cpp @@ -26,6 +26,8 @@ #include "AP_RCProtocol_FPort.h" #include +extern const AP_HAL::HAL& hal; + void AP_RCProtocol::init() { backend[AP_RCProtocol::PPM] = new AP_RCProtocol_PPMSum(*this); @@ -150,6 +152,9 @@ bool AP_RCProtocol::process_byte(uint8_t byte, uint32_t baudrate) memset(_good_frames, 0, sizeof(_good_frames)); _last_input_ms = now; _detected_with_bytes = true; + + // stop decoding pulses to save CPU + hal.rcin->pulse_input_enable(false); break; } } @@ -257,6 +262,13 @@ uint16_t AP_RCProtocol::read(uint8_t chan) return 0; } +void AP_RCProtocol::read(uint16_t *pwm, uint8_t n) +{ + if (_detected_protocol != AP_RCProtocol::NONE) { + backend[_detected_protocol]->read(pwm, n); + } +} + int16_t AP_RCProtocol::get_RSSI(void) const { if (_detected_protocol != AP_RCProtocol::NONE) { diff --git a/libraries/AP_RCProtocol/AP_RCProtocol.h b/libraries/AP_RCProtocol/AP_RCProtocol.h index c150b85bd83b3..9db14c9dc2707 100644 --- a/libraries/AP_RCProtocol/AP_RCProtocol.h +++ b/libraries/AP_RCProtocol/AP_RCProtocol.h @@ -62,6 +62,7 @@ class AP_RCProtocol { uint8_t num_channels(); uint16_t read(uint8_t chan); + void read(uint16_t *pwm, uint8_t n); bool new_input(); void start_bind(void); int16_t get_RSSI(void) const; diff --git a/libraries/AP_RCProtocol/AP_RCProtocol_Backend.cpp b/libraries/AP_RCProtocol/AP_RCProtocol_Backend.cpp index f4b6fb393f2b0..86a8a7315a661 100644 --- a/libraries/AP_RCProtocol/AP_RCProtocol_Backend.cpp +++ b/libraries/AP_RCProtocol/AP_RCProtocol_Backend.cpp @@ -46,6 +46,14 @@ uint16_t AP_RCProtocol_Backend::read(uint8_t chan) return _pwm_values[chan]; } +void AP_RCProtocol_Backend::read(uint16_t *pwm, uint8_t n) +{ + if (n >= MAX_RCIN_CHANNELS) { + n = MAX_RCIN_CHANNELS; + } + memcpy(pwm, _pwm_values, n*sizeof(pwm[0])); +} + /* provide input from a backend */ diff --git a/libraries/AP_RCProtocol/AP_RCProtocol_Backend.h b/libraries/AP_RCProtocol/AP_RCProtocol_Backend.h index 41154bdf14598..f32137755e184 100644 --- a/libraries/AP_RCProtocol/AP_RCProtocol_Backend.h +++ b/libraries/AP_RCProtocol/AP_RCProtocol_Backend.h @@ -28,6 +28,7 @@ class AP_RCProtocol_Backend { virtual void process_pulse(uint32_t width_s0, uint32_t width_s1) {} virtual void process_byte(uint8_t byte, uint32_t baudrate) {} uint16_t read(uint8_t chan); + void read(uint16_t *pwm, uint8_t n); bool new_input(); uint8_t num_channels(); From 0e90b4c0cfa1635ed783d43e401eabf50cf3ce5e Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 29 Jan 2020 13:21:03 +1100 Subject: [PATCH 3/8] AP_IOMCU: use more efficient read API for rcin --- libraries/AP_IOMCU/iofirmware/iofirmware.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libraries/AP_IOMCU/iofirmware/iofirmware.cpp b/libraries/AP_IOMCU/iofirmware/iofirmware.cpp index d633f2b319f03..9b407ace30e04 100644 --- a/libraries/AP_IOMCU/iofirmware/iofirmware.cpp +++ b/libraries/AP_IOMCU/iofirmware/iofirmware.cpp @@ -301,9 +301,7 @@ void AP_IOMCU_FW::rcin_update() if (hal.rcin->new_input()) { rc_input.count = hal.rcin->num_channels(); rc_input.flags_rc_ok = true; - for (uint8_t i = 0; i < IOMCU_MAX_CHANNELS; i++) { - rc_input.pwm[i] = hal.rcin->read(i); - } + hal.rcin->read(rc_input.pwm, IOMCU_MAX_CHANNELS); rc_last_input_ms = last_ms; rc_input.rc_protocol = (uint16_t)AP::RC().protocol_detected(); rc_input.rssi = AP::RC().get_RSSI(); @@ -316,6 +314,7 @@ void AP_IOMCU_FW::rcin_update() } if (update_default_rate) { hal.rcout->set_default_rate(reg_setup.pwm_defaultrate); + update_default_rate = false; } bool old_override = override_active; From c33f24db1b275df289336752bdf977fbc514d6ef Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 29 Jan 2020 13:21:54 +1100 Subject: [PATCH 4/8] HAL_ChibiOS: added disable() API for pulse input --- libraries/AP_HAL_ChibiOS/SoftSigReader.cpp | 6 ++++++ libraries/AP_HAL_ChibiOS/SoftSigReader.h | 1 + libraries/AP_HAL_ChibiOS/SoftSigReaderInt.cpp | 5 +++++ libraries/AP_HAL_ChibiOS/SoftSigReaderInt.h | 1 + 4 files changed, 13 insertions(+) diff --git a/libraries/AP_HAL_ChibiOS/SoftSigReader.cpp b/libraries/AP_HAL_ChibiOS/SoftSigReader.cpp index d13a41f0aff83..02550ed427f87 100644 --- a/libraries/AP_HAL_ChibiOS/SoftSigReader.cpp +++ b/libraries/AP_HAL_ChibiOS/SoftSigReader.cpp @@ -91,6 +91,12 @@ bool SoftSigReader::attach_capture_timer(ICUDriver* icu_drv, icuchannel_t chan, return true; } +void SoftSigReader::disable(void) +{ + icuStopCapture(_icu_drv); + dmaStreamDisable(dma); +} + void SoftSigReader::_irq_handler(void* self, uint32_t flags) { SoftSigReader* sig_reader = (SoftSigReader*)self; diff --git a/libraries/AP_HAL_ChibiOS/SoftSigReader.h b/libraries/AP_HAL_ChibiOS/SoftSigReader.h index 3727ae0683ca4..e39ed24ec025b 100644 --- a/libraries/AP_HAL_ChibiOS/SoftSigReader.h +++ b/libraries/AP_HAL_ChibiOS/SoftSigReader.h @@ -36,6 +36,7 @@ class ChibiOS::SoftSigReader { friend class ChibiOS::RCInput; public: bool attach_capture_timer(ICUDriver* icu_drv, icuchannel_t chan, uint8_t dma_stream, uint32_t dma_channel); + void disable(void); private: uint32_t *signal; diff --git a/libraries/AP_HAL_ChibiOS/SoftSigReaderInt.cpp b/libraries/AP_HAL_ChibiOS/SoftSigReaderInt.cpp index 3343766937fdc..d757fee904984 100644 --- a/libraries/AP_HAL_ChibiOS/SoftSigReaderInt.cpp +++ b/libraries/AP_HAL_ChibiOS/SoftSigReaderInt.cpp @@ -90,6 +90,11 @@ void SoftSigReaderInt::init(EICUDriver* icu_drv, eicuchannel_t chan) eicuEnable(_icu_drv); } +void SoftSigReaderInt::disable(void) +{ + eicuDisable(_icu_drv); +} + void SoftSigReaderInt::_irq_handler(EICUDriver *eicup, eicuchannel_t aux_channel) { eicuchannel_t channel = get_pair_channel(aux_channel); diff --git a/libraries/AP_HAL_ChibiOS/SoftSigReaderInt.h b/libraries/AP_HAL_ChibiOS/SoftSigReaderInt.h index 7f982a49d33d5..567f57d32b891 100644 --- a/libraries/AP_HAL_ChibiOS/SoftSigReaderInt.h +++ b/libraries/AP_HAL_ChibiOS/SoftSigReaderInt.h @@ -42,6 +42,7 @@ class ChibiOS::SoftSigReaderInt { void init(EICUDriver* icu_drv, eicuchannel_t chan); bool read(uint32_t &widths0, uint32_t &widths1); + void disable(void); private: // singleton static SoftSigReaderInt *_singleton; From 2fc76ee559d3d4c5eeb046167bd0e4041ff148f0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 29 Jan 2020 13:23:18 +1100 Subject: [PATCH 5/8] HAL_ChibiOS: implement pulse_input_enable() and cleanup use of mutexes in RC input --- libraries/AP_HAL_ChibiOS/RCInput.cpp | 98 ++++++++++++++++++---------- libraries/AP_HAL_ChibiOS/RCInput.h | 5 ++ 2 files changed, 68 insertions(+), 35 deletions(-) diff --git a/libraries/AP_HAL_ChibiOS/RCInput.cpp b/libraries/AP_HAL_ChibiOS/RCInput.cpp index 114fca9173554..69d06fb5777b6 100644 --- a/libraries/AP_HAL_ChibiOS/RCInput.cpp +++ b/libraries/AP_HAL_ChibiOS/RCInput.cpp @@ -43,15 +43,31 @@ void RCInput::init() #if HAL_USE_ICU == TRUE //attach timer channel on which the signal will be received sig_reader.attach_capture_timer(&RCIN_ICU_TIMER, RCIN_ICU_CHANNEL, STM32_RCIN_DMA_STREAM, STM32_RCIN_DMA_CHANNEL); + pulse_input_enabled = true; #endif #if HAL_USE_EICU == TRUE sig_reader.init(&RCININT_EICU_TIMER, RCININT_EICU_CHANNEL); + pulse_input_enabled = true; #endif _init = true; } +/* + enable or disable pulse input for RC input. This is used to reduce + load when we are decoding R/C via a UART +*/ +void RCInput::pulse_input_enable(bool enable) +{ + pulse_input_enabled = enable; +#if HAL_USE_ICU == TRUE || HAL_USE_EICU == TRUE + if (!enable) { + sig_reader.disable(); + } +#endif +} + bool RCInput::new_input() { if (!_init) { @@ -90,9 +106,11 @@ uint16_t RCInput::read(uint8_t channel) if (!_init || (channel >= MIN(RC_INPUT_MAX_CHANNELS, _num_channels))) { return 0; } - rcin_mutex.take_blocking(); - uint16_t v = _rc_values[channel]; - rcin_mutex.give(); + uint16_t v; + { + WITH_SEMAPHORE(rcin_mutex); + v = _rc_values[channel]; + } #if HAL_RCINPUT_WITH_AP_RADIO if (radio && channel == 0) { // hook to allow for update of radio on main thread, for mavlink sends @@ -111,9 +129,16 @@ uint8_t RCInput::read(uint16_t* periods, uint8_t len) if (len > RC_INPUT_MAX_CHANNELS) { len = RC_INPUT_MAX_CHANNELS; } - for (uint8_t i = 0; i < len; i++){ - periods[i] = read(i); + { + WITH_SEMAPHORE(rcin_mutex); + memcpy(periods, _rc_values, len*sizeof(periods[0])); + } +#if HAL_RCINPUT_WITH_AP_RADIO + if (radio && channel == 0) { + // hook to allow for update of radio on main thread, for mavlink sends + radio->update(); } +#endif return len; } @@ -122,6 +147,7 @@ void RCInput::_timer_tick(void) if (!_init) { return; } + AP_RCProtocol &rcprot = AP::RC(); #ifndef HAL_NO_UARTDRIVER const char *rc_protocol = nullptr; @@ -129,33 +155,34 @@ void RCInput::_timer_tick(void) #ifndef HAL_BUILD_AP_PERIPH #if HAL_USE_ICU == TRUE - const uint32_t *p; - uint32_t n; - while ((p = (const uint32_t *)sig_reader.sigbuf.readptr(n)) != nullptr) { - AP::RC().process_pulse_list(p, n*2, sig_reader.need_swap); - sig_reader.sigbuf.advance(n); + if (pulse_input_enabled) { + const uint32_t *p; + uint32_t n; + while ((p = (const uint32_t *)sig_reader.sigbuf.readptr(n)) != nullptr) { + rcprot.process_pulse_list(p, n*2, sig_reader.need_swap); + sig_reader.sigbuf.advance(n); + } } #endif #if HAL_USE_EICU == TRUE - uint32_t width_s0, width_s1; - while(sig_reader.read(width_s0, width_s1)) { - AP::RC().process_pulse(width_s0, width_s1); + if (pulse_input_enabled) { + uint32_t width_s0, width_s1; + while(sig_reader.read(width_s0, width_s1)) { + rcprot.process_pulse(width_s0, width_s1); + } } #endif - if (AP::RC().new_input()) { - rcin_mutex.take_blocking(); + if (rcprot.new_input()) { + WITH_SEMAPHORE(rcin_mutex); _rcin_timestamp_last_signal = AP_HAL::micros(); - _num_channels = AP::RC().num_channels(); + _num_channels = rcprot.num_channels(); _num_channels = MIN(_num_channels, RC_INPUT_MAX_CHANNELS); - for (uint8_t i=0; i<_num_channels; i++) { - _rc_values[i] = AP::RC().read(i); - } - _rssi = AP::RC().get_RSSI(); - rcin_mutex.give(); + rcprot.read(_rc_values, _num_channels); + _rssi = rcprot.get_RSSI(); #ifndef HAL_NO_UARTDRIVER - rc_protocol = AP::RC().protocol_name(); + rc_protocol = rcprot.protocol_name(); #endif } #endif // HAL_BUILD_AP_PERIPH @@ -163,28 +190,28 @@ void RCInput::_timer_tick(void) #if HAL_RCINPUT_WITH_AP_RADIO if (radio && radio->last_recv_us() != last_radio_us) { last_radio_us = radio->last_recv_us(); - rcin_mutex.take_blocking(); + WITH_SEMAPHORE(rcin_mutex); _rcin_timestamp_last_signal = last_radio_us; _num_channels = radio->num_channels(); _num_channels = MIN(_num_channels, RC_INPUT_MAX_CHANNELS); for (uint8_t i=0; i<_num_channels; i++) { _rc_values[i] = radio->read(i); } - rcin_mutex.give(); } #endif #if HAL_WITH_IO_MCU - rcin_mutex.take_blocking(); - if (AP_BoardConfig::io_enabled() && - iomcu.check_rcinput(last_iomcu_us, _num_channels, _rc_values, RC_INPUT_MAX_CHANNELS)) { - _rcin_timestamp_last_signal = last_iomcu_us; + { + WITH_SEMAPHORE(rcin_mutex); + if (AP_BoardConfig::io_enabled() && + iomcu.check_rcinput(last_iomcu_us, _num_channels, _rc_values, RC_INPUT_MAX_CHANNELS)) { + _rcin_timestamp_last_signal = last_iomcu_us; #ifndef HAL_NO_UARTDRIVER - rc_protocol = iomcu.get_rc_protocol(); - _rssi = iomcu.get_RSSI(); + rc_protocol = iomcu.get_rc_protocol(); + _rssi = iomcu.get_RSSI(); #endif + } } - rcin_mutex.give(); #endif #ifndef HAL_NO_UARTDRIVER @@ -204,11 +231,12 @@ void RCInput::_timer_tick(void) bool RCInput::rc_bind(int dsmMode) { #if HAL_WITH_IO_MCU - rcin_mutex.take_blocking(); - if (AP_BoardConfig::io_enabled()) { - iomcu.bind_dsm(dsmMode); + { + WITH_SEMAPHORE(rcin_mutex); + if (AP_BoardConfig::io_enabled()) { + iomcu.bind_dsm(dsmMode); + } } - rcin_mutex.give(); #endif #ifndef HAL_BUILD_AP_PERIPH diff --git a/libraries/AP_HAL_ChibiOS/RCInput.h b/libraries/AP_HAL_ChibiOS/RCInput.h index a8412792053d6..1751ea842d4ff 100644 --- a/libraries/AP_HAL_ChibiOS/RCInput.h +++ b/libraries/AP_HAL_ChibiOS/RCInput.h @@ -45,6 +45,10 @@ class ChibiOS::RCInput : public AP_HAL::RCInput { uint16_t read(uint8_t ch) override; uint8_t read(uint16_t* periods, uint8_t len) override; + /* enable or disable pulse input for RC input. This is used to + reduce load when we are decoding R/C via a UART */ + void pulse_input_enable(bool enable) override; + int16_t get_rssi(void) override { return _rssi; } @@ -64,6 +68,7 @@ class ChibiOS::RCInput : public AP_HAL::RCInput { uint32_t _rcin_timestamp_last_signal; bool _init; const char *last_protocol; + bool pulse_input_enabled; #if HAL_RCINPUT_WITH_AP_RADIO bool _radio_init; From 08f8ce3a1c8c605c079a2da3d49716ce87a5b9d2 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 29 Jan 2020 13:25:27 +1100 Subject: [PATCH 6/8] Tools: updated IO firmware --- Tools/IO_Firmware/iofirmware_highpolh.bin | Bin 38040 -> 38264 bytes Tools/IO_Firmware/iofirmware_lowpolh.bin | Bin 38040 -> 38264 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Tools/IO_Firmware/iofirmware_highpolh.bin b/Tools/IO_Firmware/iofirmware_highpolh.bin index 22347daa834612f42d518863145740c0871d4116..a08cb1f17de6c1dab73a0905b93bd13e7ff6eeb0 100755 GIT binary patch delta 9029 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 SomG$!cA2fgpP5PZ%l{vu3jD1A delta 9038 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 diff --git a/Tools/IO_Firmware/iofirmware_lowpolh.bin b/Tools/IO_Firmware/iofirmware_lowpolh.bin index 3d707cfc24adfb0156d85ebf22c3ec1c8ed1ff5f..09260ae82998fc5453b3205399d5122b3d40eb4c 100755 GIT binary patch delta 9029 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 Date: Wed, 29 Jan 2020 17:44:53 +1100 Subject: [PATCH 7/8] HAL_ChibiOS: fixed build --- libraries/AP_HAL_ChibiOS/RCInput.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/AP_HAL_ChibiOS/RCInput.cpp b/libraries/AP_HAL_ChibiOS/RCInput.cpp index 69d06fb5777b6..faece37f74f54 100644 --- a/libraries/AP_HAL_ChibiOS/RCInput.cpp +++ b/libraries/AP_HAL_ChibiOS/RCInput.cpp @@ -147,13 +147,13 @@ void RCInput::_timer_tick(void) if (!_init) { return; } - AP_RCProtocol &rcprot = AP::RC(); - #ifndef HAL_NO_UARTDRIVER const char *rc_protocol = nullptr; #endif #ifndef HAL_BUILD_AP_PERIPH + AP_RCProtocol &rcprot = AP::RC(); + #if HAL_USE_ICU == TRUE if (pulse_input_enabled) { const uint32_t *p; From 7601197f0c08d50c283a1f9a7746e60c7a209a5d Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 30 Jan 2020 08:25:24 +1100 Subject: [PATCH 8/8] HAL_ChibiOS: use blocking semaphore for new_input() this prevents a race where we continually fail to get new input --- libraries/AP_HAL_ChibiOS/RCInput.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/libraries/AP_HAL_ChibiOS/RCInput.cpp b/libraries/AP_HAL_ChibiOS/RCInput.cpp index faece37f74f54..547d2a4e99b33 100644 --- a/libraries/AP_HAL_ChibiOS/RCInput.cpp +++ b/libraries/AP_HAL_ChibiOS/RCInput.cpp @@ -73,13 +73,12 @@ bool RCInput::new_input() if (!_init) { return false; } - if (!rcin_mutex.take_nonblocking()) { - return false; + bool valid; + { + WITH_SEMAPHORE(rcin_mutex); + valid = _rcin_timestamp_last_signal != _last_read; + _last_read = _rcin_timestamp_last_signal; } - bool valid = _rcin_timestamp_last_signal != _last_read; - - _last_read = _rcin_timestamp_last_signal; - rcin_mutex.give(); #if HAL_RCINPUT_WITH_AP_RADIO if (!_radio_init) { @@ -134,7 +133,7 @@ uint8_t RCInput::read(uint16_t* periods, uint8_t len) memcpy(periods, _rc_values, len*sizeof(periods[0])); } #if HAL_RCINPUT_WITH_AP_RADIO - if (radio && channel == 0) { + if (radio) { // hook to allow for update of radio on main thread, for mavlink sends radio->update(); }