[C++] reboot loop atmega328p class

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • flammert
  • Registratie: September 2011
  • Laatst online: 11-09 22:34
Beste tweakers,

Ik heb een probleem met mijn code wat ik op een atmega328P draai.
Ik heb in C++ een driver geschreven voor de w5100 (ethernet), echter als ik in mijn code een socket aan maak.
Server sock0(o);
Dan gebeuren er rare dingen, oa wordt de code die er boven staat niet meer helemaal uitgevoerd.

De fout zit dus waarschijnlijk in de constructor van mijn server class, ik heb echter niet zoveel ervaring met classes (dit is de eerste keer dat ik het een beetje serieus gebruik), dus zou iemand hier even naar kunnen kijken?
C: main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
#include "spi.hpp" // mijn librarys
#include "ethernet.hpp" // mijn librarys
 
void setup(){
    pinMode(7, OUTPUT);
    pinMode(5, OUTPUT);
    melodi();  // piep toontje (tijdelijk)
 
    delay(1000);
    Serial.begin(115200);
    Serial.println("We just rebooted!!!!\n"); // hierna herstart hij ( de volgende regel wordt dus niet uitgevoerd), mits ik onderin de socket aan maak.
    Serial.println("\t Start init");
    spi.init();
    delay(1);
}
 
void loop()
{
    Serial.println("\t begin setIpData");
    wiz.setIpData();
    Serial.println("\t sock init");
    Server sock0(0); // -----------------------  als dit in mijn code staat
    Serial.println("end sock");
    while(1);
}

C: Header
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 

class Server{
public:
    uint8_t buffer[bufferSize];
    //Server(uint8_t number);
    Server(int number);
    void setPort();
    void setPort(uint8_t laag);
    void setPort(uint8_t hoog, uint8_t laag);
    void setPort(uint16_t getal);
    void setPort(int x);
 
    int start();            // initalizatie
    int listen();                    // luisteren voor binnen koment verkeer
    int checkEstablished();          // is er een verbinding tot stand gekomen?
    uint16_t receivedData();         // data ontvangen?
    void receivingData();            // er komt data binnen, nu verwerken
    int sendData(uint8_t data[], uint16_t length);                           // verstuur data
    void gotFin();                   // fin: einde verbinding ontvangen?
    void closed();                   // verbinding is verbroken (denk ik)
    int timeout();                  // Timeout in de verbinding
    void close();                    // sluit de verbinding
    uint8_t getStatus();
    void disconnect();                     // sluit de vebinding netjes af
private:
    struct MODE{
        const static uint8_t MULTI          = 1<<7;
        const static uint8_......  // en nog veel meer constanten
    }SR;
 
    uint8_t sNr, number;                     // socket nummer
};

C: cpp include
1
2
3
4
5
  
Server::Server(int Number){  /// oorspronkelijk stond hier meer code in, maar dat heb ik er even uit gelaten (krijg het zelfde probleem hier mee)
    sNr=4;
    Number = 0;
}



Een paar dingen wat ik al heb geprobeerd:
  • Alle functies leeg halen
  • controlleren of de voeding spanning niet inzakt
  • Andere(grote) microcontroller
  • Controle of het geheugen niet vol loopt, (volgens de compiler niet)
Mvg,

Flammert

[ Voor 64% gewijzigd door flammert op 23-05-2015 12:51 ]


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

Je shadowed je parameter [pre]Number[pre] in de constructor.

Daarnaast wordt die waarde niet ge-assigned aan de klasse variabele
number
(kleine letter N) die naast een ander type ook nog eens een andere woordgroottes heeft: int (16 bits op de atmega328p) tov uint8_t.

Dat zou zomaar memory corruption op kunnen leveren en dus kunnen resulteren in een stall of reboot van de applicatie.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • flammert
  • Registratie: September 2011
  • Laatst online: 11-09 22:34
Goed gezien, echter heeft dit de fout helaas nog niet verholpen |:( .

" Number = 0; ", stom dit moest natuurlijk " number = 0; " zijn.

Ik heb even de originele functie terug gezet, en Number vervangen met x, (en dit ook in de header gedaan, uiteraard).

wat ik nu heb:
C++: cpp include
1
2
3
4
5
6
7
8
9
10
Server::Server(uint8_t x){
    if (x >= 0 && x <= 3){
        sNr    = x +4;
        number = x;
    }
    else{
        sNr    = 99; /// ERROR
        number = 95;
    }
}

[ Voor 15% gewijzigd door flammert op 23-05-2015 18:02 ]