SAM-4S, Atmel Studio: Wo ist delay.h, wo ist atomic.h?

Gast #6138398
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?
Moderator Persönliche Seite #6138413
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.
Gast #6138438
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren