Forum: Mikrocontroller und Digitale Elektronik BCM2835: bcm2835_read_paddr Fehler?


von Jens K. (mister232)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich weiß ich habe diese Frage bereits gestern im Forum "GCC" gestellt, 
aber da mir dort irgendwie keiner antwortet, vermute ich mal, dass die 
Frage dort nicht hingehört. Wenn ich nach Fragen zum Raspberry Pi suche, 
dann finde ich sie auch eher hier. Von mir aus kann der Beitrag also 
dort gelöscht werden. Nun zu meinem Anliegen:

Ich betreibe zurzeit ein Raspberry Pi im Dauerbetrieb mit einer
Funkkommunikation mittels 433MHz. Dazu habe ich einen kleinen Adapter
mit einem RFM12B entwickelt, welcher auf die GPIOs des Raspberry
gesteckt werden kann. Auf dem Raspberry wird ein C-Programm ausgeführt,
welches einfach nur lausch ob Daten in einem vorgesehenen Format
verfügbar sind, diese empfängt, auf Richtigkeit prüft und ggf. in eine
Textdatei speichert und ausgibt. Die Daten kommen von 3
Temperatursensoren, welche etwa alle 30 Sekunden neue Werte senden.

Soweit so gut. Alles funktioniert eigentlich ganz gut. Nun habe ich
allerdings das erste Mal ein paar Dauertest gemacht und musste
feststellen, dass ich nach ein paar Stunden betrieb die im Anhang zu
sehende Fehlermeldungen bekomme. Habt ihr eine Ahnung woran das liegen
könnte? Ich habe mir bereits die bcm2835.c angeschaut und habe
festgestellt, dass das Debug-Flag wohl irgendwie eingeschaltet werden
müsste, doch ich habe wirklich keine Ahnung wo das passiert und warum
erst so spät.

Hier mal der Codeabschnitt, in welchem ich auf die Bibliothek zugreife:
1
// Function to write a command to the RFM12
2
uint16_t RF12_WRT_CMD(uint16_t cmd)
3
{
4
  char buffer[2];
5
    uint16_t reply;
6
7
    buffer[0] = cmd >> 8;
8
    buffer[1] = cmd;
9
10
    bcm2835_spi_transfern(buffer,2);
11
12
    reply = buffer[0] << 8;
13
    reply |= buffer[1];
14
15
    return reply;
16
}

von 900ss (900ss)


Lesenswert?

Wenn du den Code hier anschaust, wirst du es finden.

https://github.com/janne/bcm2835/blob/master/bcm2835.c

In solchen fällen einfach mal die Begriffe der "Fehlermeldung" in eine 
Suchmaschine stecken, dann findet man oft schnell die Lösung.

von Jens K. (mister232)


Lesenswert?

Genau dort hatte ich ich schon geschaut, aber wie gesagr, ich verstehe 
nicht wo der Debug-Modus eingeschaltet wird.
kleiner Tipp vielleicht?

von 900ss (900ss)


Lesenswert?

Jens K. schrieb:
> Genau dort hatte ich ich schon geschaut, aber wie gesagr, ich
> verstehe
> nicht wo der Debug-Modus eingeschaltet wird.
> kleiner Tipp vielleicht

Wenn du schon erkannt hast, dass es der Debugmode ist, dann versuche 
herauszufinden, wovon dieser abhängt. Dann erkennst du auch, wo dieser 
dann ein/aus geschaltet wird. Das ist so offensichtlich....

Das solltest du selber hinbekommen.

Also wovon hängt es ab, ob der Debugmode ein/aus ist?

: Bearbeitet durch User
von Peter C. (peter_c49)


Lesenswert?

bcm2835_set_debug(1);

schau in deinem code nach diesem bcm2835_set_debug() call.
bei den "examples" ist er auf 1, somit wird die debug meldung auch 
ausgegeben.

bcm2835.c:
<code>
 //
 43 // Low level register access functions
 44 //
 45
 46 void  bcm2835_set_debug(uint8_t d)
 47 {
 48     debug = d;
 49 }
 50
 51 // safe read from peripheral
 52 uint32_t bcm2835_peri_read(volatile uint32_t* paddr)
 53 {
 54     if (debug)
 55     {
 56         printf("bcm2835_peri_read  paddr %08X\n", (unsigned) paddr);
 57         return 0;
 58     }
 59     else
 60     {
 61         // Make sure we dont return the last read which might get 
lost
 62         // if subsequent code changes to a different peripheral
 63         uint32_t ret = *paddr;
 64         uint32_t dummy = *paddr;
 65         return ret;
 66     }
 67 }
</code>

von Jens K. (mister232)


Lesenswert?

Gesetzt wir das Debug-Flagge ja mit der bcm2835_set_debug ()-Funktion. 
Diese wird ja nur in der Main aufgerufen, aber diese wird wiederum nur 
ausgeführt, wenn BCM2835_TEST definiert ist. Dies ist aber 
auskommentiert. Vorallem verstehe ich nicht, warum das erst noch einigen 
Stunden auftritt.

von Jens K. (mister232)


Lesenswert?

Ich finde es nicht, sorry. Bin auch noch nicht solange beim 
Programmieren dabei ;-)

von 900ss (900ss)


Lesenswert?

Wenn das sicher erst nach einigen Stunden auftritt, dann ist es wohl ein 
Programmfehler, der dir die Variable "debug" setzt.


Zum ausprobieren, ob es so ist könntest du, nachdem der Fehler auftritt, 
mal

bcm2835_set_debug(0);

aufrufen. Wenn es dann weg ist, dann hast du einen Programmfehler oder 
es gibt irgendwo nach Stunden doch jemand, der

bcm2835_set_debug(1);

aufruft.

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.