mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM LPC2148 Interrupts kurzfristig Ausschalten


Autor: Franjo Rupcic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hätte mal ne Frage. Arbeite am OLIMEX LPC2148 Evalboard und möchte für
Kritische Bereiche "Critical Sections" wissen wie man die Interrupts
kurzfristig sperren kann.

Mit bekannte Assemblerbefehle wie CLI/SEI oder DI und EI kennt der Arm
ja leider nicht, und soweit ich weiß hab ich auf das CPSR (Prozessor
Status Wort) im UserMode keinen zugriff um dieses zu sichern und
kurzfristig das F & I Bit auf 1 zu setzen.

Hab nen Assembler Code gefunden doch leider kennt die LPC214x.h von
Keil die Adresse vom CPSR nicht und ich finde sie selber auch nicht.


Assembler Code:

/*******************************************/
/* disable interrupts and return old mask  */
/*******************************************/
__asm
{
  MRS    R0,cpsr
  orr r1,r0,#PSR_I_BIT
  msr cpsr_c,r1
  bx lr
}


****************************************
** restore interrupt mask
****************************************

__asm
{
     and r0,r0,#PSR_I_BIT
     mrs r1,cpsr
     bic r1,r1,#PSR_I_BIT
     orr r1,r1,r0
     msr cpsr_c,r1
     bx lr
}

Also meine Frage: wie kann ich auf das cpsr zugreifen um zum Beispiel
einen Context Switch zu sichern in einer Critial Section
durchzuführen?? Kenn mich mit den Modis vom ARM leider noch nicht so
gut aus, also falls ich da nachhacken sollte bitte ebenfalls bescheid
sagen.

Ansonsten noch die Frage:
Wie kann ich in Assembler beim LPC2148 den StackPointer auf eine andere
Adresse zeigen lassen??

MOV  R0,pArray
MOV  SP,R0

??

Autor: Dominic R. (dominic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das CPSR hat keine Adresse - es ist ein Prozessor Register, und wird mit
MRS/MSR in general-purpose Register kopiert bzw. von dort geladen. Genau
das macht der Code, den du gepasted hast:

Kopiere CPSR nach R0:
  mrs r0,cpsr
R1 = R0 | I-Bit:
  orr r1,r0, #PSR_I_BIT
Lade CPSR mit R1:
  msr cpsr_c,r1
Return:
  bx lr

Anschliessend enthält R0 (Standard Register für Rückgabewert) den
"alten" Inhalt des CPSR.

Wenn du im User Mode bist musst du via SWI einen
Software-Interrupt/Systemcall auslösen, um in einen privilegierten
Modus zu wechseln, und den Kontext-Wechsel dort ausführen.

Gruss,

Dominic

Autor: Dominic R. (dominic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bevor mich hier jemand korrigiert, mach ich das selbst:
Lade CPSR mit R1:
  msr cpsr_c,r1

ist eigentlich falsch, tatsächlich werden nur die ersten acht Bit des
CPSR geladen (die "control bits", daher das cpsr_c), also I, F, T und
M[4-0].

Gruss,

Dominic

Autor: Dominic R. (dominic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, und such doch bitte das "ARM Architecture Reference Manual"
(ARM ARM) - dort wird das Programmer's Model erklärt. Wie man das
finden kann steht in mehr als einem Thread in diesem Forum.

Autor: Franjo Rupcic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar werd ich machen. Ansonsten hab ich bei der Homepage von
µC/0S II ne Portierung für den LPC2138 gefunden. Dort sollte man ja
auch den Context Switch etc für den Controller finden.

Für heut mach ich Feierabend und werd mich dann morgen damit
auseinandersetzen und wenn ich es geschafft habe den sourcecode hier
posten.

Ansonsten ein Danke an Dominic

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.