Hallo zusammen, kann mir einer vielleicht helfen und zwar würde ich gerne wissen, ob eine Variable gesetzt bleibt, wenn ich sie während eines Interruptes setze? Ich sezte zum Beispiel a = 77 und dann verlasse ich meinen Interrupt, danach möchte ich in einem anderen Interrupt mit a = 77 weiter rechnen, geht das?
Wenns eine globale Variable ist schon (je nach Anwendung und Compiler kann volatile oder static erforderlich sein)
Gast_Gast wrote: > Hallo zusammen, > kann mir einer vielleicht helfen und zwar würde ich gerne wissen, ob > eine Variable gesetzt bleibt, wenn ich sie während eines Interruptes > setze? > Ich sezte zum Beispiel a = 77 und dann verlasse ich meinen Interrupt, > danach möchte ich in einem anderen Interrupt mit a = 77 weiter rechnen, > geht das? Wenn a eine globale Variable ist, geht das. Eine ISR ist aus Sicht des C-Compilers auch nichts anderes als eine ganz normale Funktion. Je nachdem, wie die genauen Umstände sind, kann (wird) es sinnvoll sein, die globale Variable noch mit einem 'volatile' zu versehen.
1 | volatile uint8_t a; |
2 | |
3 | ISR( ... ) |
4 | {
|
5 | a = 77; |
6 | }
|
7 | |
8 | int main() |
9 | {
|
10 | ...
|
11 | |
12 | i = 2 * a; |
13 | }
|
<volatile uint8_t a;> So einen Befehl kenn ich leider nicht. Bei mir ist a einfach unsigned int und ist schon global deklariert, also so: unsigned int a = 0x0000; Da schreib ich den Inhalt eines Timers rein. Wie soll ich das mit volatile deklarieren? Es soll auf jeden Fall eine 16bit Variable bleiben
Hauptsache der Compiler kennts, würd ich meinen. Volatile ändert den Datentype ja auch nicht.
> So einen Befehl kenn ich leider nicht.
Dann solltest Du Dir mal ein C-Buch oder -Tutorial vornehmen und das
nachholen.
volatile ist kein Befehl sondern ein Typqualifizierer und fester
Bestandteil der Sprache C. volatile teilt dem Compiler mit, dass die so
gekennzeichnete Variable sich außerhalb des Programmablaufs (also
außerhalb dessen, was der Compiler "sieht") ändern kann und dass er
deshalb keine Zugriffe auf diese Variable wegoptimieren darf. Bei
globalen Variablen, die in Interrupt Handlern und im laufenden
Programm (Hauptprogramm) verwendet werden, kann das essentiell wichtig
sein, da ein Interrupt Handler aus Compilersicht nie aufgerufen wird
(der Compiler weiß ja nichts von asynchron auftretenden
Hardware-Ereignissen).
Eine Änderung der Variable im Interrupt Handler kann ohne volatile dem
Hauptprogramm entgehen, da der Compiler auf die Idee kommen kann, die
Variable im Hauptprogramm in einem Register abzulegen und nicht zu
aktualisieren, denn aus seiner Sicht ändert sie sich ja nie...
also wie ich das verstanden habe kann ich meine Variable so deklarieren: volatile uint16_t CC7alt; Das ist eine 16bit Variable. Ich tue sie da deklarieren, wo meine normalen Deklarationen und Prototypen drin sind, also kurz vor Main(). Wenn ich die Variable CC7alt verwende (in der Interrupt Routine), dann mekert der Compiler..:-( Was mach ich falsch?????
Tja, dann wird an Deinem Programmaufbau etwas nicht in Ordnung sein. Da Du keinen Code postest, kann man nur vermuten, dass die Definition des Interrupt Handlers vor der Deklaration der Variable steht. Und dass das nicht geht, ist hoffentlich klar...
Eventuell ists auch wichtig, was dem Compiler genau nicht passt...
<Tja, dann wird an Deinem Programmaufbau etwas nicht in Ordnung sein. Da Du keinen Code postest, kann man nur vermuten, dass die Definition des Interrupt Handlers vor der Deklaration der Variable steht. Und dass das nicht geht, ist hoffentlich klar...> also der Programmaufbau wurde mir von DAVE erzeugt! Es sind dann nur ein paar Stellen frei, wo der "User Code" rein kann: Makros Defines Typedefs Imported Global Variables Global Variables External Prototyps und Prototyps of local Funktions Also ich hab die Var. bei den Global Variables mit rein. Muss doch so passen.....
Kanzler Gorkon wrote:
> Eventuell ists auch wichtig, was dem Compiler genau nicht passt...
Ja, das wäre nicht verkehrt... "...dann mekert der Compiler..:-(" ist
eine außerordentlich unpräzise Aussage.
<Kanzler Gorkon wrote:
> Eventuell ists auch wichtig, was dem Compiler genau nicht passt...
Ja, das wäre nicht verkehrt... "...dann mekert der Compiler..:-(" ist
eine außerordentlich unpräzise Aussage.>
Compiler sagt :
CC7 not in formal parameter list
Gast_Gast wrote: > also der Programmaufbau wurde mir von DAVE erzeugt! > Es sind dann nur ein paar Stellen frei, wo der "User Code" rein kann: Ist das ein Grund, den Code nicht zu posten (und die Fehlermeldung des Compilers)? Wenn ja, dann kann ich Dir leider nicht weiterhelfen, weil meine hellseherischen Fähigkeiten derzeit nicht so gut funktionieren.
Gast_Gast wrote: > Compiler sagt : > CC7 not in formal parameter list Das könnte bedeuten, dass er die Variable CC7 nicht kennt, was zumindest darauf schließen ließe, dass meine obige Vermutung zutrifft. Aber es kann doch nicht so schwer sein, den Code mal eben wenigstens durchzusehen und zu überprüfen, ob die Variable vor ihrer ersten Benutzung überhaupt deklariert ist... Und wenn Du keine Ahnung von der C-Programmierung hast, ist die "Arbeit" mit einem Code Generation Wizard wie DAvE die denkbar schlechteste Methode. So wird das nie was, v.a. wenn man nicht mal versucht, zu verstehen, was DAvE da fabriziert hat...
>also der Programmaufbau wurde mir von DAVE erzeugt!
Du hast ein C-Programm, das Du nicht selber erzeugt hast, das nicht
funktioniert und wo Du nur bestimmte Stellen ändern kannst?
'tschuldigung, aber so wird das nichts...
<Du hast ein C-Programm, das Du nicht selber erzeugt hast, das nicht funktioniert und wo Du nur bestimmte Stellen ändern kannst? 'tschuldigung, aber so wird das nichts...> also das ist beim Dave normal, dass man nur an bestimmten Stellen eigenen Code einfügen kann! Hat bis jetzt auch supper hingehauen! Denn den Code schreib ich schon selber, nur bestimmte Sachen initialisieren und best. Register werden mit Hilfe von DAVE gesetzt.
<Und wenn Du keine Ahnung von der C-Programmierung hast, ist die "Arbeit" mit einem Code Generation Wizard wie DAvE die denkbar schlechteste Methode. So wird das nie was, v.a. wenn man nicht mal versucht, zu verstehen, was DAvE da fabriziert hat...> also du bist schon ziemlich gemein, findest du nicht? Außerdem hab ich das Problem schon behoben!!!!
Na dann, stell mal den Code rein. Oder ists eine Sache der nationalen Sicherheit?
Gast_Gast wrote: > also das ist beim Dave normal, dass man nur an bestimmten Stellen > eigenen Code einfügen kann! Stimmt doch gar nicht! Alles was DAvE produziert, kann man auch ändern! Und man kann überall Code einfügen. Niels Hüsken wrote: > Wer oder Was ist DAVE? DAvE ist der Digital Application Virtual Engineer, ein Code Generation Wizard, der von Infineon herausgegeben wird und der in der Lage ist, über eine grafische Eingabeoberfläche den Programmrumpf zu erzeugen.
Kanzler Gorkon wrote: > Na dann, stell mal den Code rein. Oder ists eine Sache der nationalen > Sicherheit? Den Eindruck hab ich langsam auch...
>Du hast ein C-Programm, das Du nicht selber erzeugt hast, das nicht >funktioniert und wo Du nur bestimmte Stellen ändern kannst? >also das ist beim Dave normal Also, wenn das ALLES bei DAVE normal ist, warum fragst du dann noch? Und was für ein Compiler spuckt denn die Fehelrmeldung aus? "not in formal parameter list" klingt nach einem überzähligem Parameter in einem Funktionsaufruf, o.ä., aber wie schom mehrfach gesagt, ohne Code ist das alles nur wildes rumgerate. Oliver
<Stimmt doch gar nicht! Alles was DAvE produziert, kann man auch ändern! Und man kann überall Code einfügen.> aber wenn ich dann weiter zu DAVE übergehe und vllt. noch ein Modul dazunehmen will z.b. die CC2 oder so. Dann muss ich ja den C-Code updaten= neu generieren. Danach sind alle Codeänderungen, die nicht innerhalb der dafür vorgesehenen Felder sind, weg!!!!!
Gast_Gast wrote: > aber wenn ich dann weiter zu DAVE übergehe und vllt. noch ein Modul > dazunehmen will z.b. die CC2 oder so. Dann muss ich ja den C-Code > updaten= neu generieren. Danach sind alle Codeänderungen, die nicht > innerhalb der dafür vorgesehenen Felder sind, weg!!!!! Ich glaub, dazu muss man nichts mehr sagen...
Trotzdem wärs jetzt schon noch interessant, worans gelegen hat. Ist das auch Verschlußsache?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.