Forum: Mikrocontroller und Digitale Elektronik Variable aus Task ausrufen ?


von Hans M. (Gast)


Lesenswert?

Hallo und einen guten Abend zusammen !

Ich habe eine Funktion in der eine Variable beim Programmstart gesetzt 
wird !
-> StartStop = 1;

in einem Unterprogramm wird dann folgendermaßen gewartet !

while (StartStop); // D.h so lange StartStop==1
Es wird also so lange gewartet wir die variable gesetzt ist !
Zugegebenermaßen ziemlich schlecht ! aber erstmal egal !
Zwischenzeitlich wird eine Interruptroutine bearbeitet ! Was aber auch 
eigentlich keine Rolle spielt nur zum Verständnis gesagt werden soll...

Wenn man ein Betriebssystem benutzt (auf einem µc!), dann kann ich aus 
einer anderen Task hinaus ja rein theoretisch die Variable StartStop 
verändern ? oder ?
Jetzt möchte ich erstmal eine Funktion haben welche auf die 
Speicheradresse wo StartStop abgelegt ist zuzgreifen kann !
.... mhhh genau das ist mein Problem wie kann ich einer anderen Funktion 
sagen wo die Speicherstelle von StartStop ist ?
(also ich benutzt kein Betriebssystem !, ich möchte aber irgendwann mal 
eines benutzen und meine Funktion dafür auslegen !)

Vielen Dank für eure Hilfe
Hans M.

von gast (Gast)


Lesenswert?

Globale Variablen kannst du von überall benutzen...
wo ist das Problem?
einfach in der Headerdatei mit "extern" einbinden fertig...

von Hans M. (Gast)


Lesenswert?

Hallo und vielen Dank fürd eine Antwort...

Also kann ich das also ungefähr so verwirklichen

//Globale Variable
main.h
  ...
  extern unsigned char StartStop; //Definition der Globalen Variable

/////////////////////////////////////////
main.c
#include "main.h"
// Verwendung der Globalen Variable StartStop
  unsigned char StartStop //hier hin ?
...
  void stop (void)
  {
      StartStop=0;
  }

  void main (void)
  {
   ...
      stop():
  }
///////////////////////////////////////
andereFunktion.c
...
include "main.h"
unsigned char StartStop // hier so deklarieren ?

 void Funktion (void)
 {
    ...
    while StartStop==1;
    ...
 }

Vielen Dank für die Hilfe

Mfg Hans M.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Du musst dir tatsächlich Gedanken machen, was passiert, wenn Task1 die 
Variable gerade ganz oder teilweise eingelesen hat, dann von dem 
Taskmanager unterbrochen wird, dann Task2 zum Zuge kommt und seinerseits 
die Variable verändert.

Wenn es dann zurück zu Task1 geht - tja was ist dann? - soll Task1 mit 
dem eingelesenen Wert weiterarbeiten oder neu einlesen? Und wie stellt 
Task1 fest ob neu eingelesen werden muss?

Da Multitasking keine neue Erfindung ist, wurden diese Probleme bereits 
angegangen. Die Stichworte hierfür gleichen den Stichworten bei der 
Interruptprogrammierung, also atomarer Zugriff spielt eine Rolle und das 
C Schlüsselwort volatile.

von Sven P. (Gast)


Lesenswert?

Ich werf mal völlig wertfrei VOLATILE in den Raum.

von Hans M. (Gast)


Lesenswert?

Hallo und nochmal vielen Dank für die Antworten...

ist den meine Implementierung korrekt ?

Thx Hans M.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Nein leider nicht.

Abgesehen von der ungelösten Multitasking-Problematik, hast du

* zwei Definitionen von StartStop. Einmal in main.c und einmal in 
andereFunktion.c. Manche C Linker werfen einen Fehler ("doppeltes 
Symbol"); andere Überlagern einfach beide Variablen in einer.

* Primitive C Syntaxfehler in der Zeile
while StartStop==1;

Übrigens erinnert mich deine Frage an etwas, Moment, i'll be back

...here we are again:
Beitrag "[AVR] Seltsame Optimierung"

von Hans M. (Gast)


Lesenswert?

ok danke für die Antwort !

d.h ich müsste die Variable StartStop nur einmal , entweder in main.c 
oder in andereFunktion.c deklarieren, also Speicher reservieren ?
Würde das reichen ?
Ja den primitiven C Syntax Fehler .. ups...

Mfg Hans M.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Nein leider nicht.

Es bleibt immer noch die ungelöste Multitasking-Problematik.

von Hans M. (Gast)


Lesenswert?

ok ja das ist natürlich klar ! Vielen Dank für die Hilfe !!!
aber das compilerproblem :

* zwei Definitionen von StartStop. Einmal in main.c und einmal in
andereFunktion.c. Manche C Linker werfen einen Fehler ("doppeltes
Symbol"); andere Überlagern einfach beide Variablen in einer.

ist damit doch erledigt, oder ?

Thx Hans M.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Exakt. Das ist dann erledigt.

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.