Hi, ich suche eine Lösung zum globalen Interrupt sperren. Dazu sind zwei 32-Bit Register zu schreiben. Das ganze soll aber möglichst atomar ablaufen, d.h. in einem Prozessorbefehl. Ist leider auch nur eine 32 Bit Maschine (ARM Cortex M3). (Die Lösung über PRIMAS/FAULTMASK soll hier nicht angewendet werden) Geht es dennoch irgendwie?
:
Verschoben durch Admin
Wenn es keinen Maschinenbefehl dafür gibt, wird es der gcc auch nicht können. Würde es denn in Assembler gehen?
hat nichts mit GCC zu tun, hab ich falsch abgelegt. Ich dachte eher an die technische Möglichkeiten
(Die Lösung über PRIMAS/FAULTMASK soll hier nicht angewendet werden) :D als wenn man bei AVRs sagt, mach interrupts aus, aber lösche nicht das I bit :D
Hmm, psr flags i und f setzen, sollte das doch erledigen.
1 | MRS r0,cpsr |
2 | ORR r1,r0,#C0 |
3 | MSR cpsr_f,r1 |
4 | [...] |
5 | MSR cpsr_f,r0 |
Sollte das doch machen, oder? Vor dem ersten MSR darf doch gerne unterbrochen werden. MSR selber ist atomar, danach geschehen keine irqs/fiqs bis zum zurücksetzen beim zweiten MSR. In [...] kannst eigentlich nur durch Faults(Exceptions) unterbrochen werden.
doh, wie konnte ich das fette "soll nciht verwendet werden übersehen, peinlich versteck
du kannst dies aber über BASEPRI machen, wenn die hausaufgabe PRIMASK und FAULTMASK verbietet ;) ...dabei musst du dann nur darauf achten, wenn du deine interrupt prioritäten selbst verwaltest, das du mit der höchsten prio nicht mit nummer 0 beginnst, sondern 1 (je niedriger die nummer, umso höher die priorität) wenn du in BASEPRI 0 schreibst, dann lässt er alles passieren. und wenn du eine zahl (zb: 1 ;) ) reinschreibst, dann "disabled" er alle interrupts mit dieser prioritätsstufe UND alle mit niedrigererer Prio (höhere nummer)... mit der 0 wären dann wieder alle mit dabei ;) ... ist das in etwa was du suchst?
Hi Sven soll leider auch ohne BASEPRI sein. Der Eingriff in den NVIC ist bei mir verboten. Daher das ganze.
moment mal, PRIMASK, FAULTMASK und BASEPRI gehören NICHT zur NVIC, es sind Prozessorregister... diese sind nur über die befehle MSR und MRS zugreifbar. hat es vielleicht etwas damit zu tun, das du diese assembler befehle nicht benutzen kannst? das problem das du hier ansprichst ist wie "heb den stein auf, bewege ihn aber nicht?!?!"
kann es vielleicht sein, das du aus dem "user" mode heraus interrupts ausschalten möchtest?
u979 schrieb: > ich suche eine Lösung zum globalen Interrupt sperren. > Dazu sind zwei 32-Bit Register zu schreiben. > Das ganze soll aber möglichst atomar ablaufen, d.h. in einem > Prozessorbefehl. Warum? Ein Interrupt hat alle Register zu sichern, die er selber verwendet. Es ist also schnurzpipegal, wann ein Interrupt zuschlägt. Nach dem Interrupt haben beide Register den gewünschten Wert, auch wenn er mittendrin zuschlägt. Atomar müssen nur Zugriffe auf RAM-Variablen oder IO-Ressourcen sein, die Interrupt und Main gemeinsam verwenden. Peter
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.