Skip to content

Commit

Permalink
tmc_uart: Limit to only one active uart at a time on an mcu
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
KevinOConnor committed Mar 13, 2021
1 parent 11b9b72 commit 9572ad4
Showing 1 changed file with 18 additions and 1 deletion.
19 changes: 18 additions & 1 deletion klippy/extras/tmc_uart.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,30 @@ def activate(self, instance_id):
# 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']
Expand Down

0 comments on commit 9572ad4

Please sign in to comment.