Forum: Mikrocontroller und Digitale Elektronik ARM LPC2148 Interrupts kurzfristig Ausschalten


von Franjo Rupcic (Gast)


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

??

von Dominic R. (dominic)


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

von Dominic R. (dominic)


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

von Dominic R. (dominic)


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.

von Franjo Rupcic (Gast)


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

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.