mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FreeRTOS, SWI, LPC2148 Problem..


Autor: Thomas Kusch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin am Anpassen des FreeRTOS an einen LPC2148 (Olimex) unter
CrossWorks (1.6B2). Habe jetzt aber ein Problem mit dem SWI..
So wie ich es verstanden habe verhaelt es sich so (bin noch
ARM-Frischling):
der SWI zeigt in der Startup auf sich selber

swi_handler:
  b swi_handler

Dieser wird dann in der portISR.c-Datei ueberschrieben mit

void vPortYieldProcessor( void ) __attribute__((interrupt("SWI"),
naked));

void vPortYieldProcessor( void )
{
  asm volatile ( "ADD    LR, LR, #4" );
  portSAVE_CONTEXT();
  vTaskSwitchContext();
  portRESTORE_CONTEXT();
}

Jedes taskYIELD() (ist ein Makro auf portYIELD() was wiederum ein Makro
auf   asm volatile ( "SWI" )  ist) loest diesen Interrupt aus.
Mein Problem ist, dass obwohl die portISR kompiliert wird, springt der
ARM bei einem taskYeld in den im Startup definierten leeren Handler und
bleibt dort stecken...

Ich habe irgendwie das Gefuehl, dass die INTs grundsaetzlich falsch
gelinkt werden. Die .map zeigt folgendes:

.init          0x00000200       0x1c ARM Flash
Debug/Philips_LPC210X_Startup.o
                0x00000204                undef_handler
                0x0000020c                pabort_handler
                0x00000210                dabort_handler
                0x00000208                swi_handler
                0x00000218                fiq_handler
                0x00000214                irq_handler
                0x0000021c                _init_end_ =
(_init_start_ + SIZEOF (.init))

Nach Hochladen des Programms stehen aber unter diesen Adressen ziemlich
unsinnige Werte:
0x00000200 eaffff8e eafffffe eafffffe eafffffe eafffffe eafffffe
Da haette ich die Einsprungadressen in die INT-Haendler erwartet...


Bin langsam mit meinem Latein am Ende :( Hat jemand eine Idee?
Ich waere sehr dankbar fuer jeden Hinweis!

Danke und Gruss,
Th.

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mein Problem ist, dass obwohl die portISR kompiliert wird, springt
>der ARM bei einem taskYeld in den im Startup definierten leeren
>Handler und bleibt dort stecken...

Ja, weil das mit dem "ueberschreiben" so nicht stimmt (zumindest bei
"Standard-gcc", keine Ahnung ob Rowley da etwas angepasst hat,
augenscheinlich nicht). Das Attribut stellt nicht den Exceptions-Vector
ein. Man muss bei gcc selbst dafuer sorgen, dass der SWI-Vector auf die
SWI-ISR zeigt. Wie das geht, wird aus dem mitgelieferten Beispielen
auch recht deutlich (boot.S aus einem LPC2106-gcc Beispiel):

...
  ldr   pc, _undf
  ldr   pc, _swi
  ldr   pc, _pabt
...
_swi:   .word vPortYieldProcessor
...

Das Prinzip einfach so uebernehmen (evtl. noch ein extern vPort...
ergaenzen).

HTH
Martin Thomas

Autor: Thomas Kusch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin.

Danke sehr fuer die Antwort! Werde es am Abend ausprobieren.

Gruss,
Th.

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.