Go Down

Topic: Wie kann ich meinen Code vereinfachen? (Read 2047 times) previous topic - next topic

jurs


Was würde Arbeitsspeicher sparen?


Es würde z.B. Arbeitsspeicher sparen, wenn Du
a) Texte einsparst
b) Texte in den PROGMEM Speicher verschiebst

Einsparen kannst Du z.B. bei immer wieder in leicher Variation auftretenden Texten wie z.B.
"Code Frage 15 erkannt"
indem Du eine Funktion schreibst, die den Text und die jeweils andere Zahl ausgibt. Dann müssen nicht jedesmal eine leicht unterschiedliche Variante des Textes gespeichert werden.

SvenM

#16
Jan 02, 2013, 08:48 pm Last Edit: Jan 02, 2013, 09:26 pm by SvenM Reason: 1
Verstehe.

Die seriellen Ausgaben werden am Ende überhaupt nicht mehr gebraucht. Also können diese relativ schnell entfallen.

Würde es etwas bringen wenn in die Dateinamen in der funktionsübergabe in den Progmem Speicher verlege?
Und falls ja, wir rufe ich die dann ab und übergebe sie an meine Funktion. Das Abspeichern dort sollte ich noch hinbekommen.

Da war doch etwas mit pointer.

Das Speichern sollte auf diesem Wag klappen? oder?

Quote
prog_uchar F1[] PROGMEM  = {"startp.txt"};


Der Funktionsaufruf dann so?

Quote
printMyFile(F1);


Könnte ich es auch in ein mehrdimensionales array packen?

Grüße
Sven

SvenM

Mal wieder einen kleinen zwischenstand.

Also der Server läuft wieder. Schon mal toll. Die Anfragen kommen rein.
Werden aber noch nicht abgearbeitet bzw. zugeordnet.

Ich habe versucht die eben angesprochene verlagerung in Flash umzusetzen. Aber ich habe keine wirkliche
Einsparung hinbekommen (50Bytes).

Welche Art des Aufrufs ist die richtig für mich? Siehe anhang.
Ich meine im besonderen die übergabe des Dateinamens an meine funktion und den auszuwertenden "Code"
an meine IF abfrage.

Grüße
Sven


Quote
#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
#include <avr/pgmspace.h>

prog_char F1[] PROGMEM  = {"startp.txt"};
prog_char F2[] PROGMEM  = {"zsperr.txt"};
prog_char F3[] PROGMEM  = {"0101fr.txt"};
prog_char F4[] PROGMEM  = {""};
prog_char F5[] PROGMEM  = {""};
prog_char F6[] PROGMEM  = {"0102fr.txt"};
prog_char F7[] PROGMEM  = {""};
prog_char F8[] PROGMEM  = {""};
prog_char F9[] PROGMEM  = {"0103fr.txt"};
prog_char F10[] PROGMEM = {""};
prog_char F11[] PROGMEM = {""};
prog_char F12[] PROGMEM = {"0104fr.txt"};
prog_char F13[] PROGMEM = {""};
prog_char F14[] PROGMEM = {""};
prog_char F15[] PROGMEM = {"0105fr.txt"};
prog_char F16[] PROGMEM = {""};
prog_char F17[] PROGMEM = {""};
prog_char F18[] PROGMEM = {"0106fr.txt"};
prog_char F19[] PROGMEM = {""};
prog_char F20[] PROGMEM = {""};
prog_char F21[] PROGMEM = {"0107fr.txt"};
prog_char F22[] PROGMEM = {""};
prog_char F23[] PROGMEM = {""};
prog_char F24[] PROGMEM = {"0108fr.txt"};
prog_char F25[] PROGMEM = {""};
prog_char F26[] PROGMEM = {""};
prog_char F27[] PROGMEM = {"0109fr.txt"};
prog_char F28[] PROGMEM = {""};
prog_char F29[] PROGMEM = {""};
prog_char F30[] PROGMEM = {"0110fr.txt"};
prog_char F31[] PROGMEM = {""};
prog_char F32[] PROGMEM = {""};
prog_char F33[] PROGMEM = {"0111fr.txt"};
prog_char F34[] PROGMEM = {""};
prog_char F35[] PROGMEM = {""};
prog_char F36[] PROGMEM = {"0112fr.txt"};
prog_char F37[] PROGMEM = {""};
prog_char F38[] PROGMEM = {""};
prog_char F39[] PROGMEM = {"0113fr.txt"};
prog_char F40[] PROGMEM = {""};
prog_char F41[] PROGMEM = {""};
prog_char F42[] PROGMEM = {"0114fr.txt"};
prog_char F43[] PROGMEM = {""};
prog_char F44[] PROGMEM = {""};
prog_char F45[] PROGMEM = {"0115fr.txt"};
prog_char F46[] PROGMEM = {""};
prog_char F47[] PROGMEM = {""};
prog_char F48[] PROGMEM = {"spende.txt"};

