ARM LPC2148 Interrupts kurzfristig Ausschalten

Gast #409754
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

??
#409755
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
Gast #409758
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.