typedef struct

Gast #1151086
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.
Gast #1151106
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.
Gast #1151121
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.
Gast #1151146
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...
Gast #1152282
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren