www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik typedef struct


Autor: Blackout Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
project_info project_struct;

int main( void )
{
project_struct.state = state_wait;
project_struct.id = 0,

while(project_struct.state == state_wait){

irgentwann wird project_struct.state = state_control
und dann gehts weiter...funktioniert einwandfrei.

}
....

}


project.h
diverse includes 
unter anderem: 

#include "project_function.h"

typedef struct {
  BYTE id;                    // ID is used for delaying the response to broadcasts
  BYTE state;                 // State variable
} project_info;

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.

Autor: Blackout Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
volatile project_info project_struct;

In project h:
extern volatile project_info project_struct;

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

Autor: Blackout Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Blackout Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.