Forum: Mikrocontroller und Digitale Elektronik Ist das ein Speicherüberlauf?


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Xaver M. (priapos)


Lesenswert?

Moingsen, auch wenn es in der Nacht ist.

Ich habe das Problem, das meine Temp und Feuchte Messung, mit einem 
GY-21 Sensor nach ca 16 STD nicht mehr den nachvollziehbaren Wert von um 
die 20 Grad anzeigt, sondern -40.

Mit meiner Ahnungslosigkeit vermute ich einen Speicherüberlauf, da ich 
es aber nicht weis, frage ich mal euch, was ihr dazu denkt.
Ich nutze die SparkFun_Si7021_Breakout_Library.h um ihn auszulesen und i
die beiden Variablen als:
1
  float humidity = 0;
2
  float temp = 0;

 die ich für die Anzeige auf dem Display konvertiere bzw caste:
1
void loop()
2
{
3
  if (menu == 1)
4
  {
5
    temp = sensor.getTemp();
6
    humidity = sensor.getRH();
7
    char buffer[32];
8
    sprintf(buffer, "%d ", (int)temp);
9
    oledWriteString(&ssoled, 0, 0, 0, (char*)buffer, FONT_STRETCHED, 0, 1); //temperaturwert anzeigen
10
    oledWriteString(&ssoled, 0, 30, 0, (char*)"Grad", FONT_NORMAL, 0, 1);
11
    sprintf(buffer, "%d%%", (int)humidity);
12
    oledWriteString(&ssoled, 0, 64, 0, (char*)buffer, FONT_STRETCHED, 0, 1), humidity; //Luftfeuchtigkeit anzeigen;
13
    oledWriteString(&ssoled, 0, 112, 1, (char*)"Lf", FONT_NORMAL, 0, 1);
14
    updateMenu();
15
  }

Interessieren würde mich ob meine Vermutung stimmt und wenn ja, wie ich 
das Problem lösen kann oder der Ursache auf die Schliche komme.
Abendliche Grüße.

: Bearbeitet durch User
von Stefan A. (king-crash)


Lesenswert?

Die einfachste Möglichkeit wäre ein JTAG Debugger und gdb.

Wenn du das nicht zur Hand hast gibt es natürlich noch viele weitere 
Möglichkeiten. Unter Anderem:
- "temp" nach "sensor.getTemp();" auf einen Festen Wert setzten. Ändert 
sich dieser sind evtl die Display Routinen das Problem.
- Alles nicht absolut notwendige auskommentieren und schauen ob das 
Problem weiterhin besteht.
- Der Sensor ist sehr einfach anzusprechen, daher kannst du die 
Kommunikation auch sehr schnell selbst implementieren.
- Den Code auf deinem PC zum Laufen bringen, durch Ersetzen und/oder 
Weglassen der Hardwareabhängigen Teile.
...

Beitrag #6773901 wurde von einem Moderator gelöscht.
von DPA (Gast)


Lesenswert?

Ob es irgendwo einen Speicherüberlauf gibt oder nicht, kann man nicht so 
leicht sagen. Kann sein, muss aber nicht. Bei einem PC hat man gute 
tools, nach sowas zu suchen (asan, valgrind, etc.) aber auf dem UC ist 
das schwieriger, da muss man halt nehmen, was man hat. So oder so wirst 
du es aber halt leider altmodisch Debuggen müssen. Nachsehen, was es 
macht, überlegen, was es machen sollte, bis du die Quelle gefunden hast. 
Und erwarte das unerwartete, am Ende ist vielleicht einfach der Sensor 
halb kaputt (ist -40C nicht gerade das minimum für den?) oder was 
ähnlich unerwartetes.

von PittyJ (Gast)


Lesenswert?

In dem aufgeführten Teil ist nichts, was zu Speicherüberlauf führen 
könnte.
Und auch das Fehlerbild, wenn bei mir mal so etwas passiert, ist etwas 
anderes: nämlich lustige Abstürze.

Man könnte jetzt noch den Sensor und die Oledausgabe einzeln testen, ob 
in deren Bibiliotheken Speicher verbraucht wird. Sprich jeweils den 
anderen Teil abschalten.

Ich schätze eher an einen I2C Lesefehler, welcher zu dem unteren 
Grenzwert interpretiert wird.

von Xaver M. (priapos)


Angehängte Dateien:

Lesenswert?

PittyJ schrieb:
> Ich schätze eher an einen I2C Lesefehler, welcher zu dem unteren
> Grenzwert interpretiert wird.

Gemutmaßt habe ich auch schon einen I2C Fehler, dies aber auch wieder 
verworfen, weil das Display auch über I2C kommuniziert und neben der 
falschen Temperatur weiterhin alle Angaben wie erwartet anzeigt, wie die 
Feuchtigkeit und Teile des Menüs. Ich habe mal ein Bild gemacht, damit 
man sich eine Vorstellung machen kann.
Im übrigen hat sich gerade gezeigt, beim Versorgen der Schaltung mit 
Strom (war die ganze Nacht Stromlos), zeigte sich der Fehler noch immer, 
und nach dem Bilder machen war er wieder weg und zeigte 17 Grad an.

: Bearbeitet durch User
von vusa (Gast)


Lesenswert?

kannst du mal Schaltplan und Code posten ?

Hast du ein Oszilloskop zur Hand und kannst dir mal den Bus angucken wie 
die Signale aussehen ( pull-up Widerstände am bis vorhanden ? ).

evtl "beißen" sich auch deine Verwendeten libs. Schonmal andere Probiert 
?

für Sensor : https://github.com/adafruit/Adafruit_Si7021

für oled : 
https://github.com/adafruit/Adafruit-128x64-Monochrome-OLED-PCB

Das sind schonmal zwei libs vom selben Hersteller.

Gruß

von Wolfgang (Gast)


Lesenswert?

Xaver M. schrieb:
> Im übrigen hat sich gerade gezeigt, beim Versorgen der Schaltung mit
> Strom (war die ganze Nacht Stromlos), zeigte sich der Fehler noch immer,
> und nach dem Bilder machen war er wieder weg und zeigte 17 Grad an.

Vielleicht solltest du deine Hardware einmal überprüfen. Was liefert die 
Anzeige, wenn du den Sensor entfernst?
Und was soll das alberne "%95" in der Anzeige. Taucht das auch auf, wenn 
vernünftige Werte angezeigt werden?
Bring erstmal die Software in Ordnung, bevor du nach einem Speicherleck 
suchst.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

nimm mal lieber snprintf.

von Xaver M. (priapos)


Lesenswert?

Veit D. schrieb:
> nimm mal lieber snprintf.

weil? Wo genau liegen deine Bedenken?

von Schlaumaier (Gast)


Lesenswert?

Vielleicht hetzt du ihn auch einfach nur.

Ich kenne den Code nicht, aber ich würde da zwischen den Messungen immer 
etwas Zeit lassen.

Viele Libs die ich bisher genutzt habe laufen einwandfrei wenn man 
dazwischen etwas anderes o. halt ein Delay einsetzt.

von Wolfgang (Gast)


Lesenswert?

Schlaumaier schrieb:
> Ich kenne den Code nicht, aber ich würde da zwischen den Messungen immer
> etwas Zeit lassen.

Das Datenblatt des SHT21 verrät sogar, wie lange der Sensor für die 
einzelnen Messungen in Abhängigkeit von der gewählten Auflösung benötigt 
(Tab. 7).

Außerdem beträgt die Zeitkonstante des Feuchtesensors 8s, die des 
Temperatursensors zwischen 5 und 30s. Da braucht man sowieso Geduld und 
hektisches Auslesen bringt einem wenig.

von Xaver M. (priapos)


Lesenswert?

Wolfgang schrieb:
> Schlaumaier schrieb:
>> Ich kenne den Code nicht, aber ich würde da zwischen den Messungen immer
>> etwas Zeit lassen.
>
> Das Datenblatt des SHT21 verrät sogar, wie lange der Sensor für die
> einzelnen Messungen in Abhängigkeit von der gewählten Auflösung benötigt
> (Tab. 7).
>
> Außerdem beträgt die Zeitkonstante des Feuchtesensors 8s, die des
> Temperatursensors zwischen 5 und 30s. Da braucht man sowieso Geduld und
> hektisches Auslesen bringt einem wenig.

Kann das etwas bringt, eine Zeitfunktion zum Auslesen des Sensors alle 
2,3,4,5 min habe ich noch geplant einzufügen. Probiere ich die Tage mal 
aus. Mal sehen ob der Fehler dann weg ist, oder dann erst Tage baucht 
zum auftauchen.

von Veit D. (devil-elec)


Lesenswert?

Xaver M. schrieb:
> Veit D. schrieb:
>> nimm mal lieber snprintf.
>
> weil? Wo genau liegen deine Bedenken?

Google einfach mal nach sprintf und snprintf und erkenne den 
Unterschied. Generell sollte man bei solchen Buffer Operationen immer 
die Bufferlänge mit prüfen. Entweder um Overflows vorzubeugen oder bei 
Bedenken auszuräumen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.