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
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?!
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.
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
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
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.
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
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
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
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
Um war für einen Controller geht es eigentlich? Exakt wohin zeigt der Return-PC beim Hardfault?
Es handelt sich um einen LPC1768 (Cortex M3) der Firma NXP. Wohin der PC genau zeigt habe ich leider nicht geschaut. Mfg Harald
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.