PROGMEM const char *Quest_table[] =    
{  
  F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9, F10,
 F11, F12, F13, F14, F15, F16, F17, F18, F19, F20,
 F21, F22, F23, F24, F25, F26, F27, F28, F29, F30,
 F31, F32, F33, F34, F35, F36, F37, F38, F39, F40,
 F41, F42, F43, F44, F45, F46, F47, F48
};

prog_char J2[] PROGMEM  = {"Code=36811"};
prog_char J3[] PROGMEM  = {"Code=63026"};
prog_char J4[] PROGMEM  = {"Code=98222"};
prog_char J5[] PROGMEM  = {"Code=23284"};
prog_char J6[] PROGMEM  = {"Code=88168"};
prog_char J7[] PROGMEM  = {"Code=47022"};
prog_char J8[] PROGMEM  = {"Code=20692"};
prog_char J9[] PROGMEM  = {"Code=80692"};
prog_char J10[] PROGMEM = {"Code=39762"};
prog_char J11[] PROGMEM = {"Code=46047"};
prog_char J12[] PROGMEM = {"Code=97346"};
prog_char J13[] PROGMEM = {"Code=68095"};
prog_char J14[] PROGMEM = {"Code=92060"};
prog_char J15[] PROGMEM = {"Code=05860"};

PROGMEM const char *Joker_table[] =    
{  
       J2,  J3,  J4,  J5,
  J6,  J7,  J8,  J9, J10,
 J11, J12, J13, J14, J15,
};

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x65, 0x3A };
byte ip[] = { 192, 168, 1, 2 };
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };

char JokerBuffer[11];
char FileBuffer [11];

EthernetServer server(80); //server port

String readString;

long Sperrzeit         = 1200000; // 20min = 1 200 000
long Abschaltzeit      = 1500000; // 25min = 1 500 000
long LetzteZeitSperr;             // Sperrzeit bei Falscher Antwort
long LetzteZeitAus;               // Zeit um Aus Automatisch

int Fragencounter      = 0;       // Zähler aktuelle Frage
int AusPin             = 5;       // Pin mit Relais Aus
int StatusAusPin       = LOW;     // Statusspeicher des Relais für AUS
int StatusFalscheFrage = LOW;     // Frage Falsch = Sperrzeit abwarten

void setup(){

 Serial.begin(9600);

 pinMode(10,OUTPUT);
 
 digitalWrite(10,HIGH);
 Serial.print("SD..");
 if(!SD.begin(4)) Serial.println("Err");
 else Serial.println("Ok");
 delay(3000);
 
 Ethernet.begin(mac, ip, gateway, subnet);
 digitalWrite(10,HIGH);

 server.begin();
 Serial.println("Rdy");
}
 
EthernetClient client;

