From b874b41562b8c096bfb2123252961a407a8ff639 Mon Sep 17 00:00:00 2001
From: iabdalkader <i.abdalkader@gmail.com>
Date: Mon, 15 Jan 2024 14:19:59 +0200
Subject: [PATCH 1/2] libraries/openamp_arduino: Optimize Open-AMP RPMSG buffer
 configuration.

Reduce buffer size to 512 and increase available buffers to 64. The
increased number of buffers minimizes the chances of blocking while
waiting for a free buffer.

Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
---
 libraries/openamp_arduino/src/openamp_conf.h     | 2 +-
 variants/GENERIC_STM32H747_M4/conf/mbed_app.json | 2 +-
 variants/GENERIC_STM32H747_M4/defines.txt        | 2 +-
 variants/GIGA/conf/mbed_app.json                 | 2 +-
 variants/GIGA/defines.txt                        | 2 +-
 variants/NICLA_VISION/conf/mbed_app.json         | 2 +-
 variants/NICLA_VISION/defines.txt                | 2 +-
 variants/OPTA/conf/mbed_app.json                 | 2 +-
 variants/OPTA/defines.txt                        | 2 +-
 variants/PORTENTA_H7_M7/conf/mbed_app.json       | 2 +-
 variants/PORTENTA_H7_M7/defines.txt              | 2 +-
 variants/PORTENTA_X8/conf/mbed_app.json          | 2 +-
 variants/PORTENTA_X8/defines.txt                 | 2 +-
 13 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/libraries/openamp_arduino/src/openamp_conf.h b/libraries/openamp_arduino/src/openamp_conf.h
index c39a41fe2..922b45239 100644
--- a/libraries/openamp_arduino/src/openamp_conf.h
+++ b/libraries/openamp_arduino/src/openamp_conf.h
@@ -158,7 +158,7 @@ extern int __OPENAMP_region_end__[];
 #define VRING_BUFF_ADDRESS      (SHM_START_ADDRESS + 0x2000)
 #define VRING_BUFF_SIZE         (SHM_SIZE - 0x2000)
 #define VRING_ALIGNMENT         32
-#define VRING_NUM_BUFFS         16   /* number of rpmsg buffers */
+#define VRING_NUM_BUFFS         64   /* number of rpmsg buffers */
 
 /* Fixed parameter */
 #define NUM_RESOURCE_ENTRIES    2
diff --git a/variants/GENERIC_STM32H747_M4/conf/mbed_app.json b/variants/GENERIC_STM32H747_M4/conf/mbed_app.json
index 0f4e6b6a8..f93a5464a 100644
--- a/variants/GENERIC_STM32H747_M4/conf/mbed_app.json
+++ b/variants/GENERIC_STM32H747_M4/conf/mbed_app.json
@@ -22,7 +22,7 @@
         "VIRTIO_DEVICE_ONLY",
         "NO_ATOMIC_64_SUPPORT",
         "METAL_MAX_DEVICE_REGIONS=2",
-        "RPMSG_BUFFER_SIZE=2048"
+        "RPMSG_BUFFER_SIZE=512"
       ]
     }
   }
diff --git a/variants/GENERIC_STM32H747_M4/defines.txt b/variants/GENERIC_STM32H747_M4/defines.txt
index 0b8e7d85a..f654c7e01 100644
--- a/variants/GENERIC_STM32H747_M4/defines.txt
+++ b/variants/GENERIC_STM32H747_M4/defines.txt
@@ -52,7 +52,7 @@
 -DMETAL_MAX_DEVICE_REGIONS=2
 -DNO_ATOMIC_64_SUPPORT
 -DNO_VTOR_RELOCATE
--DRPMSG_BUFFER_SIZE=2048
+-DRPMSG_BUFFER_SIZE=512
 -DSTM32H747xx
 -DTARGET_CORDIO
 -DTARGET_CORTEX
diff --git a/variants/GIGA/conf/mbed_app.json b/variants/GIGA/conf/mbed_app.json
index 18b610287..0fb7e9221 100644
--- a/variants/GIGA/conf/mbed_app.json
+++ b/variants/GIGA/conf/mbed_app.json
@@ -16,7 +16,7 @@
         "VIRTIO_DRIVER_ONLY",
         "NO_ATOMIC_64_SUPPORT",
         "METAL_MAX_DEVICE_REGIONS=2",
-        "RPMSG_BUFFER_SIZE=2048"
+        "RPMSG_BUFFER_SIZE=512"
       ]
     }
   }
