Forum: Mikrocontroller und Digitale Elektronik Probleme mit ARM Cortex M3


von Fresh (Gast)


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

von (prx) A. K. (prx)


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?!

von (prx) A. K. (prx)


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.

von Fresh (Gast)


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.
1
OS_CPU_SR_Save:
2
    MRS     R0, PRIMASK                                         // Set prio int mask to mask all (except faults)
3
    CPSID   I
4
    BX      LR

Danke im vorhinein für alle Antworten.

Mfg Fresh

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Fresh schrieb:
1
OS_CPU_SR_Save:
2
    MRS     R0, PRIMASK                                         // Set prio int mask to mask all (except faults)
3
    CPSID   I
4
    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

von (prx) A. K. (prx)


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.

von 900ss (900ss)


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

von fresh (Gast)


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

von Fresh (Gast)


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

von Fresh (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

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

von Fresh (Gast)


Lesenswert?

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

Mfg Harald

von fresh (Gast)


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

von Steff (Gast)


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.

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.