Hallo
ich möchte Unterprogramme in eine Timer Interrupt-Routine einbauen, doch
es funktioniert nicht. Es bleibt vermutlich im ersten Unterprogramm
stecken und das Interrupt kommt nicht.
Beides getrennt von einander funktioniert. Also wenn ich die
Unterprogramme im void main() teste funktioniert es und wenn ich den
Interrupt alleine teste funktioniert er auch.
grundsätzlich:
sag nicht "es funktioniert nicht".
Sag "ich erwarte das und das. Aber statt dessen passiert dieses und
jenes"
dann
1
intzwei(intd)
2
{
3
inte=4,a,f;
4
f=eins(a);
5
d=e+f;
6
return(d);
7
}
welchen Wert hat hier a, wenn du die FUnktion eins aufrufst?
Wenn du eine lokale Variable nicht ausdrücklich initialisierst, kannst
du dich auf keinen Wert verlassen. Es ist zufällig, welchen Wert a hier
hat.
welchen Wert hat d?
der ist völlig undefiniert. zufällig.
Gut, so wie zwei geschrieben ist, spielt das keine Rolle. Es ist
trotzdem schlechtes Programmieren, wenn man die Internals von zwei
kennen muss, um zu wissen, ob es an dieser Stelle egal ist oder nicht.
Hier wird der Inhalt einer Variablen an eine Funktion übergeben und über
diesen Inhalt wissen wir nur eines: der ist zufällig.
Deine Funktionen sind - sorry - ziemlicher Unsinn.
Die übergeben Parmeter werden nie verwendet.
Wenn ich's im Kopf richtig überschlagen habe, kommt aus "zwei(d)" immer
9 heraus.
Wobei der Parameter "d" für zwei(d) nicht intialisuert wird. Ist aber
egal, weil er in den Funktione sowieso nicht benutzt wird.
Dieses Konstrukt ist vollkommen unklar.
@ NurEinGast:
Ich weiß das es keine großartiges Programm ist, es geht mir darum einen
Wert von einem Unterprogramm in ein zweites zu übergeben und dann in
einer Interrupt-Routine eine Aktion durchzuführen. Wenn ich das geschaft
habe werde ich es natürlich noch Sinnvoll ausbauen.
Ja eigentlich sollte immer 9 heraus kommen aber trotzdem leuchtet die
LED nicht.
@ Karl Hein:
Wenn ich bei anderen Programmen ohne Unterprogramme die
Timer-Interrupt-Routine verwende funktioniert sie einwandfrei.
Philipp schrieb:> Den Wert der Variable a soll er aus dem ersten Unterprogramm übernehmen
Wer ist "er"?
Und hast Du Dir überhaupt schon mal angesehen, wie in C die
Parameterübergabe und -Rückgabe mit Funktionen (so nennt man das, was
Du als "Unterprogramm" bezeichnest) funktioniert?
Was sagt denn Dein C-Buch dazu?
Mit Interrupts jedenfalls hat Dein Problem überhaupt nichts zu tun.
Da "C", außer bei einfachsten Befehlen, sowieso Funktionen einbindet,
warum nicht?
Normalerweise kannst Du innerhalb von Unterbrechungen machen was Du
willst.
Wichtig ist nur, dass Du garantiert fertig wirst, mit etwas Reserve,
bevor ein erneuter Aufruf erfolgt.
Schön wäre es auch, wenn noch etwas Zeit, für die Hauptroutine und
eventuelle andere Unterbrechungen, übrig bleibt.
Alles in allem ein zeitliches Problem. Es besteht ja auch kein
Unterschied zwischen einem linearen Programmablauf und einem mit
Unterprogrammen.
Natürlich kosten der Aufruf (call), ein eventuelles Registersichern
(push), die Restauration von Registern (pop) und der Rücksprung ihre
Zeit (ret).
Bei längeren Routinen ist das prozentual Vertretbar. Für kürzere
Sequenzen bietet sich die Anweisung Inline an.
Ob damit mehr als das call und ret gespart werden ist eine andere Sache.
"Er" ist die zweite Funktion
Ein Beispiel ist darin:
int example(int a, int b)
{
return a+b;
}
.
.
.
void main()
{
int a=9;
int b=15;
int c=example(a,b)
}