diff --git a/arduino/v5.3/prime_logging_stm32f411/prime_logging_stm32f411.ino b/arduino/v5.3/prime_logging_stm32f411/prime_logging_stm32f411.ino index fc02b99..071276b 100644 --- a/arduino/v5.3/prime_logging_stm32f411/prime_logging_stm32f411.ino +++ b/arduino/v5.3/prime_logging_stm32f411/prime_logging_stm32f411.ino @@ -1,17 +1,17 @@ -/* Prime numbers in Arduino C v5.3 2023/12/14 for esp32-s2 */ +/* Prime numbers in Arduino C v5.4 2023/12/14 for STM32F411CEU6 */ #include #include - +#include double start; int column = 10; int found = 4; // we already know 2, 3, 5, 7 int divisors = found; -int primes[3400] = {3, 5, 7}; -int led = 15; // LED_BUILDIN +uint32_t primes[6550] = {3, 5, 7}; +int led = 13; // LED_BUILTIN -int is_prime(int number) { +int is_prime(uint32_t number) { int prime = 1; for (int divider = 3; divider < (int)(sqrt(number)) + 1; divider += 2) { @@ -24,8 +24,8 @@ int is_prime(int number) { return prime; } -int find_primes(int limit) { - for(int number=11; number < limit + 1; number += 2) { +int find_primes(uint32_t limit) { + for(uint32_t number=11; number < limit + 1; number += 2) { if( is_prime(number) == 1) { primes[found - 1] = number; found++; @@ -36,15 +36,11 @@ int find_primes(int limit) { return 1; } -int is_prime_fast(int number) { - int largest_divider = (int)(sqrt(number)); +int is_prime_fast(uint32_t number) { + uint32_t largest_divider = (int)(sqrt(number)); int flag_prime = 1; - // Serial.print(number); - // Serial.print(" - "); for(int i=0; i < divisors; i++) { - // Serial.print(primes[i]); - // Serial.print(" "); if(number % primes[i] == 0) { flag_prime = 0; @@ -55,7 +51,6 @@ int is_prime_fast(int number) { break; } } - // Serial.print("\n"); return flag_prime; } @@ -79,37 +74,35 @@ void setup() { Serial.print("."); delay(1000); } - const int scope[] = {100, 1000, 10000, 100000, 1000000, 10000000, 25000000, 100000000, 1000000000}; - const int reference[] = {25, 168, 1229, 9592, 78498, 664579, 1565927, 5761455, 50847534}; + const uint32_t scope[] = {100, 1000, 10000, 100000, 1000000, 10000000, 25000000, 100000000, 1000000000, 2147483647, 4294967295 }; + const int reference[] = {25, 168, 1229, 9592, 78498, 664579, 1565927, 5761455, 50847534, 105097564, 200000000}; // previous run - const char* pref[] = {"p100", "p1000", "p10000", "p100000", "p1000000", "p10000000", "p25000000", "p100000000", "p1000000000"}; - // Preferences preferences; - // preferences.begin("prime", true); - Serial.print("\nGet previous results for this ESP32-S2:\n"); + Serial.print("\nGet previous results for this STM32F411CEU6:\n"); Serial.print(" last seconds \n"); - for(int i = 0; i < 9; i++) { - int spaces = 11 - (int)log10(scope[i]); + for(int i = 0; i < 11; i++) { + int spaces = 12 - (int)log10(scope[i]); for(int j = 0; j < spaces; j++) { Serial.print(" "); } Serial.print(scope[i]); Serial.print(" "); - // Serial.print(preferences.getFloat(pref[i], 0), 6); + float last_time; + EEPROM.get(i * 4 + 1, last_time); + Serial.print(last_time, 6); Serial.print("\n"); } - // preferences.end(); // start calculating - for (int i = 0; i < 9; i++) // 9 + for (int i = 0; i < 11; i++) { int last = scope[i]; found = 4; // we already know 2, 3, 5, 7 - Serial.println("\n\nPrime v5.0 in Arduino C - 2023/12/14"); + Serial.println("\n\nPrime v5.4 in Arduino C - 2023/12/16"); Serial.print("Calculating prime numbers until "); Serial.println(last); - start = micros(); // use micros() for more precision - // Serial.println(start/1000000, 6); +// start = millis(); + start = micros(); // use micros() for more precision in runtimes < 70 minutes int largest_divider = (int)(sqrt(last)); if(largest_divider % 2 == 0) { @@ -123,7 +116,7 @@ void setup() { Serial.print(" to use as divisors.\n"); int dot = millis(); int column = 0; - for(int number = largest_divider + 2; number < last; number += 2) + for(uint32_t number = largest_divider + 2; number < last; number += 2) { found += is_prime_fast(number); if((millis() - dot) > 1000) { @@ -139,7 +132,7 @@ void setup() { } if(column > 40) { column = 0; - elapsed_time(dot/1000); + elapsed_time((millis()-start)/1000); Serial.print(" - "); Serial.print(number); Serial.print(" "); @@ -148,7 +141,8 @@ void setup() { } } } - float duration = (micros() - start)/1000000; +// float duration = (millis() - start)/1000; + float duration = (micros() - start)/1000000; // use micros() for more precision in runtimes < 70 minutes if(duration > 2) { Serial.print("\n"); } @@ -160,11 +154,8 @@ void setup() { Serial.print(duration, 6); Serial.print(" seconds."); elapsed_time(duration); - // preferences.begin("prime", false); - // preferences.putFloat(pref[i], duration); - // preferences.end(); + EEPROM.put(i * 4 + 1, duration); } - // preferences.end(); Serial.print("\n"); } @@ -172,9 +163,9 @@ void loop() { // program finished, just keep printing some dots for(int i = 0; i < 80; i++) { Serial.print("."); for(int x = 0; x < 100; x++) { - digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) - delay(20); // wait for a second - digitalWrite(led, LOW); // turn the LED off by making the voltage LOW + digitalWrite(led, HIGH); + delay(20); + digitalWrite(led, LOW); delay(30); } } diff --git a/arduino/v5.3/results_st,32f411.txt b/arduino/v5.3/results_st,32f411.txt new file mode 100644 index 0000000..ea9ea75 --- /dev/null +++ b/arduino/v5.3/results_st,32f411.txt @@ -0,0 +1,19 @@ +Calculating prime numbers in Arduino C v5.4.2023 +2023/12/16 +STM32F411CEU6 with 100 MHz + + last time in seconds + 100 0.000644 + 1,000 0.006408 + 10,000 0.066512 + 100,000 0.722038 + 1,000,000 8.475698 + 10,000,000 114.404968 + 25,000,000 338.672211 + 100,000,000 1851.313477 +1,000,000,000 36123.051 or 10h 2min 3s +2,417,483,647 +4,294,967,295 + + + \ No newline at end of file