Forum: Mikrocontroller und Digitale Elektronik SAM-4S, Atmel Studio: Wo ist delay.h, wo ist atomic.h?


von Alexxx (Gast)


Lesenswert?

Hallo,

habe bei den 8-Bittern schon oft delay_us(), atomic_block(){}
verwendet.
Für den SAM-4S finde ich die Bibliotheken nicht (verwende auch ASF).
- Gibt es irgendwo Ersatz für delay_us()?
- Wo finde ich atomic_block(RESTORESTATE){}? Das muss es doch auch für 
den SAM geben?

von Programmierer (Gast)


Lesenswert?

Das hier sollte für alle Cortex-M funktionieren:
Beitrag "atomic-lib für stm32"

Ein delay_us-Ersatz müsste mit Timern arbeiten und wäre daher stark von 
deiner Anwendung abhängig.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alexxx schrieb:

> Für den SAM-4S finde ich die Bibliotheken nicht (verwende auch ASF).
> - Gibt es irgendwo Ersatz für delay_us()?

Ich hatte mal einen Ersatz für die Cortex-M0+ geschrieben (SAMD21 etc.), 
aber ich denke, auf einem Cortex-M3 hat das kaum noch Sinn. Nimm lieber 
einen Timer.

> - Wo finde ich atomic_block(RESTORESTATE){}? Das muss es doch auch für
> den SAM geben?

Hat niemand als Bibliothek gebaut und geliefert, aber die Ideen kannst 
du dir natürlich aus der avr-libc klauen. Den Interruptstatus ermittelst 
du mit __get_PRIMASK(), die Interrupts werden mit __disable_irq() 
ausgeschaltet.
Den von __get_PRIMASK() erhaltenen Wert übergibst du am Ende dann einem 
__set_PRIMASK(). Also etwa so:
1
   int intstatus = __get_PRIMASK();
2
   __disable_irq();
3
   // interrupt-protected code goes here
4
   __set_PRIMASK(intstatus);

Allerdings bist du natürlich hier dahingehend komfortabler als auf einem 
8-Bitter, dass du bereits 32-bit-Integers ohnehin "atomic" im Zugriff 
hast.

von Programmierer (Gast)


Lesenswert?

So in der Art kann man ein "taktgenaues" Delay bauen:

https://github.com/Erlkoenig90/stm32delay/blob/master/src/mysleep.S

Das muss man aber auf die konkrete Anwendung "kalibrieren", d.h. die 
gewünschte Taktzahl auf die zugehörigen Iterationen umrechnen. Je nach 
Flash/RAM-Anbindung, Prescalern usw. kann das variieren, und 100% genau 
ist es nie. Im Beispiel wird gerechnet:
Iterationen = (Takte - 29) / 8
Der Code wird aus dem RAM ausgeführt um Flash-Caches zu umgehen.

von Alexxx (Gast)


Lesenswert?

@Jörg W
Vielen Dank für den Hinweis auf ...PRIMASK()!

>> ...Nimm lieber einen Timer.
Ich brauche 1-2 µs.   8-(

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alexxx schrieb:

>>> ...Nimm lieber einen Timer.
> Ich brauche 1-2 µs.   8-(

Auch dafür eignen sich Timer. Haben den Vorteil, dass du ohne 
irgendwelche Verrenkungen problemlos ein exaktes Delay bekommen kannst.

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.