Skip to content

Commit 2f5979f

Browse files
authored
Verify IRAM sum results using DRAM as reference. (#7812)
Make verify fail more visible. Updated example irammem.info to show performance and test int16 handling when IRAM is used. Removed 4K performance test. It didn't show any new information over the 1K test.
1 parent f959cb3 commit 2f5979f

File tree

1 file changed

+141
-34
lines changed

1 file changed

+141
-34
lines changed

libraries/esp8266/examples/irammem/irammem.ino

+141-34
Original file line numberDiff line numberDiff line change
@@ -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+
5777
uint32_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+
100141
uint32_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\nPerformance 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\nPerformance 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

156253
void 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\nPerformance 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

Comments
 (0)