aboutsummaryrefslogtreecommitdiffstats
path: root/klippy
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2021-03-12 20:51:11 -0500
committerKevin O'Connor <kevin@koconnor.net>2021-03-12 20:51:11 -0500
commit9572ad43274b68348b250f5a703b1f7c2e77545f (patch)
tree63b97498cfa26510591e98c3c1d1481decdca559 /klippy
parent11b9b72b4171e54598ff6de5fb31195efa710421 (diff)
downloadkutter-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')
-rw-r--r--klippy/extras/tmc_uart.py19
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']