diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2021-03-12 20:51:11 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2021-03-12 20:51:11 -0500 |
commit | 9572ad43274b68348b250f5a703b1f7c2e77545f (patch) | |
tree | 63b97498cfa26510591e98c3c1d1481decdca559 /klippy/extras/tmc_uart.py | |
parent | 11b9b72b4171e54598ff6de5fb31195efa710421 (diff) | |
download | kutter-9572ad43274b68348b250f5a703b1f7c2e77545f.tar.gz kutter-9572ad43274b68348b250f5a703b1f7c2e77545f.tar.xz kutter-9572ad43274b68348b250f5a703b1f7c2e77545f.zip |
tmc_uart: Limit to only one active uart at a time on an mcu
The tmcuart_send command increases cpu usage on the micro-controller.
Should multiple tmcuart_send commands be issued at the same time to a
single AVR micro-controller, it could increase the load to the point
that it introduces a failure. It could also lead to tmcuart_send
transmission errors, which would cause retransmission requests, which
further increase the load.
Track and share mutexes so that only one tmcuart_send command can be
active on a single mcu at a time.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/extras/tmc_uart.py')
-rw-r--r-- | klippy/extras/tmc_uart.py | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/klippy/extras/tmc_uart.py b/klippy/extras/tmc_uart.py index b87dfca9..32e74b24 100644 --- a/klippy/extras/tmc_uart.py +++ b/klippy/extras/tmc_uart.py @@ -53,13 +53,30 @@ class MCU_analog_mux: # TMC uart communication ###################################################################### +# Share mutexes so only one active tmc_uart command on a single mcu at +# a time. This helps limit cpu usage on slower micro-controllers. +class PrinterTMCUartMutexes: + def __init__(self): + self.mcu_to_mutex = {} +def lookup_tmc_uart_mutex(mcu): + printer = mcu.get_printer() + pmutexes = printer.lookup_object('tmc_uart', None) + if pmutexes is None: + pmutexes = PrinterTMCUartMutexes() + printer.add_object('tmc_uart', pmutexes) + mutex = pmutexes.mcu_to_mutex.get(mcu) + if mutex is None: + mutex = printer.get_reactor().mutex() + pmutexes.mcu_to_mutex[mcu] = mutex + return mutex + TMC_BAUD_RATE = 9000 # Code for sending messages on a TMC uart class MCU_TMC_uart_bitbang: def __init__(self, rx_pin_params, tx_pin_params, select_pins_desc): self.mcu = rx_pin_params['chip'] - self.mutex = self.mcu.get_printer().get_reactor().mutex() + self.mutex = lookup_tmc_uart_mutex(self.mcu) self.pullup = rx_pin_params['pullup'] self.rx_pin = rx_pin_params['pin'] self.tx_pin = tx_pin_params['pin'] |