Gast
#2759159
Hallo, ich versuche gerade mein AVR Projekt möglichst modular und elegant aufzubaun. Leider ist das nicht immer ganz leicht. So auch jetzt wieder. Beispiel: Ich schreibe ein Modul zur Benutzung des USARTS. Über eine Headerdatei werden einer Applikationssoftware Schnittstellen zum Zugriff auf das Modul zur Verfügung gestellt, etwa PutChar oder PutString. Die Kommunikation zwischen den Modulen in die andere Richtung könnte zB über Callbacks laufen. Das Modul kann zB einer Applikation mitteilen, dass ein Char empfangen wurde. Die Applikation kann den Char dann auswerten oder in einen Puffer schreiben. Leider birgt der Aufruf einer Funktion, von der man nur den Prototyp kennt, innerhalb einer ISR einige Tücken. Der Compiler weis nicht, was in der Funktion genau passiert und muss alle Register sichern. Das sieht dann zB so aus:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
Neben der Speicherplatzverschwendung fällt natürlich vor allem die Ausführungszeit ins Gewicht. Ein Rx Interrupt kann unter Umständen ja sehr oft auftreten. Ich verschenke also massig Zeit, das Sichern und Wiederherstellen der Register dauert länger als das Sichern des empfangenen Zeichens... Wie löst man nun sowas am elegantesten? Alles in eine C Datei hauen erscheint mir wenig sinnvoll. Der Compiler könnte sich zwar dadurch nach Belieben austoben, aber zu welchem Preis? Kann man irgendwie über inline tricksen? Ich bin ja mit Sicherheit nicht der erste mit diesem Problem. Hat sich in der Praxis dafür vielleicht eine Vorgehensweise etabliert? Danke & Viele Grüße, Rudi