diff --git a/variants/GIGA/defines.txt b/variants/GIGA/defines.txt
index 1cb7a6441..cf66dca5c 100644
--- a/variants/GIGA/defines.txt
+++ b/variants/GIGA/defines.txt
@@ -53,7 +53,7 @@
 -DMETAL_MAX_DEVICE_REGIONS=2
 -DNO_ATOMIC_64_SUPPORT
 -DQSPI_NO_SAMPLE_SHIFT
--DRPMSG_BUFFER_SIZE=2048
+-DRPMSG_BUFFER_SIZE=512
 -DSTM32H747xx
 -DTARGET_CORDIO
 -DTARGET_CORTEX
diff --git a/variants/NICLA_VISION/conf/mbed_app.json b/variants/NICLA_VISION/conf/mbed_app.json
index 553ab954e..6d743d296 100644
--- a/variants/NICLA_VISION/conf/mbed_app.json
+++ b/variants/NICLA_VISION/conf/mbed_app.json
@@ -17,7 +17,7 @@
         "VIRTIO_DRIVER_ONLY",
         "NO_ATOMIC_64_SUPPORT",
         "METAL_MAX_DEVICE_REGIONS=2",
-        "RPMSG_BUFFER_SIZE=100"
+        "RPMSG_BUFFER_SIZE=512"
       ]
     }
   }
diff --git a/variants/NICLA_VISION/defines.txt b/variants/NICLA_VISION/defines.txt
index eaea43f31..d09451cb5 100644
--- a/variants/NICLA_VISION/defines.txt
+++ b/variants/NICLA_VISION/defines.txt
@@ -54,7 +54,7 @@
 -DMETAL_MAX_DEVICE_REGIONS=2
 -DNO_ATOMIC_64_SUPPORT
 -DQSPI_NO_SAMPLE_SHIFT
--DRPMSG_BUFFER_SIZE=2048
+-DRPMSG_BUFFER_SIZE=512
 -DSTM32H747xx
 -DT1oI2C
 -DT1oI2C_UM11225
diff --git a/variants/OPTA/conf/mbed_app.json b/variants/OPTA/conf/mbed_app.json
index 18b610287..0fb7e9221 100644
--- a/variants/OPTA/conf/mbed_app.json
+++ b/variants/OPTA/conf/mbed_app.json
@@ -16,7 +16,7 @@
         "VIRTIO_DRIVER_ONLY",
         "NO_ATOMIC_64_SUPPORT",
         "METAL_MAX_DEVICE_REGIONS=2",
-        "RPMSG_BUFFER_SIZE=2048"
+        "RPMSG_BUFFER_SIZE=512"
       ]
     }
   }
diff --git a/variants/OPTA/defines.txt b/variants/OPTA/defines.txt
index fb131c3fe..55893ba4b 100644
--- a/variants/OPTA/defines.txt
+++ b/variants/OPTA/defines.txt
@@ -53,7 +53,7 @@
 -DMETAL_MAX_DEVICE_REGIONS=2
 -DNO_ATOMIC_64_SUPPORT
 -DQSPI_NO_SAMPLE_SHIFT
--DRPMSG_BUFFER_SIZE=2048
+-DRPMSG_BUFFER_SIZE=512
 -DSTM32H747xx
 -DTARGET_CORDIO
 -DTARGET_CORTEX
diff --git a/variants/PORTENTA_H7_M7/conf/mbed_app.json b/variants/PORTENTA_H7_M7/conf/mbed_app.json
index 4bae63635..2ab0fddc5 100644
--- a/variants/PORTENTA_H7_M7/conf/mbed_app.json
+++ b/variants/PORTENTA_H7_M7/conf/mbed_app.json
@@ -22,7 +22,7 @@
         "VIRTIO_DRIVER_ONLY",
         "NO_ATOMIC_64_SUPPORT",
         "METAL_MAX_DEVICE_REGIONS=2",
-        "RPMSG_BUFFER_SIZE=2048",
+        "RPMSG_BUFFER_SIZE=512",
         "LSE_STARTUP_TIMEOUT=200"
       ]
     }
diff --git a/variants/PORTENTA_H7_M7/defines.txt b/variants/PORTENTA_H7_M7/defines.txt
index 2f2a91609..03c4a4bb6 100644
--- a/variants/PORTENTA_H7_M7/defines.txt
+++ b/variants/PORTENTA_H7_M7/defines.txt
@@ -55,7 +55,7 @@
 -DMETAL_MAX_DEVICE_REGIONS=2
 -DNO_ATOMIC_64_SUPPORT
 -DQSPI_NO_SAMPLE_SHIFT
--DRPMSG_BUFFER_SIZE=2048
+-DRPMSG_BUFFER_SIZE=512
 -DSTM32H747xx
 -DTARGET_CORDIO
 -DTARGET_CORTEX
