www.mikrocontroller.net

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


Autor: u979 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: u979 (Gast)
Datum:

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

Autor: Seppel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nicht PRIMAS/FAULTMASK?

Autor: Sven Bohner (sbo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maxxie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, psr flags i und f setzen, sollte das doch erledigen.
MRS r0,cpsr
ORR r1,r0,#C0
MSR cpsr_f,r1
[...]
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.

Autor: Maxxie (Gast)
Datum:

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

Autor: Sven Bohner (sbo)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: u979 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Sven

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

Autor: Sven Bohner (sbo)
Datum:

Bewertung
0 lesenswert
nicht 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?!?!"

Autor: Sven Bohner (sbo)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.