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
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.
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?
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!!
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.