www.mikrocontroller.net

Forum: GCC ISR Routine verschieben


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Tobi (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: ucWriter (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Tobi (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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!!

Autor: Tobi (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Tobi (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net