Arduino不能以高值运行

问题描述

我有下面的代码(cod01),我需要将其转换为Arduino的代码(cod02)。它处理Eratosthenes Sieve算法(从上限查找素数)。 cod01可以完美工作,并且已经过测试,其值大于1000000,并且始终可以运行。我将其转换为Arduino,但它只能工作到1768年。我需要它工作到2000年,有人可以帮助我吗?

//cod01
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define MAX 7
 
int main(){
  int i,j;
  int limite;
  char ehprimo[MAX];
  int cont=0;

  for(i=2;i<MAX;i++) ehprimo[i]=1;
  limite = (int)sqrt(MAX);
  for(i=2;i<=limite;i++){
    if(ehprimo[i]){
      for(j=i*i;j<MAX;j=j+i)
        ehprimo[j] = 0;
    }
  }

  for(i=2;i<MAX;i++){
    if(ehprimo[i]){
      printf("%d\t",i);
    }
  }
return 0;
}

//cod02
#define MAX 2000
  
  int i,j;
  int limite;
  char ehprimo[MAX];
  int cont=0;

void setup() {

  Serial.begin(9600);
  
  for(i=2;i<MAX;i++) ehprimo[i]=1;
  limite = (int)sqrt(MAX);
  for(i=2;i<=limite;i++){
    if(ehprimo[i]){
      for(j=i*i;j<MAX;j=j+i)
        ehprimo[j] = 0;
    }
  }

   for(i=2;i<MAX;i++){
    if(ehprimo[i]){
      Serial.print("\t");
      Serial.print(i);
    }
  }
  
}

void loop() {

}

解决方法

您的代码仅需要大量RAM。

Arduino Uno(带有ATmega328P µC)仅具有2048字节SRAM。

如果您在行中保留2000字节

#define MAX 2000
char ehprimo[MAX];

堆栈和Arduino框架所剩无几。

您必须减少内存消耗或选择具有更多SRAM的µC。