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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren