Forum: Compiler & IDEs structs in globalem struct


von Paul (Gast)


Lesenswert?

Hallo,

ich nutze für mein Projekt eine globale struct in der alle Statusdaten 
gespeichert werden. Um das ganze besser zu strukturieren befinden sich 
in dieser struct wieder structs. Die Daten lese ich per Funk aus. Leider 
habe ich das Problem, das die inneren structs keine Daten enthalten. 
Muss ich die besonders deklarieren? Zur Zeit sieht meine globale struct 
so aus:
1
typedef struct StatusStruct
2
{
3
  volatile temp boardTemp;          //temperature on the board
4
  volatile RTC rtcData;          //data of the RTC
5
  uint8_t  outsideTemp;      //temperature outside
6
  uint8_t outsideHum;        //outside humidity
7
  uint8_t insideTemp;        //inside temperature
8
  uint8_t  insideHum;        //inside humidity
9
  uint8_t currentCapHigh;      //current cap high in cm
10
  uint8_t windSpeed;        //current wind speed in m/s
11
  uint16_t solarCurrent;      //actual current of the solar panel
12
  uint16_t voltage;        //actual voltage
13
  uint8_t error;          //error code
14
}Status;

es geht um die ersten beiden Variablen die vom struct Typ temp und RTC 
sind. In der Klasse habe ich eine globale Statusvariable deklariert:
1
extern volatile Status globalStatus;        //the current status of all sensors and actors

Wie schon gesagt, das Problem besteht darin, dass nach dem Auslesen des 
globalen Status per Funk in boardTemp und rtcData keine Daten enthalten 
sind. Ich nehme mal an, das Problem liegt an der Deklaration der inneren 
structs, oder?

Gruß
Paul

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mit den gegebenen Informationen lässt sich die Frage nicht beantworten.

Schau dir den erzeugten Assembler-Code (*.s) an und untersuche ob dieser 
korrekt ist und dem C-Code entspricht.

von Markus M. (mark_m)


Lesenswert?

Wie befüllst Du boardTemp und rtcData?

Grüsse

von Paul (Gast)


Lesenswert?

Daten werden folgendermaßen befüllt:
1
readBoardTemp(&globalStatus.temp);

und
1
/*RTC readRTCData();*/
2
globalStatus.rtcData=readRTCData();

Den erzeugten Assemblercode schaue ich mir bei Gelegenheit mal an.

von Markus M. (mark_m)


Lesenswert?

Ich kann nichts erkennen, was als Ursache in frage kommt.

Über kurz oder lang wird jemand nach den Source Code verlangen. ;-)

Grüsse

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> Daten werden folgendermaßen befüllt:

Na dann musst du eben mal nachsehen, was diese Funktionen so treiben und 
warum sie nichts liefern.

> Ich nehme mal an, das Problem liegt an der Deklaration der
> inneren structs, oder?

Nö. Das Problem liegt irgendwo in deinem Code. Wo genau, das weiß kein 
Mensch. Denn den Code zeigst du ja nicht.

Wenn etwas passiert oder nicht passiert, dann liegt das am Code und 
nicht in der Deklaration irgendwelcher Datenstrukturen. Datenstrukturen 
sind passiv. Der Code ist es, der etwas macht oder nicht macht.

von Paul (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Na dann musst du eben mal nachsehen, was diese Funktionen so treiben und
> warum sie nichts liefern.

Schon geschehen. Wenn ich die Funktionen kurz vor dem Senden zum 
befüllen der structs nutze werden auch tatsächlich Daten 
hineingeschrieben. Aber eigentlich möchte ich die in regelmäßigen 
Zeitabständen aktualisieren, wofür ich den Interrupt des DS2417 nutze. 
Ich rufe also in einer ISR aller 64s die entsprechenden Funktionen auf, 
die den globalen Status aktualisieren.

von Markus M. (mark_m)


Lesenswert?

> Ich rufe also in einer ISR aller 64s die entsprechenden Funktionen auf,
> die den globalen Status aktualisieren.
Eine ISR so kurz wie möglich halten. Ruf dort nicht die Funktionen auf 
sondern setze nur ein Flag, das in Main ausgewertet wird und dann dort 
die Funktionen aufruft.

Es kann sein, das dir ein anderer Interrupt dazwischen funkt.

Grüsse

von Paul (Gast)


Lesenswert?

Markus M. schrieb:
> Es kann sein, das dir ein anderer Interrupt dazwischen funkt.

Mmmh...eine Minute müsste eigentlich ausreichen um die ganzen Funktionen 
auszuführen. Es werden ja nur Sensoren abgefragt. Aber wäre wohl 
trotzdem besser alles außerhalb der ISR zu machen. Ich versuchs mal ;)

von Markus M. (mark_m)


Lesenswert?

Du kennst dein Gesamtsystem. Als Aussenstehender muss man eine Menge 
Annahmen treffen.

Hast Du alle selbst Implementiert?
Welchen MC nutzt Du?
Irgendwelche fertigen Libraries?

Zu Interrupt:
In der ISR solltest Du noch ermitteln ob es der richtige Interrupt ist 
und nur dann das Flag setzen.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts
http://www.mikrocontroller.net/articles/Interrupt

Grüsse

von Paul (Gast)


Lesenswert?

Ich glaube ich habe den Fehler gefunden: Um die Sensoren anzusprechen, 
habe ich eine Pin/Port-struct verwendet in der Datenregister, Port und 
Pin vom jeweiligen Sensor gespeichert werden. Jedenfalls habe ich die 
jeweiligen Variablen nicht als "volatile" deklariert und damit war es 
wohl Glückssache, ob der Sensor richtig angesprochen wurde oder nicht. 
Jetzt geht es jedenfalls einwandfrei ;) Danke euch :)

von Rolf M. (rmagnus)


Lesenswert?

Und jetzt überlege mal, ob mit den von dir gegebenen Informationen 
jemals jemand hier aus dem Forum darauf hätte kommen können.

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.