Для тестирования ESP8266 ( и возможно ESP32) использовать этот код. Кстати, этот код же можно использовать под другие платформы, самое важное улучшение по сравнению с оригинальным кодом (не влияет на быстроту исполнения, но предупреждает вылеты) рабочий массив чисел перенесен в свободную оперативку ( A=(uint8_t*) malloc(len); )
#include <ESP8266WiFi.h>
#include <math.h>
#ifdef ESP8266
extern "C" {
#include "user_interface.h"
}
#endif
#define N 10000
//#define ENABLE_PRINT
void setup(void) {
Serial.begin(921600);
system_update_cpu_freq(SYS_CPU_160MHZ);
}
void loop() {
uint32_t len = floor(10 * N/3) + 1;
uint32_t freeM = system_get_free_heap_size();
Serial.print("Free memory:");
Serial.println(freeM);
Serial.print("buffer length:");
Serial.println(len);
delay(1000);
uint8_t* A;
uint8_t have_a_rest_timeout=20;
A=(uint8_t*) malloc(len);
freeM = system_get_free_heap_size();
Serial.print("Free memory:");
Serial.println(freeM);
unsigned long tim;
tim = millis();
memset(A,2,len);
int nines = 0;
int predigit = 0;
for(uint16_t j = 1; j < N + 1; ++j) {
int q = 0;
for(uint16_t i = len; i > 0; --i) {
int x = 10 * A[i-1] + q*i;
A[i-1] = x % (2*i - 1);
q = x / (2*i - 1);
//yield();
}
have_a_rest_timeout--;
if (!have_a_rest_timeout){
have_a_rest_timeout=20;
yield();
}
A[0] = q%10;
q = q/10;
if (9 == q) {
++nines;
}
else if (10 == q) {
#ifdef ENABLE_PRINT
Serial.print(predigit + 1);
#endif
for (uint16_t k = 0; k < nines; ++k) {
#ifdef ENABLE_PRINT
Serial.print("0");
#endif
}
predigit, nines = 0;
}
else {
#ifdef ENABLE_PRINT
Serial.print(predigit);
#endif
predigit = q;
if (0 != nines) {
for (uint16_t k = 0; k < nines; ++k) {
#ifdef ENABLE_PRINT
Serial.print("9");
#endif
}
nines = 0;
}
}
}
free(A );
#ifdef ENABLE_PRINT
Serial.println(predigit);
#endif
tim = millis()-tim;
Serial.print("Time : ");
Serial.println(tim/1000.0f,4);
delay(5000);
}
П.С. Могу так же протестировать на Orange Pi Lite