Forum: Mikrocontroller und Digitale Elektronik Cortex M3: atomare Ausführung von zwei Befehlen möglich?


von u979 (Gast)


Lesenswert?

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
von Klaus W. (mfgkw)


Lesenswert?

Wenn es keinen Maschinenbefehl dafür gibt, wird es der gcc auch nicht 
können.
Würde es denn in Assembler gehen?

von u979 (Gast)


Lesenswert?

hat nichts mit GCC zu tun, hab ich falsch abgelegt.
Ich dachte eher an die technische Möglichkeiten

von Seppel (Gast)


Lesenswert?

Warum nicht PRIMAS/FAULTMASK?

von Sven B. (sbo)


Lesenswert?

(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

von Maxxie (Gast)


Lesenswert?

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.

von Maxxie (Gast)


Lesenswert?

doh, wie konnte ich das fette "soll nciht verwendet werden übersehen, 
peinlich versteck

von Sven B. (sbo)


Lesenswert?

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?

von u979 (Gast)


Lesenswert?

Hi Sven

soll leider auch ohne BASEPRI sein.
Der Eingriff in den NVIC ist bei mir verboten. Daher das ganze.

von Sven B. (sbo)


Lesenswert?

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?!?!"

von Sven B. (sbo)


Lesenswert?

kann es vielleicht sein, das du aus dem "user" mode heraus interrupts 
ausschalten möchtest?

von Peter D. (peda)


Lesenswert?

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