miért resetel?

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
szuperp
Bitmanipulátor
Hozzászólások: 116
Csatlakozott: 2012. november 17. szombat, 7:00

miért resetel?

Hozzászólás Szerző: szuperp »

van egy függvényem,amit ha meghívok és nem hibaüzenettel tér vissza, tehát lefut az SD kártyán történő műveletsor, akkor közli, a serialon, hogy "Slot Deleted!", majd a függvényből való kilépéskor reseteli az arduino-t ... ?? miért?
van 1500 byte szabad memória ekkor...

íme a függvény:

Kód: Egész kijelölése

void DeleteSlot(byte i){
  if (i==0){
      errorMessage=1;
      Message(F("ERROR: Slot 0 could not be deleted!"));
      Serial <<  F(" ERROR: Slot 0 could not be deleted!");
    } else if(i==bootUpSlot){
      errorMessage=1;
      Message(F("ERROR: Boot Up Slot could not be deleted! Change it before delete'"));
      Serial <<  F(" ERROR: Boot Up Slot could not be deleted! Change it before delete");
  } else {
      Serial.println(F("Slot delete begin."));
      char _temp[8];      
      sprintf(_temp,"slot_%d",i);
     // digitalWrite(CS_ethernet_pin,HIGH);
     // digitalWrite(CS_sd_pin,LOW);
      if (SD.exists(_temp)){
        sprintf(_temp,"slot_%d/relays.xml",i);
        SD.remove(_temp);
        sprintf(_temp,"slot_%d/fet.xml",i);
        SD.remove(_temp);
        sprintf(_temp,"slot_%d/r_prot.xml",i);
        SD.remove(_temp);
        sprintf(_temp,"slot_%d/r_group.xml",i);
        SD.remove(_temp);
        sprintf(_temp,"slot_%d/switches.xml",i);
        SD.remove(_temp);
        sprintf(_temp,"slot_%d/globals.xml",i);
        SD.remove(_temp);
        sprintf(_temp,"slot_%d",i);
        SD.rmdir(_temp);
      }
      if (SD.exists(_temp)){
        errorMessage=1;
        Message(F("ERROR: Slot could not be deleted! Check SD card!"));
         Serial <<  F(" ERROR: Slot could not be deleted! Check SD card!");
      }else{
        Message(F("Slot Deleted!"));
        Serial.println(F("Slot Deleted!"));
      }
    }  
}
Avatar
szuperp
Bitmanipulátor
Hozzászólások: 116
Csatlakozott: 2012. november 17. szombat, 7:00

Re: miért resetel?

Hozzászólás Szerző: szuperp »

Igazából, ha egy darab SD.remove is lefut( mert lefut, ha kell mind...törli a file-okat) akkor történik meg a reset...
ha csak az SD.rmdir marad bent, akkor nincs gond.
1.0.5 arduinot használok.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: miért resetel?

Hozzászólás Szerző: Robert »

A függvényed végén resetel vagy a főprogramodba visszajut és utána?
Avatar
szuperp
Bitmanipulátor
Hozzászólások: 116
Csatlakozott: 2012. november 17. szombat, 7:00

Re: miért resetel?

Hozzászólás Szerző: szuperp »

hát ezt nem tudom... mivel a függvény végén lévő sort is lefuttatja, bármit is írok oda.... viszont a főprogram következő sora már nem fut le....
szóval valahol a kilépésnél lesz a gond.
Avatar
szuperp
Bitmanipulátor
Hozzászólások: 116
Csatlakozott: 2012. november 17. szombat, 7:00

Re: miért resetel?

Hozzászólás Szerző: szuperp »

arduino 1.6.1-el is ugyan ezt csinálja... :(
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: miért resetel?

Hozzászólás Szerző: csabeszq »

Miért ne resetelne?

Kód: Egész kijelölése

     char _temp[8];      
     sprintf(_temp,"slot_%d/relays.xml",i);
Szóval lefoglalsz a temp változónak a vermen 8 bájtot, utána beleírsz egy 20 bájtos string-et. Felülvágva a visszatérési értékeket, éppen ezért amikor kilép a függvényből halvány fogalma sem lesz arról, hogy hova fog érkezni.
Avatar
szuperp
Bitmanipulátor
Hozzászólások: 116
Csatlakozott: 2012. november 17. szombat, 7:00

Re: miért resetel?

Hozzászólás Szerző: szuperp »

ÓÓÓÓÓÓÓ!
KÖSZIIIII!
Mekkora hiba! és egy napom ráment...
de legalább felraktam az arduino 1.6.1-et... ami sokkal kevesebb SRAM-ot használ... nagy örömömre, mert már kezdtem fogytán lenni :)
ja.. ha már itt tartunk... hogy lehet software-esen resetelni?

P
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: miért resetel?

Hozzászólás Szerző: Robert »

  • Egyik I/O lábat összekötöd a RESET lábbal,
    Csinálsz egy asm('jmp $0000') ugrást,
    Leketyegteted a watchdogot,
    Csinálsz egy memóriavisszatérési hibát :),
    Felhasználónak kiírsz egy üzenetet: "Nyomja meg a piros gombot és nyugodjon békében",
    Csinálsz egy tápfesz. elvételt...
Válasz küldése