diff --git a/variants/PORTENTA_X8/conf/mbed_app.json b/variants/PORTENTA_X8/conf/mbed_app.json
index cf1ab3cff..ca2ce1071 100644
--- a/variants/PORTENTA_X8/conf/mbed_app.json
+++ b/variants/PORTENTA_X8/conf/mbed_app.json
@@ -16,7 +16,7 @@
         "VIRTIO_DEVICE_ONLY",
         "NO_ATOMIC_64_SUPPORT",
         "METAL_MAX_DEVICE_REGIONS=2",
-        "RPMSG_BUFFER_SIZE=2048"
+        "RPMSG_BUFFER_SIZE=512"
       ]
     }
   }
diff --git a/variants/PORTENTA_X8/defines.txt b/variants/PORTENTA_X8/defines.txt
index 049ba9c17..054194015 100644
--- a/variants/PORTENTA_X8/defines.txt
+++ b/variants/PORTENTA_X8/defines.txt
@@ -44,7 +44,7 @@
 -DMETAL_MAX_DEVICE_REGIONS=2
 -DNO_ATOMIC_64_SUPPORT
 -DNO_VTOR_RELOCATE
--DRPMSG_BUFFER_SIZE=2048
+-DRPMSG_BUFFER_SIZE=512
 -DSTM32H747xx
 -DTARGET_CORTEX
 -DTARGET_CORTEX_M

From 7c1cb26ca6bbcc14bcf7c5318efa08107899a482 Mon Sep 17 00:00:00 2001
From: iabdalkader <i.abdalkader@gmail.com>
Date: Mon, 15 Jan 2024 15:05:12 +0200
Subject: [PATCH 2/2] libraries/RPC: Update examples.

Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
---
 .../examples/Basic_AddSub/Basic_AddSub.ino    | 30 +++++++++++++++++--
 .../examples/MD5_Checksum/MD5_Checksum.ino    |  4 ++-
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino b/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino
index e2dc9d514..2df49f0c0 100644
--- a/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino
+++ b/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino
@@ -4,22 +4,46 @@ int add(int a, int b) {
   return a + b;
 }
 
-void setup() {  
+int sub(int a, int b) {
+  return a - b;
+}
+
+void setup() {
+  Serial.begin(115200);
+  while (!Serial) {
+
+  }
+
   RPC.begin();
   RPC.bind("add", add);
+  RPC.bind("sub", sub);
+  if (HAL_GetCurrentCPUID() == CM7_CPUID) {
+    // Introduce a brief delay to allow the M4 sufficient time
+    // to bind remote functions before invoking them.
+    delay(100);
+  }
   pinMode(LEDG, OUTPUT);
 }
 
 void loop() {
   static size_t loop_count = 0;
+
   // Blink every 512 iterations
-  if ((loop_count++ % 512) == 0) {
+  if (HAL_GetCurrentCPUID() == CM4_CPUID && (loop_count++ % 512) == 0) {
     digitalWrite(LEDG, LOW);
     delay(10);
     digitalWrite(LEDG, HIGH);
     delay(10);
   }
+
   int res = RPC.call("add", 1, 2).as<int>();
-  RPC.call("sub", res, 1).as<int>();
+  if (HAL_GetCurrentCPUID() == CM7_CPUID) {
+    Serial.println("add(1, 2) = " + String(res));
+  }
+
+  res = RPC.call("sub", res, 1).as<int>();
+  if (HAL_GetCurrentCPUID() == CM7_CPUID) {
+    Serial.println("sub(3, 1) = " + String(res));
+  }
   delay(250);
 }
diff --git a/libraries/RPC/examples/MD5_Checksum/MD5_Checksum.ino b/libraries/RPC/examples/MD5_Checksum/MD5_Checksum.ino
index 7784548e4..ea6ffc502 100644
--- a/libraries/RPC/examples/MD5_Checksum/MD5_Checksum.ino
+++ b/libraries/RPC/examples/MD5_Checksum/MD5_Checksum.ino
@@ -7,7 +7,7 @@ size_t hash_out_count = 0;
 #ifdef CORE_CM4
 size_t data_buf_size = 0;
 #else
-size_t data_buf_size = 512;
+size_t data_buf_size = 256;
 #endif
 
 typedef std::vector<byte> vec_t;
@@ -59,6 +59,8 @@ void setup() {
     #ifdef CORE_CM4
     RPC.bind("set_buffer_size", set_buffer_size);    
     #else
+    // Introduce a brief delay to allow the M4 sufficient time
+    // to bind remote functions before invoking them.
     delay(100);
     auto ret = RPC.call("set_buffer_size", data_buf_size).as<size_t>();
     #endif