Forum: Compiler & IDEs ISR Routine verschieben


von Tobi (Gast)


Lesenswert?

Hallo zusammen,

ich versuche gerade eine ISR Routine sowohl im Applikationsbereich als 
auch in der Bootloadersection zur Verfügung zu stellen.
Und zwar handelt es sich um die ISR für den Timer.
Dieser wird für eine Timerroutine (Zeiteinheiten für Taskscheduling) in 
beiden Sections benötigt.

Ich hatte zuvor in beiden Bereichen separat diese Timerroutinen 
implementiert und wollte sie nun zentral mit anderen Routinen direct vor 
der Bootloadersection plazieren. Die Routinen direkt vor der 
Bootloadersection, lso am Ende der Anwendungssection enthalten 
Funktionen für beide Bereiche. Kompiliert wird dieser Bereich zusmmen 
mit dem Bootloader.
Das funktioniert soweit auch, nur bleibt die ISR Behandlungsroutine im 
Bootloaderbereich. Kann ich das irgendwie erzwingen das dies auch in dem 
Bereich direkt vor dem Bootloader seinen Platz findet? Und dann von 
beiden Seiten aus angesprungen wird wenn ein Interrupt ausgelöst wird?

Die Interrupts werden jeweils beim Sprung von der Anwendung in den 
Bootloader durch entspr. Setzen des GICR Registers auf diesen umgebogen 
und anders herum.

WIe kann ich dies denn realisieren?

Danke für Tips!!

MfG Tobi

von ucWriter (Gast)


Lesenswert?

Aus dem Stand...
1) Was das Platzieren angeht. Es sollte möglich sich mittels Linker-File 
einen Bereich im Program-Flash zu definieren, in denen bestimmte 
Unterprogramme abgelegt werden können.

2) Die andere wichtigere Frage wäre, wie deine Application Wissen soll, 
wo sich genau die "gemeinsamen" bzw. fremden Unterprogramme befinden.

3) Eine Empfehlung wäre, die Dokumentation deiner Tool-Chain 
konsultieren.

4) Aus dem Bauch heraus... nö geht nicht. Vielleicht hat ein anderer 
eine Idee.

von Stefan E. (sternst)


Lesenswert?

Tobi schrieb:
> Dieser wird für eine Timerroutine (Zeiteinheiten für Taskscheduling) in
> beiden Sections benötigt.

Dein Bootloader arbeitet mit Multitasking? Klingt ja recht 
abenteuerlich.

Und dieser Taskscheduler arbeitet also komplett ohne irgendwelchen 
globalen Variablen (oder statisch lokalen)? Wie soll das gehen? Wenn 
nämlich doch, dann ist das hier
> Kann ich das irgendwie erzwingen das dies auch in dem
> Bereich direkt vor dem Bootloader seinen Platz findet? Und dann von
> beiden Seiten aus angesprungen wird wenn ein Interrupt ausgelöst wird?
eher das kleinste deiner Probleme.

PS: Und dass deine ISR dann nicht ausgeführt werden kann, wenn gerade 
geflasht wird, ist dir doch auch klar, oder?

von Tobi (Gast)


Lesenswert?

Hy ucWriter ,

danke für deine schnelle Antwort.

Die Anwendung weis wo sich diese Routinen befinden indem ich dafür eine 
definierte Section deklariere. Das funktioniert auch schon.
Habe einen TCP/IP Stack so realisiert um diesen in beiden Bereichen 
verwenden zu können und nicht zweimal implementieren zu müssen.

Das funktioniert wie gesagt schon. Ich habe dazu auch das Linkerscript 
anpassen müssen. Vermutlich muss ich das mit ISR Problem so ähnlich 
machen.

Also wenn ich die ISR Routine nun sowohl im Bootloader als auch in der 
Anwendung genau gleich implementiere geht der Code.
Nur finde ich es wenig sinnvoll wenn ich Speicherplatz für zweimal die 
genau gleiche Routine implementieren muss und diese auch noch synchron 
halten muss.

Vermutlich muss man für die ISR Routine die ISR Sprung Tabelle in dem 
Anwendungscode manipulieren?!? Oder wie macht man sowas für ISRs am 
sinnvollsten?

Danke euch!!

von Tobi (Gast)


Lesenswert?

Hallo Stefan,

danke für deine Antwort.

Es geht nicht um ein Multitsking wie man es von Windows kennt, sondern 
eher um eine Zeitscheibenverteilung von mehreren Funktionen, so dass 
z.B. das Ethernet alle 1ms gepollt wird und die eigentliche Anwendung 
alle 50ms beispielsweise.

Globale Variablen gibt es auch. Diese werden in einer Struktur gesammelt 
auch beiden Bereichen über wiederum eine eigene Session bekannt gemacht. 
Die Adressen der gemeinsamen Funktionen werden in einem Array mit Hilfe 
von PROGMEM an einen so fest definierten Bereich geschrieben.

Das mit den Interrupts die nicht funktionieren während des flashen ist 
kein Problem, da die Anwendung über Ethernet im Bootloadermodus 
geflashed wird und die Interupts zu diesem Zeitpunkt in den 
Bootloderbereich gemappt sind.
Der Bootloader selbst mit Ethernet, Displaytrieber ,Timerroutinen usw. 
wird herkömlich geflashed. Wahrenddessen benötige ich keine Interrupts.

von Stefan E. (sternst)


Lesenswert?

Tobi schrieb:
> Globale Variablen gibt es auch. Diese werden in einer Struktur gesammelt
> auch beiden Bereichen über wiederum eine eigene Session bekannt gemacht.

Und wie wird der ISR diese "Session" bekannt gemacht?

Tobi schrieb:
> Das mit den Interrupts die nicht funktionieren während des flashen ist
> kein Problem, da die Anwendung über Ethernet im Bootloadermodus
> geflashed wird und die Interupts zu diesem Zeitpunkt in den
> Bootloderbereich gemappt sind.

Ich denke du hast nicht verstanden, was ich gemeint habe. Wenn im 
Applications-Bereich geflasht wird, kann das Flash des kompletten 
Bereichs nicht gelesen und damit auch kein Code von dort ausgeführt 
werden.

von Tobi (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Und wie wird der ISR diese "Session" bekannt gemacht?

genau das weis ich eben noch nicht.

wegen dem flashen... ja ich hab das auch mal wo gelesen das beim Flashen 
der gesamte Applikationsbereich nicht verwendet werden kann. Jedoch 
liegt dort der Ethernet-Code und der funktioniert auch weiterhin wenn er 
vom Bootloder verwendet wird während dieser die Applikation flashed.

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.