www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM7TDMI-S (LPC2468) - GCC: wie werden 64-Bit Operationen umgesetzt


Autor: Dirk Steffens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum!

Ich habe bereits die Suchfunktion bemüht, aber leider nichts 
verwertbares gefunden. Meine Frage betrifft die Umsetzung von 
64-Bit-Operationen durch den GCC-arm-elf auf der ARM7TDMI-S Plattform. 
Ich bin durch die Verwendung von Zeitstempeln (Mikrosekunden seit epoch) 
gezwungen, alle 100us eine 64-Bit Operation in einer ISR durchzuführen. 
Wie teuer wird das?

Beispiel:
uint64_t timestamp;

void isr() __INT__;

//alle 100us
void isr(){
   T1IR=0x1;          // Clear the Timer interrupt
   SWITCH_IRQ_TO_SYS;
   timestamp+=100;
   SWITCH_SYS_TO_IRQ;
   VICVectAddr =0xff; // Update the VIC
}

Ich habe den GCC-arm-elf noch nie von Hand bemüht, sonst könnte ich ja 
einfach mal den resultierenden Assembler-Code betrachten.

Ich freue mich über jeden Hinweis. Wie sieht es aus mit der Performance?
geht das gut?

Gruß,
Dirk Steffens

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist völlig harmlos. Sind 2 Befehle wo vorher einer reichte.

Frag dich lieber, ob es für diese Zwerg-ISR nötig ist, in den 
SYS-Kontext umzuschalten. Das könnte teurer sein als die Timestamp, und 
ist hier garantiert überflüssig.

Was du freilich nicht vergessen solltest: "volatile", und die Tatsache, 
dass Zugriffe auf die beiden Worte der Timestamp nicht atomar sind.

Autor: Dirk Steffens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen vielen Dank für die schnelle Antwort!
>Ist völlig harmlos. Sind 2 Befehle wo vorher einer reichte.
Ah, okay, ich vermute das ist dann einmal add und einmal adc. Wie schön!

>Frag dich lieber, ob es für diese Zwerg-ISR nötig ist, in den
>SYS-Kontext umzuschalten. Das könnte teurer sein als die Timestamp, und
>ist hier garantiert überflüssig.
Ich habe noch 3 andere ISRs, unter anderem Ethernet und noch zwei Timer. 
Und Timing ist verdammt wichtig auf diesem System.

>Was du freilich nicht vergessen solltest: "volatile", und die Tatsache,
>dass Zugriffe auf die beiden Worte der Timestamp nicht atomar sind.
Ich werde wahrscheinlich die Zugriffe auf den Zeitstempel an einer 
einzigen Stelle durchführen, etwa so:
volatile uint64_t timestamp;

void isr() __INT__;

void isr(){
   T1IR=0x1;          // Clear the Timer interrupt
   SWITCH_IRQ_TO_SYS;
   timestamp+=100;

   //der einzige Zugriff auf den (momentan konsistenten) Zeitstempel
   TagEventsWithTimestamps();

   SWITCH_SYS_TO_IRQ;
   VICVectAddr =0xff; // Update the VIC
}
Ich glaube, volatile hilft mir so eventuell auch nicht viel weiter, wenn 
ich außerhalb der ISR auf den Wert zugreifen möchte.

Ich habe im "ARM architechtural Reference Manual" 
http://www.arm.com/miscPDFs/14128.pdf folgendes gelesen:
A3.13 Semaphore instructions
The ARM instruction set has two semaphore instructions:
• Swap (SWP)
• Swap Byte (SWPB).
These instructions are provided for process synchronization. Both instructions generate an atomic load and
store operation, allowing a memory semaphore to be loaded and altered without interruption.
SWP and SWPB have a single addressing mode, whose address is the contents of a register. Separate registers
are used to specify the value to store and the destination of the load. If the same register is specified for both
of these, SWP exchanges the value in the register and the value in memory.
The semaphore instructions do not provide a compare and conditional write facility. If wanted, this must be done explicitly.

Gibt es für Semaphoren  irgendeine Bibliothek die ich verwenden könnte? 
oder irgend einen netten inline-asm - Schnipsel?

Die Beispiele aus dem Manual verstehe ich nicht so richtig...
Ich kenne sowas mit einer test-and-set - Instruktion.

Gruß,
Dirk Steffens

Autor: Dirk Steffens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unter http://gcc.gnu.org/ml/libstdc++/2002-10/msg00043.html ist eine 
nette Diskussion über diese Instruktionen. Das Lesen des gesammten 
Threads lohnt sich :) So richtig weitergebracht hat es mich leider 
nicht.

In meinem include - Verzeichnis habe ich leider keine "semaphore.h" 
gefunden. Es gibt allerdings "atomicity.h", "atomic_word.h" und 
"pthread.h". Die Mutexe aus pthread habe ich schon mal unter Linux 
verwendet. Vielleicht klappt's ja damit. Falls jemand eine Anregung hat 
-> immer her damit :D

sodenn,
Gute Nacht!
Dirk Steffens

Autor: Dirk Steffens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beitrag "ARM7: Critical Section bzw. Mutex programmieren?" betrifft mich wohl 
eher. Wenn ich davon ausgehe, daß das Lesen des von "timestamp" 
innerhalb einer anderen ISR stattfindet, könnte ich vorrübergehend deren 
ISR ausschalten. Das könnte mich etwas weiterbringen. Die Umschalten mit 
SWITCH_IRQ_TO_SYS etc. macht da allerdings Probleme, wenn gerade etwas 
"nested" ausgeführt wird. Die Routine könnte gerade im kritischen 
Abschnitt sein -> sprich: die eine Hälfte gelesen haben, dann von der 
höher priorisierten Timer-Funktion unterbrochen worden sein, und danach 
die andere Hälfte lesen-> PENG.

Was mache ich nur?
Ich glaube, ich bleibe bei der Möglichkeit, alle Zugriffe auf den 
Zeitstempel innerhalb der ISR zu belassen. Meine Liste mit Ereignissen 
wird dann beim nächsten Aufruf der Timer-ISR mit gültigen Zeitstempeln 
versehen.

Gruß,
Dirk Steffens

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.