@@ -54,6 +54,26 @@ uint32_t cyclesToWrite_nKx16(int n, unsigned short *x) {
54
54
return ESP.getCycleCount () - b;
55
55
}
56
56
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
+
57
77
uint32_t cyclesToRead_nKx8 (int n, unsigned char *x, uint32_t *res) {
58
78
uint32_t b = ESP.getCycleCount ();
59
79
uint32_t sum = 0 ;
@@ -97,6 +117,27 @@ uint32_t cyclesToWrite_nKx16_viaInline(int n, unsigned short *x) {
97
117
return ESP.getCycleCount () - b;
98
118
}
99
119
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
+
100
141
uint32_t cyclesToRead_nKx8_viaInline (int n, unsigned char *x, uint32_t *res) {
101
142
uint32_t b = ESP.getCycleCount ();
102
143
uint32_t sum = 0 ;
@@ -118,39 +159,95 @@ uint32_t cyclesToWrite_nKx8_viaInline(int n, unsigned char*x) {
118
159
return ESP.getCycleCount () - b;
119
160
}
120
161
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 ;
123
164
uint32_t t;
165
+ bool success = true ;
166
+ int sres, verify_sres;
124
167
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);
129
177
130
178
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 ));
132
180
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
+ }
134
188
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
+ }
139
199
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);
144
226
145
227
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 ));
147
229
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
+ }
149
237
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;
154
251
}
155
252
156
253
void setup () {
@@ -207,22 +304,32 @@ void setup() {
207
304
uint32_t res;
208
305
uint32_t t;
209
306
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 " );;
216
308
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 ));
218
310
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);
224
317
Serial.println ();
225
318
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
+
226
333
#ifdef USE_SET_IRAM_HEAP
227
334
// Let's use IRAM heap to make a big ole' String
228
335
ESP.setIramHeap ();
0 commit comments