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 ??
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.