From a9991f4509cade126fb5c1ecf13aee6cbec4622f Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 29 Apr 2025 15:33:57 +0200 Subject: [PATCH 1/3] I2CSlave: fix slave write --- libraries/Wire/Wire.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index 9b345d3e1..f7bb57bf8 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -124,7 +124,6 @@ size_t arduino::MbedI2C::write(const uint8_t* data, int len) { int arduino::MbedI2C::read() { int rv = -1; core_util_critical_section_enter(); - if (rxBuffer.available()) { rv = rxBuffer.read_char(); @@ -159,9 +158,7 @@ void arduino::MbedI2C::receiveThd() { onRequestCb(); } if (usedTxBuffer != 0) { - core_util_critical_section_enter(); slave->write((const char *) txBuffer, usedTxBuffer); - core_util_critical_section_exit(); usedTxBuffer = 0; } //slave->stop(); From 6ca44223cf2d38d2955a2268e83cb40b6427fbc5 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 29 Apr 2025 16:31:02 +0200 Subject: [PATCH 2/3] I2CSlave: restore critical section with temp buffer --- libraries/Wire/Wire.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index f7bb57bf8..a382fc66f 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -158,8 +158,12 @@ void arduino::MbedI2C::receiveThd() { onRequestCb(); } if (usedTxBuffer != 0) { - slave->write((const char *) txBuffer, usedTxBuffer); + core_util_critical_section_enter(); + uint8_t tempTxBuffer[usedTxBuffer]; + memcpy(tempTxBuffer, txBuffer, sizeof(tempTxBuffer)); usedTxBuffer = 0; + core_util_critical_section_exit(); + slave->write((const char *) tempTxBuffer, sizeof(tempTxBuffer)); } //slave->stop(); break; From 6231980a20cf4e9d5b4e41ff4c572ccc5fe3f63c Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 29 Apr 2025 17:41:24 +0200 Subject: [PATCH 3/3] I2CSlave: do not use vla --- libraries/Wire/Wire.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index a382fc66f..155ab4fc8 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -159,11 +159,12 @@ void arduino::MbedI2C::receiveThd() { } if (usedTxBuffer != 0) { core_util_critical_section_enter(); - uint8_t tempTxBuffer[usedTxBuffer]; - memcpy(tempTxBuffer, txBuffer, sizeof(tempTxBuffer)); + uint8_t tempTxBuffer[256]; + uint8_t usedTempTxBuffer = usedTxBuffer; + memcpy(tempTxBuffer, txBuffer, usedTempTxBuffer); usedTxBuffer = 0; core_util_critical_section_exit(); - slave->write((const char *) tempTxBuffer, sizeof(tempTxBuffer)); + slave->write((const char *) tempTxBuffer, usedTempTxBuffer); } //slave->stop(); break;