From bdf3b9b41aaed00424ad4c6fa8a4095a973a2465 Mon Sep 17 00:00:00 2001 From: Emanuele Trabattoni Date: Mon, 14 Jul 2025 11:29:16 +0200 Subject: [PATCH] Added mutex to MODBUS and I@c for mutithreading --- docs/mi004700-i-e.pdf | Bin 0 -> 1630657 bytes lib/ETH/ETH_Driver.h | 2 +- lib/I2C/I2C_Driver.cpp | 11 ++++------- lib/I2C/I2C_Driver.h | 8 ++++---- lib/RS485/RS485_Driver.cpp | 8 ++++++++ lib/RS485/RS485_Driver.h | 2 ++ src/main.cpp | 11 +++++++---- 7 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 docs/mi004700-i-e.pdf diff --git a/docs/mi004700-i-e.pdf b/docs/mi004700-i-e.pdf new file mode 100644 index 0000000000000000000000000000000000000000..052ba0d6eb6a1b10611e94252ea38c39621b2058 GIT binary patch literal 1630657 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