@@ -54,6 +54,26 @@ uint32_t cyclesToWrite_nKx16(int n, unsigned short *x) {
5454 return ESP.getCycleCount () - b;
5555}
5656
57+ uint32_t cyclesToRead_nKxs16 (int n, short *x, int32_t *res) {
58+ uint32_t b = ESP.getCycleCount ();
59+ int32_t sum = 0 ;
60+ for (int i = 0 ; i < n * 1024 ; i++) {
61+ sum += *(x++);
62+ }
63+ *res = sum;
64+ return ESP.getCycleCount () - b;
65+ }
66+
67+ uint32_t cyclesToWrite_nKxs16 (int n, short *x) {
68+ uint32_t b = ESP.getCycleCount ();
69+ int32_t sum = 0 ;
70+ for (int i = 0 ; i < n * 1024 ; i++) {
71+ sum += i;
72+ *(x++) = sum;
73+ }
74+ return ESP.getCycleCount () - b;
75+ }
76+
5777uint32_t cyclesToRead_nKx8 (int n, unsigned char *x, uint32_t *res) {
5878 uint32_t b = ESP.getCycleCount ();
5979 uint32_t sum = 0 ;
@@ -97,6 +117,27 @@ uint32_t cyclesToWrite_nKx16_viaInline(int n, unsigned short *x) {
97117 return ESP.getCycleCount () - b;
98118}
99119
120+ uint32_t cyclesToRead_nKxs16_viaInline (int n, short *x, int32_t *res) {
121+ uint32_t b = ESP.getCycleCount ();
122+ int32_t sum = 0 ;
123+ for (int i = 0 ; i < n * 1024 ; i++) {
124+ sum += mmu_get_int16 (x++); // *(x++);
125+ }
126+ *res = sum;
127+ return ESP.getCycleCount () - b;
128+ }
129+
130+ uint32_t cyclesToWrite_nKxs16_viaInline (int n, short *x) {
131+ uint32_t b = ESP.getCycleCount ();
132+ int32_t sum = 0 ;
133+ for (int i = 0 ; i < n * 1024 ; i++) {
134+ sum += i;
135+ // *(x++) = sum;
136+ mmu_set_int16 (x++, sum);
137+ }
138+ return ESP.getCycleCount () - b;
139+ }
140+
100141uint32_t cyclesToRead_nKx8_viaInline (int n, unsigned char *x, uint32_t *res) {
101142 uint32_t b = ESP.getCycleCount ();
102143 uint32_t sum = 0 ;
@@ -118,39 +159,95 @@ uint32_t cyclesToWrite_nKx8_viaInline(int n, unsigned char*x) {
118159 return ESP.getCycleCount () - b;
119160}
120161
121- void perfTest_nK (int nK, uint32_t *mem, uint32_t *imem) {
122- uint32_t res;
162+ bool perfTest_nK (int nK, uint32_t *mem, uint32_t *imem) {
163+ uint32_t res, verify_res ;
123164 uint32_t t;
165+ bool success = true ;
166+ int sres, verify_sres;
124167
125- t = cyclesToWrite_nKx16 (nK, (uint16_t *)imem);
126- Serial.printf (" IRAM Memory Write: %6d cycles for %dK by 16, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
127- t = cyclesToRead_nKx16 (nK, (uint16_t *)imem, &res);
128- Serial.printf (" IRAM Memory Read: %6d cycles for %dK by 16, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), res);
168+ Serial.printf (" \r\n Performance numbers for 16 bit access - using inline macros or exception handling for IRAM.\r\n " );;
169+ t = cyclesToWrite_nKx16 (nK, (uint16_t *)mem);
170+ Serial.printf (" DRAM Memory Write: %7d cycles for %dK by uint16, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
171+ t = cyclesToRead_nKx16 (nK, (uint16_t *)mem, &verify_res);
172+ Serial.printf (" DRAM Memory Read: %7d cycles for %dK by uint16, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), verify_res);
173+ t = cyclesToWrite_nKxs16 (nK, (int16_t *)mem);
174+ Serial.printf (" DRAM Memory Write: %7d cycles for %dK by int16, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
175+ t = cyclesToRead_nKxs16 (nK, (int16_t *)mem, &verify_sres);
176+ Serial.printf (" DRAM Memory Read: %7d cycles for %dK by int16, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), verify_sres);
129177
130178 t = cyclesToWrite_nKx16_viaInline (nK, (uint16_t *)imem);
131- Serial.printf (" IRAM Memory Write Inline: %6d cycles for %dK by 16 , %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
179+ Serial.printf (" IRAM Memory Write Inline: %7d cycles for %dK by uint16 , %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
132180 t = cyclesToRead_nKx16_viaInline (nK, (uint16_t *)imem, &res);
133- Serial.printf (" IRAM Memory Read Inline: %6d cycles for %dK by 16, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), res);
181+ Serial.printf (" IRAM Memory Read Inline: %7d cycles for %dK by uint16, %3d AVG cycles/transfer (sum %08x) " , t, nK, t / (nK * 1024 ), res);
182+ if (res == verify_res) {
183+ Serial.printf (" - passed\r\n " );
184+ } else {
185+ Serial.printf (" != (sum %08x ) - failed\r\n " , verify_res);
186+ success = false ;
187+ }
134188
135- t = cyclesToWrite_nKx16 (nK, (uint16_t *)mem);
136- Serial.printf (" DRAM Memory Write: %6d cycles for %dK by 16, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
137- t = cyclesToRead_nKx16 (nK, (uint16_t *)mem, &res);
138- Serial.printf (" DRAM Memory Read: %6d cycles for %dK by 16, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), res);
189+ t = cyclesToWrite_nKxs16_viaInline (nK, (int16_t *)imem);
190+ Serial.printf (" IRAM Memory Write Inline: %7d cycles for %dK by int16, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
191+ t = cyclesToRead_nKxs16_viaInline (nK, (int16_t *)imem, &sres);
192+ Serial.printf (" IRAM Memory Read Inline: %7d cycles for %dK by int16, %3d AVG cycles/transfer (sum %08x) " , t, nK, t / (nK * 1024 ), sres);
193+ if (sres == verify_sres) {
194+ Serial.printf (" - passed\r\n " );
195+ } else {
196+ Serial.printf (" != (sum %08x ) - failed\r\n " , verify_sres);
197+ success = false ;
198+ }
139199
140- t = cyclesToWrite_nKx8 (nK, (uint8_t *)imem);
141- Serial.printf (" IRAM Memory Write: %6d cycles for %dK by 8, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
142- t = cyclesToRead_nKx8 (nK, (uint8_t *)imem, &res);
143- Serial.printf (" IRAM Memory Read: %6d cycles for %dK by 8, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), res);
200+ t = cyclesToWrite_nKx16 (nK, (uint16_t *)imem);
201+ Serial.printf (" IRAM Memory Write: %7d cycles for %dK by uint16, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
202+ t = cyclesToRead_nKx16 (nK, (uint16_t *)imem, &res);
203+ Serial.printf (" IRAM Memory Read: %7d cycles for %dK by uint16, %3d AVG cycles/transfer (sum %08x) " , t, nK, t / (nK * 1024 ), res);
204+ if (res == verify_res) {
205+ Serial.printf (" - passed\r\n " );
206+ } else {
207+ Serial.printf (" != (sum %08x ) - failed\r\n " , verify_res);
208+ success = false ;
209+ }
210+ t = cyclesToWrite_nKxs16 (nK, (int16_t *)imem);
211+ Serial.printf (" IRAM Memory Write: %7d cycles for %dK by int16, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
212+ t = cyclesToRead_nKxs16 (nK, (int16_t *)imem, &sres);
213+ Serial.printf (" IRAM Memory Read: %7d cycles for %dK by int16, %3d AVG cycles/transfer (sum %08x) " , t, nK, t / (nK * 1024 ), sres);
214+ if (sres == verify_sres) {
215+ Serial.printf (" - passed\r\n " );
216+ } else {
217+ Serial.printf (" != (sum %08x ) - failed\r\n " , verify_sres);
218+ success = false ;
219+ }
220+
221+ Serial.printf (" \r\n Performance numbers for 8 bit access - using inline macros or exception handling for IRAM access.\r\n " );;
222+ t = cyclesToWrite_nKx8 (nK, (uint8_t *)mem);
223+ Serial.printf (" DRAM Memory Write: %7d cycles for %dK by uint8, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
224+ t = cyclesToRead_nKx8 (nK, (uint8_t *)mem, &verify_res);
225+ Serial.printf (" DRAM Memory Read: %7d cycles for %dK by uint8, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), verify_res);
144226
145227 t = cyclesToWrite_nKx8_viaInline (nK, (uint8_t *)imem);
146- Serial.printf (" IRAM Memory Write Inline: %6d cycles for %dK by 8 , %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
228+ Serial.printf (" IRAM Memory Write Inline: %7d cycles for %dK by uint8 , %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
147229 t = cyclesToRead_nKx8_viaInline (nK, (uint8_t *)imem, &res);
148- Serial.printf (" IRAM Memory Read Inline: %6d cycles for %dK by 8, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), res);
230+ Serial.printf (" IRAM Memory Read Inline: %7d cycles for %dK by uint8, %3d AVG cycles/transfer (sum %08x) " , t, nK, t / (nK * 1024 ), res);
231+ if (res == verify_res) {
232+ Serial.printf (" - passed\r\n " );
233+ } else {
234+ Serial.printf (" != (sum %08x ) - failed\r\n " , verify_res);
235+ success = false ;
236+ }
149237
150- t = cyclesToWrite_nKx8 (nK, (uint8_t *)mem);
151- Serial.printf (" DRAM Memory Write: %6d cycles for %dK by 8, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
152- t = cyclesToRead_nKx8 (nK, (uint8_t *)mem, &res);
153- Serial.printf (" DRAM Memory Read: %6d cycles for %dK by 8, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), res);
238+ t = cyclesToWrite_nKx8 (nK, (uint8_t *)imem);
239+ Serial.printf (" IRAM Memory Write: %7d cycles for %dK by uint8, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
240+ t = cyclesToRead_nKx8 (nK, (uint8_t *)imem, &res);
241+ Serial.printf (" IRAM Memory Read: %7d cycles for %dK by uint8, %3d AVG cycles/transfer (sum %08x) " , t, nK, t / (nK * 1024 ), res);
242+ if (res == verify_res) {
243+ Serial.printf (" - passed\r\n " );
244+ } else {
245+ Serial.printf (" != (sum %08x ) - failed\r\n " , verify_res);
246+ success = false ;
247+ }
248+ Serial.println ();
249+
250+ return success;
154251}
155252
156253void setup () {
@@ -207,22 +304,32 @@ void setup() {
207304 uint32_t res;
208305 uint32_t t;
209306 int nK = 1 ;
210- Serial.println ();
211- t = cyclesToWrite_nKx32 (nK, imem);
212- Serial.printf (" IRAM Memory Write: %6d cycles for %dK by 32, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
213- t = cyclesToRead_nKx32 (nK, imem, &res);
214- Serial.printf (" IRAM Memory Read: %6d cycles for %dK by 32, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), res);
215-
307+ Serial.printf (" \r\n Performance numbers for 32 bit access - no exception handler or inline macros needed.\r\n " );;
216308 t = cyclesToWrite_nKx32 (nK, mem);
217- Serial.printf (" DRAM Memory Write: %6d cycles for %dK by 32 , %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
309+ Serial.printf (" DRAM Memory Write: %7d cycles for %dK by uint32 , %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
218310 t = cyclesToRead_nKx32 (nK, mem, &res);
219- Serial.printf (" DRAM Memory Read: %6d cycles for %dK by 32, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), res);
220- Serial.println ();
221- perfTest_nK (1 , mem, imem);
222- Serial.println ();
223- perfTest_nK (4 , mem, imem);
311+ Serial.printf (" DRAM Memory Read: %7d cycles for %dK by uint32, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), res);
312+
313+ t = cyclesToWrite_nKx32 (nK, imem);
314+ Serial.printf (" IRAM Memory Write: %7d cycles for %dK by uint32, %3d AVG cycles/transfer\r\n " , t, nK, t / (nK * 1024 ));
315+ t = cyclesToRead_nKx32 (nK, imem, &res);
316+ Serial.printf (" IRAM Memory Read: %7d cycles for %dK by uint32, %3d AVG cycles/transfer (sum %08x)\r\n " , t, nK, t / (nK * 1024 ), res);
224317 Serial.println ();
225318
319+
320+ if (perfTest_nK (1 , mem, imem)) {
321+ Serial.println ();
322+ } else {
323+ Serial.println (" \r\n *******************************" );
324+ Serial.println (" *******************************" );
325+ Serial.println (" ** **" );
326+ Serial.println (" ** One or more test failed **" );
327+ Serial.println (" ** **" );
328+ Serial.println (" *******************************" );
329+ Serial.println (" *******************************\r\n " );
330+ return ;
331+ }
332+
226333#ifdef USE_SET_IRAM_HEAP
227334 // Let's use IRAM heap to make a big ole' String
228335 ESP.setIramHeap ();
0 commit comments