Forum: Mikrocontroller und Digitale Elektronik typedef struct


von Blackout Joe (Gast)


Lesenswert?

Hallo Leute,
ich habe folgendes Problem mit einer Struktur und sehe nicht warum ich 
einen Wert nicht aendern kann.

Folgendes Szenario.

project.c (Main Funktion)
1
project_info project_struct;
2
3
int main( void )
4
{
5
project_struct.state = state_wait;
6
project_struct.id = 0,
7
8
while(project_struct.state == state_wait){
9
10
irgentwann wird project_struct.state = state_control
11
und dann gehts weiter...funktioniert einwandfrei.
12
13
}
14
....
15
16
}


project.h
1
diverse includes 
2
unter anderem: 
3
4
#include "project_function.h"
5
6
typedef struct {
7
  BYTE id;                    // ID is used for delaying the response to broadcasts
8
  BYTE state;                 // State variable
9
} project_info;
10
11
extern project_info project_struct;

Jetzt moechte ich diese Struktur (genauer gesagt die id) in 
project_function.c (set_ID(BYTE *data)) veraendern.

project_struct.id = data;

Der Compiler gibt keine Fehlermeldungen raus, egal ob ich die project.h 
Datei in der project_function.c Datei einbinde oder nicht (habe diverse 
Optionen versucht, natuerlich auch die Struktur in project_function.c zu 
deklarieren). Der Wert project_struct.id bleibt aber immer 0;

Irgentwie habe ich gerade ein totales Blackout...
Vieleicht kann mir ja jemand auf die Spruenge helfen.

von Blackout Joe (Gast)


Lesenswert?

Ich sollte noch anmerken das ich die project_struct.id in 
project_output.c in einer For-Schleife verwende. Die For-Schleife wird 
immer so oft ausgefuehrt wie momentan in project.c am Anfang definiert 
wurde. Sollte aber durch die Funktion set_ID veraendert werden koennen.
Das Projekt funktioniert in der momentan Version, ich muss einfach 
einige "kleinere" Veraenderungen vornehmen. Habe das Projekt vor ein 
paar Tagen uebernommen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Was heisst denn "irgentwann"?

Programme in C sind immer linear. Falls der Programmablauf also nicht 
liner ist (IRQs) muss man spezielle Vorkehrungen treffen (volatile, 
etc.)

Johann

von tuppes (Gast)


Lesenswert?

Könnte das altbekannte volatile-Problem sein. Wenn der Compiler 
project.c übersetzt, sieht er nicht, das die ID an ganz anderer Stelle 
(in project_function.c) verändert wird.

Was konstant aussieht, darf als konstant behandelt und entsprechend 
optimiert werden.

Ausweg:
In project.c:
1
volatile project_info project_struct;

In project h:
1
extern volatile project_info project_struct;

Das zwingt den Compiler, jeden Zugriff so auszuführen wie er notiert 
ist.

von Blackout Joe (Gast)


Lesenswert?

@tuppes: Danke fuer die Antwort. Leider besteht das Problem weiterhin.

@Johann L.: im state_wait Zustand ist das RF Modul aktiv und sobald ein 
Befehl kommt zb: 'S' 'C' wird die set_CLOCK(BYTE *data) Funktion in 
project_function.c ausgefuehrt und der uC aktuallisiert seine Zeit 
entsprechen der gesendeten Daten. Mit 'S' 'I' (Befehl fuer set_ID) 
moechte ich den verschieden uC verschiedene ID zuordnen. Um deine Frage 
schlussendlich zu beantworten, mit dem Befehl 'S' 'R' gehts weiter zu 
state_control...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Blackout Joe wrote:
> [...viel Text...]

Die Frage war, ob das synchron oder asynchron geschieht. Wenn es 
asynchron geschieht, sieht das Programm ohne volatile nix davon.

Johann

von Blackout Joe (Gast)


Lesenswert?

@Johann L.: Ich entschuldige mich, dass ich mich nicht klar ausgedrueckt 
habe. Ja, ID und STATE koennen bzw muessen sich auch durch Interrupts 
aendern (es wird aber nur geschaut ob ein IRQ Flag gesetzt wurde oder 
nicht). Mit STATE klappt das bis jetzt auch 
wunderbar(project_struct.state=sleep -> project_struct.state=control 
wenn das Alarm Flag gesetzt wurde)! aber eben nicht mit ID. STATE wird 
immer in project.c veraendert. ID sollte aber in project_function.c 
veraendert werden.
PS: Sorry fuer meine spaete Antwort

von Karl H. (kbuchegg)


Lesenswert?

Das du irrtümlich in der Setzfunktion eine lokale Variable gleichen 
Namens "project_struct" hast, kannst du 100% ausschliessen?

ANsonsten poste doch mal mehr Kontext. Aus den paar Sschnipseln kann man 
nicht wirklich was entnehmen.

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.