void loop(){
/* // ------------------------------------------------------------------------- Abschaltzeit  
 if (millis() - LetzteZeitAus > LetzteZeitAus) {
     StatusAusPin = false; }
   else {
     StatusAusPin = true;
     digitalWrite(AusPin, StatusAusPin);
 }

// ------------------------------------------------------------------------- Sperrzeit falsche Frage  
 if (StatusFalscheFrage = HIGH) {
   if (millis() - LetzteZeitSperr > Sperrzeit) {
     StatusFalscheFrage = HIGH; }
   else {
     StatusFalscheFrage = LOW;
   }
 }  */

// ------------------------------------------------------------------------- Create a client connection
 client = server.available();
 if (client) {
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
       if (readString.length() < 100) {             //read char by char HTTP request
         readString += c;                           //store characters to string
       }
       if (c == '\n') {                             //if HTTP request has ended
           
         Serial.println(readString);                //print to serial monitor for debuging
         Serial.println(J2);
         //LetzteZeitAus = millis();  
// ------------------------------------------------------------------------- Programmstand erkennen
         if(readString.indexOf(J2) > -1) {             //// --- Code Frage 2
         //  Serial.println("Code Frage 2 erkannt");
           Fragencounter = 2;
           strcpy_P(FileBuffer, (char*)pgm_read_word(&(Quest_table[6])));
           printMyFile(FileBuffer);.......................................................................................  
 
           .........................................Fragencounter = 15;
           printMyFile(F45);
         }          
         else if (readString.indexOf("Joker+einl") > -1) {       //// --- Kein Code eingegeben
         //  Serial.println("Kein Code eingegeben");
             Fragencounter = 0;
             printMyFile(F1);
         }
         else if(readString.indexOf("Neu=Neues+Spiel") > -1) {     // ----- Neues Spiel
           Serial.println("Neu Zeit");
           if  (StatusFalscheFrage == HIGH) {
           //  Serial.println("Neustart gesperrt");
             printMyFile(F2);
           }
           else if (StatusFalscheFrage == LOW) {
             Serial.println("Neu frei");
             Fragencounter = 1;
             printMyFile(F3);
           }
         }
         else if(Fragencounter >> 1 && readString.indexOf("Antw=") > -1) {     // ----- Frage 1
           Serial.println("Antw");
           if (readString.indexOf("Antw=B") > -1) {                      //// --- Richtig
             Serial.println("Ok"); }
           else {
             Serial.println("Err");
           }
         }
         else {                                                               // ----- Nichts erkannt - neuladen
             Serial.println("neuladen");
             printMyFile(F1);
         }
         }
   //      client.stop();
   //      readString="";
       }
     }
   }
 }


// ------------------------------------------------------------------------- Client ausgeben

void printMyFile(char* filename) {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println();
  File myFile = SD.open(filename);
  if (myFile) {
    while (myFile.available()) {
      client.write(myFile.read());
    }
    myFile.close();
  }
  delay(1000);
}
 

michael_x

Quote
Was würde Arbeitsspeicher sparen?

Nachdem du schon viele feste Texte ins PROGMEM gepackt hast,
kommt als nächstes, den String readString; rauszuschmeissen.

        readString += c;                           //store characters to string
Ist eine der aufwendigsten Operationen, die du dir (nicht) vorstellen kannst.

        else if(readString.indexOf("Neu=Neues+Spiel") > -1) {     // ----- Neues Spiel

für solche Sachen ist ein Arduino als Web-Server auch nicht optimal ...

SvenM

Hallo,

so mein Programm hat sich wieder weiterentwickelt. Die einzelnen IF-Abfrage wurden nun durch Schleifen ersetzt usw...
Trotzdem knapse ich an der Grenze meines Arbeitsspeichers herum.

@Michael_x und alle anderen:

Gibts eine Möglichekit diesen vorher angesprochenen

Quote
readString += c;


so zu verändern das mein Webserver immer noch unverändert läuft, ich aber weniger Speicher verbrauche?

Grüße
Sven

michael_x

Quote
Gibts eine Möglichekit diesen vorher angesprochenen
readString += c;
so zu verändern das mein Webserver immer noch unverändert läuft, ich aber weniger Speicher verbrauche?


z.B. wie hier
statt readString wird hier ein statisches char array clientline verwendet.

Code: [Select]
#define BUFSIZ 80  //defines the buffer size.  reduce size if less ram is available.
char clientline[BUFSIZ];

void loop() {
  EthernetClient client = server.available();
  if (client) {
    boolean current_line_is_blank = true;
    index = 0;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          if (index < BUFSIZ-1)
            index++;
          continue;
        }
        clientline[index] = 0;
        Serial.println(clientline);
        // ... clientline auswerten
      }
    }
  }
}

Mit einfach auszuwertenden Paramtern in der URL machst du dir das Leben leichter ( Es gibt sinnvolleres als deinen knappen RAM bzw die clientline auf das Vorkommen von "Neu=Neues+Spiel" -- was auch im RAM liegt -- zu durchsuchen ... )
Die clientline schon auszuwerten während sie gelesen wird, und allen unnötigen Schnickschnack erst gar nicht zu speichern,  ist noch ausgefuchster.

Go Up