mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit ARM Cortex M3


Autor: Fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich versuche gerade das RTOS µCos auf einen ARM Cortex M3 zum laufen zu 
bringen. as Asugangsbasis verwende ich eine Portierung für einen ARM 7 
und leider verwendet der dei Befehle des ARM modes welchen der Cortex M3 
nicht kann. Gibt es nun eine Möglichkeit aus den ASM Befehlen die im arm 
mode vorhanden sind thumb befehel zu bekommen? Oder vielleicht hat hier 
ja jemand die Datei "os_cpu_a.s" von µCos für den Cortex und könnte sie 
mir schicken!?

Mfg Fresh

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fresh schrieb:

> Ich versuche gerade das RTOS µCos auf einen ARM Cortex M3 zum laufen zu
> bringen. as Asugangsbasis verwende ich eine Portierung für einen ARM 7

Hinsichtlich des für ein RTOS relevanten Systemmodells sind ARM7 und CM3 
sehr verschieden, eine Portierung ist folglich nicht trivial. So ist 
beispielsweise bei den ARM7 das Task-Switching üblicherweise verbunden 
mit dem Prolog/Epilog-Code der Interrupt-Handler oder Teil eines 
zentralen Interrupt-Dispatchers, bei den Cortexen hingegen bleiben die 
Handler weitgehend neutral und der Kontext-Switch läuft über den PendSV 
Interrupt.

Laut Webseite wird der CM3 doch sowieso schon unterstützt?!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NB: Ich habe mal kurz in die Doku der existierenden µCos Implementierung 
reingesehen. Ich würde sie als deutlich suboptimal ansehen, da sie 
RTOS-neutrale Interrupts im Rahmen des von Critical Sections komplett 
ausschliesst, also Interrupts die keine RTOS-Funktionen verwenden. Als 
Folge davon leidet die Interrupt-Reaktionszeit dementsprechend. Bei den 
CM3 ist das aber durchaus nicht nötig.

Aber immerhin sind sie konsequent. Die ARM7 Implementierung rasiert die 
FIQs genauso radikal weg und macht sie damit zur Schnecke.

Autor: Fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

So ich bin nun auf die CM3 portierung umgestiegen und es geht zumindest 
einmal zu compilieren allerding stürzt er mir beim OSInit ab. Habe mir 
das dann genauer angesehen und musste feststellen das er beim erzeugen 
des IdleTask abstürzt und zwar beim Befehl OS_ENTER_CRITICAL(). Dieser 
führt einen in ASM geschriebenen Code durch welcher das Statusregister 
sichert.
OS_CPU_SR_Save:
    MRS     R0, PRIMASK                                         // Set prio int mask to mask all (except faults)
    CPSID   I
    BX      LR

Danke im vorhinein für alle Antworten.

Mfg Fresh

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fresh schrieb:
OS_CPU_SR_Save:
    MRS     R0, PRIMASK                                         // Set prio int mask to mask all (except faults)
    CPSID   I
    BX      LR

Das MRS setzt r0 auf den aktuellen Wert von PRIMASK. Der Kommentar ist 
wahrscheinlich nach dem copy/paste nicht geändert worden. Erst der 
nächste Befehl deaktiviert die Interrupts. Die Funktion gibt den Zustand 
der Maskierung zurück, der vor Aufruf von OS_CPU_SR_Save aktuell war. 
Damit kann man später den alten Zustand wieder herstellen, anstatt auf 
doof die Interrupts wieder anzuschalten.

--
Marcus

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Startup-Code den Prozessor im nichtprivilegierten Modus 
entlässt, dann wird o.A. Code auf die Nase fallen.

Es wäre übrigens hilfreich, das "stürzt ab" etwas zu präzisieren.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den STM32 Port für IAR von der Micrium Website runter geladen 
und für GNU GCC portiert. Er funktioniert scheinbar recht gut. Habe 
keine Merkwürdigkeiten bisher und läuft seit etwas über einem Jahr in 
einem priv. Projekt. Wird aber nicht sonderlich gestresst das Ganze ;-) 
Ein paar Tasks und Interrupts. Aber das ist ja egal, das Task switching 
funktioniert, IRQs funktionieren, Timer funktionieren. Fertig. Alles 
andere sollte vom Port nicht abhängen, wenn ich nicht irre.

Gib mir deine Mailadresse und ich schick dir den Port bis spätestens 
Sonntagabend. Weiß nicht wann ich es schaffe.

900ss

Autor: fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Erstmals danke für die Antworten. Wenn ich das nun richtig verstanden 
habe muss ich im Startup Code den privilegierten Modus aktivieren muss 
und dann könnte es gehen sofern kein weiterer Fehler drin ist?! Wenn ja 
kann mir jemand einen Tipp geben wie das geht?

Als Fehler kommt immer ein Hardfault!

Mfg fresh

Autor: Fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Habe jetzt nachgelesen und gelernt das es einen Threadmosus und einen 
Handlemodus gibt und wenn es stimmt muss ich mein OS im Handlemodus 
ausführen oder? Aber ich habe noch nicht herausgefunden wie ich den 
Cortex m3 in diesen modus bringen. Ich lese immer nur das er selber 
wechselt. Danke im vorhinein für alle Tipps und Antworten.

Mfg Harald

Autor: Fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Sorry für die vielen posts hintereinander aber ich habe gerade ein paar 
weitere Informationen gesammelt. Also wenn ich mit das Control register 
anzeigen lasse steht 0x00 drinen was laut Beschreibung bedeuted das der 
Threadmode auch im priviligierten Modus läuft. Daher sollte er ja 
eigentlich nicht abstürzen. Wenn man dann nach den Absturz schaut steht 
das es ein HardFault ist und das das Instruction access violation flag 
gesetzt ist. Vielleicht hat noch jemand einen Tipp was ich noch tun kann 
um das System zum laufen zu bringen.

Mfg Harald

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um war für einen Controller geht es eigentlich?
Exakt wohin zeigt der Return-PC beim Hardfault?

Autor: Fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es handelt sich um einen LPC1768 (Cortex M3) der Firma NXP. Wohin der PC 
genau zeigt habe ich leider nicht geschaut.

Mfg Harald

Autor: fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Hat wirklich keiner mehr einen Tipp für mich was ich noch tun kann?! 
Habe leider im Internet auch nichts dazu gefunden.

Mfg Harald

Autor: Steff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

im user manual vom controller auf Seite 727 steht es beschrieben. Zuerst 
musst du in den handler mode wechseln mit einem supervisor call (SVC) 
und dann kannst du das CONTROL register modifizieren damit die software 
im privileged mode arbeitet.

Bitte posten wenn funktioniert hat.

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.