Forum: Compiler & IDEs ADC in ISR modularisieren?


von Sebastian (Gast)


Lesenswert?

Hallo,

ich modularisiere gerade meinen Programmcode und wollte einmal wissen, 
ob es möglich ist folgendes zu machen:

Ich habe eine overflow ISR vom Timer 1 . In ihr werden verschiedene 
Variablen hochgezählt und unter anderem der ADC ausgelesen.

Da ich mein Programm gerne modularisieren möchte, wäre es schön eine 
eigene adc.c und adc.h zu haben.

Die Preisfrage ist jetzt, ob es möglich ist ein und dieselbe ISR in 2 
verschiedenen .c mit Inhalt zu füllen.

quasi:
1
main.c
2
ISR_Timer1(){
3
variable++;
4
}
5
6
adc.c
7
ISR_Timer1(){
8
if (bit_is_set(ADCSRA,6)) ADC_Wert = ADC;
9
}

Schön wäre es also wenn ich diesen Vektor verwenden könnte und keinen 
neuen oder nen anderen Timer verwenden muß.

Ich danke euch.

von Karl H. (kbuchegg)


Lesenswert?

So direkt geht da nicht.
Du musst dir die dazu benötigte Infrastuktur selbst herstellen.
Die Frage ist nur, ob du das möchtest, bzw. bereit bist den Preis dafür 
zu zahlen :-)

Man könnte zb
* Jede funktionale Gruppe teilt einem Handler die Adresse seiner 'ISR'
  Funktion mit. Der Handler trägt die in eine Tabelle ein. Aus CPU Sicht
  gibt es nur eine ISR. Aber in dieser ISR wird die Tabelle abgearbeitet
  und nacheinander alle registrierten Funktionen aufgerufen

* Der Handler unterhält keine Tabelle, sondern nur die Adresse der
  ersten aufzurufenden Funktion. Registriert eine funktionale Gruppe
  eine Behandlungsfunktion für einen bestimmte ISR, so merkt sich der
  Handler diese Adresse und liefert gleichzeitig die bisherige Adresse
  der aufzurufenden Funktion zurück. Die funktionale Gruppe wiederrum
  merkt sich diese Adresse und ist verpflichtet am Ende ihrer eigenen
  Behandlung genau die Funktion an dieser Adresse aufzurufen. Kommt der
  Interrupt, so ruft die eigentliche ISR nur die erste Funktion auf.
  Aber da jede Funktion ihren Nachfolger verpflichtend aufrufen muss
  (seine Adresse kennt er ja, die wurd ihr beim registrieren geliefert)
  werden auch hier im Endeffekt alle registrierten Funktionen aufgerufen

  Im Endeffekt hat man damit ebenfalls im Grunde eine Tabelle aller
  registrierten Behandlungsfunktionen, nur ist diese Tabelle über
  das ganze Programm verstreut.

Bei solchen Dingen geht es dann schon in Richtung 'kleines 
Betriebssystem'. Die Verwaltung bzw. die Bereitstellung solcher Konzepte 
ist eine der noblen Aufgaben eines Betriebssystems bzw. das, was mit in 
den Begriff API (Application Programmers Interface) fällt.

von Oliver (Gast)


Lesenswert?

Sebastian schrieb:
> Die Preisfrage ist jetzt, ob es möglich ist ein und dieselbe ISR in 2
> verschiedenen .c mit Inhalt zu füllen.

Die Gewinnerantwort ist nein.

Du kannst aber aus der ISR einzelne Funktionen aufzurufen, die in 
unterschiedlichen sourcefiles stehen.

Oliver

von Sebastian (Gast)


Lesenswert?

Das heißt ich lagere ISR's wie von nem Timer lieber nicht aus und stopf 
sie voll mit externen funktionen. Gut. Obwohl sowas mit 
Funktionsüberladung (??) echt toll wäre.

von Falk B. (falk)


Lesenswert?

@  Oliver (Gast)

>Du kannst aber aus der ISR einzelne Funktionen aufzurufen, die in
>unterschiedlichen sourcefiles stehen.

Was aber zur Folge hat, dass in der ISR ne Menge zusätzlicher push/pop 
stattfinden, zumindest beim AVR GCC. Ausser man defniert die Funktionen 
als inline.

MFG
Falk

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.